// MetaFileWnd.Cpp : implementation file // #include "StdAfx.H" #include "TestCon.H" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMetaFileWnd CMetaFileWnd::CMetaFileWnd() : m_hMetaFile( NULL ) { } CMetaFileWnd::~CMetaFileWnd() { if( m_hMetaFile != NULL ) { DeleteMetaFile( m_hMetaFile ); } } BEGIN_MESSAGE_MAP(CMetaFileWnd, CFrameWnd) //{{AFX_MSG_MAP(CMetaFileWnd) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() STDAPI_(HDC) OleStdCreateDC(DVTARGETDEVICE FAR* ptd) { HDC hdc=NULL; LPDEVNAMES lpDevNames; LPDEVMODE lpDevMode; LPTSTR lpszDriverName; LPTSTR lpszDeviceName; LPTSTR lpszPortName; if (ptd == NULL) { hdc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); goto errReturn; } lpDevNames = (LPDEVNAMES) ptd; // offset for size field if (ptd->tdExtDevmodeOffset == 0) { lpDevMode = NULL; }else{ lpDevMode = (LPDEVMODE) ((LPTSTR)ptd + ptd->tdExtDevmodeOffset); } lpszDriverName = (LPTSTR) lpDevNames + ptd->tdDriverNameOffset; lpszDeviceName = (LPTSTR) lpDevNames + ptd->tdDeviceNameOffset; lpszPortName = (LPTSTR) lpDevNames + ptd->tdPortNameOffset; hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode); errReturn: return hdc; } void CMetaFileWnd::SetObject( IUnknown* pObject ) { SIZE size; RECTL rect; BOOL tSuccess; CMetaFileDC dc; HDC hAttribDC; _ASSERTE( pObject != NULL ); m_pOleObject = pObject; m_pViewObject = pObject; m_pOleObject->GetExtent( DVASPECT_CONTENT, &size ); tSuccess = dc.Create(); if( !tSuccess ) { return; } hAttribDC = ::OleStdCreateDC( NULL ); dc.SetAttribDC( hAttribDC ); m_size.cx = size.cx; m_size.cy = size.cy; dc.HIMETRICtoDP( &m_size ); rect.left = 0; rect.top = 0; rect.right = m_size.cx; rect.bottom = m_size.cy; m_pViewObject->Draw( DVASPECT_CONTENT, -1, NULL, NULL, hAttribDC, dc.m_hDC, &rect, &rect, NULL, 0 ); dc.SetAttribDC( NULL ); DeleteDC( hAttribDC ); m_hMetaFile = dc.Close(); if( m_hMetaFile == NULL ) { return; } InvalidateRect( NULL ); } ///////////////////////////////////////////////////////////////////////////// // CMetaFileWnd message handlers void CMetaFileWnd::OnPaint() { CRect rect; CPaintDC dc( this ); // device context for painting if( m_hMetaFile != NULL ) { GetClientRect( &rect ); dc.SetMapMode( MM_ANISOTROPIC ); dc.SetWindowOrg( 0, 0 ); dc.SetWindowExt( m_size ); dc.SetViewportOrg( 0, 0 ); dc.SetViewportExt( rect.right, rect.bottom ); dc.PlayMetaFile( m_hMetaFile ); } }