home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / ole / tstcon / mfilewnd.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-27  |  2.8 KB  |  137 lines

  1. // MetaFileWnd.Cpp : implementation file
  2. //
  3.  
  4. #include "StdAfx.H"
  5. #include "TestCon.H"
  6.  
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12.  
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CMetaFileWnd
  15.  
  16. CMetaFileWnd::CMetaFileWnd() :
  17.    m_hMetaFile( NULL )
  18. {
  19. }
  20.  
  21. CMetaFileWnd::~CMetaFileWnd()
  22. {
  23.    if( m_hMetaFile != NULL )
  24.    {
  25.       DeleteMetaFile( m_hMetaFile );
  26.    }
  27. }
  28.  
  29.  
  30. BEGIN_MESSAGE_MAP(CMetaFileWnd, CFrameWnd)
  31.     //{{AFX_MSG_MAP(CMetaFileWnd)
  32.     ON_WM_PAINT()
  33.     //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35.  
  36.  
  37. STDAPI_(HDC) OleStdCreateDC(DVTARGETDEVICE FAR* ptd)
  38. {
  39.     HDC hdc=NULL;
  40.     LPDEVNAMES lpDevNames;
  41.     LPDEVMODE lpDevMode;
  42.     LPTSTR lpszDriverName;
  43.     LPTSTR lpszDeviceName;
  44.     LPTSTR lpszPortName;
  45.  
  46.     if (ptd == NULL) {
  47.         hdc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
  48.         goto errReturn;
  49.     }
  50.  
  51.     lpDevNames = (LPDEVNAMES) ptd; // offset for size field
  52.  
  53.     if (ptd->tdExtDevmodeOffset == 0) {
  54.         lpDevMode = NULL;
  55.     }else{
  56.         lpDevMode  = (LPDEVMODE) ((LPTSTR)ptd + ptd->tdExtDevmodeOffset);
  57.     }
  58.  
  59.     lpszDriverName = (LPTSTR) lpDevNames + ptd->tdDriverNameOffset;
  60.     lpszDeviceName = (LPTSTR) lpDevNames + ptd->tdDeviceNameOffset;
  61.     lpszPortName   = (LPTSTR) lpDevNames + ptd->tdPortNameOffset;
  62.  
  63.     hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
  64.  
  65. errReturn:
  66.     return hdc;
  67. }
  68.  
  69.  
  70. void CMetaFileWnd::SetObject( IUnknown* pObject )
  71. {
  72.    SIZE size;
  73.    RECTL rect;
  74.    BOOL tSuccess;
  75.    CMetaFileDC dc;
  76.    HDC hAttribDC;
  77.  
  78.    _ASSERTE( pObject != NULL );
  79.  
  80.    m_pOleObject = pObject;
  81.    m_pViewObject = pObject;
  82.  
  83.    m_pOleObject->GetExtent( DVASPECT_CONTENT, &size );
  84.  
  85.    tSuccess = dc.Create();
  86.    if( !tSuccess )
  87.    {
  88.       return;
  89.    }
  90.  
  91.    hAttribDC = ::OleStdCreateDC( NULL );
  92.    dc.SetAttribDC( hAttribDC );
  93.  
  94.    m_size.cx = size.cx;
  95.    m_size.cy = size.cy;
  96.    dc.HIMETRICtoDP( &m_size );
  97.  
  98.    rect.left = 0;
  99.    rect.top = 0;
  100.    rect.right = m_size.cx;
  101.    rect.bottom = m_size.cy;
  102.  
  103.    m_pViewObject->Draw( DVASPECT_CONTENT, -1, NULL, NULL, hAttribDC, dc.m_hDC,
  104.       &rect, &rect, NULL, 0 );
  105.  
  106.    dc.SetAttribDC( NULL );
  107.    DeleteDC( hAttribDC );
  108.  
  109.    m_hMetaFile = dc.Close();
  110.    if( m_hMetaFile == NULL )
  111.    {
  112.       return;
  113.    }
  114.  
  115.    InvalidateRect( NULL );
  116. }
  117.  
  118. /////////////////////////////////////////////////////////////////////////////
  119. // CMetaFileWnd message handlers
  120.  
  121. void CMetaFileWnd::OnPaint()
  122. {
  123.    CRect rect;
  124.     CPaintDC dc( this ); // device context for painting
  125.  
  126.    if( m_hMetaFile != NULL )
  127.    {
  128.       GetClientRect( &rect );
  129.       dc.SetMapMode( MM_ANISOTROPIC );
  130.       dc.SetWindowOrg( 0, 0 );
  131.       dc.SetWindowExt( m_size );
  132.       dc.SetViewportOrg( 0, 0 );
  133.       dc.SetViewportExt( rect.right, rect.bottom );
  134.       dc.PlayMetaFile( m_hMetaFile );
  135.    }
  136. }
  137.