home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / include / afxctl.h < prev    next >
C/C++ Source or Header  |  1998-06-16  |  67KB  |  1,970 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. /////////////////////////////////////////////////////////////////////////////
  12. // AFXCTL.H - MFC OLE Control support
  13.  
  14. #ifndef __AFXCTL_H__
  15. #define __AFXCTL_H__
  16.  
  17. // make sure afxole.h is included first
  18. #ifndef __AFXOLE_H__
  19.     #include <afxole.h>
  20. #endif
  21.  
  22. #ifdef _AFX_MINREBUILD
  23. #pragma component(minrebuild, off)
  24. #endif
  25. #ifndef _AFX_FULLTYPEINFO
  26. #pragma component(mintypeinfo, on)
  27. #endif
  28.  
  29. /////////////////////////////////////////////////////////////////////////////
  30. // Classes declared in this file
  31.  
  32. //CWinApp
  33.     class COleControlModule;        // Module housekeeping for an .OCX
  34.  
  35. class CFontHolder;                  // For manipulating font objects
  36. class CPictureHolder;               // For manipulating picture objects
  37.  
  38. //CWnd
  39.     class COleControl;              // OLE Control
  40.  
  41. //CDialog
  42.     class COlePropertyPage;         // OLE Property page
  43.         class CStockPropPage;
  44.             class CColorPropPage;
  45.             class CFontPropPage;
  46.             class CPicturePropPage;
  47.  
  48. class CPropExchange;                // Abstract base for property exchange
  49.  
  50. //CAsyncMonikerFile
  51.     class CDataPathProperty;        // Asynchronous properties for OLE Controls
  52.         class CCachedDataPathProperty;  // Cached asynchronous properties for OLE Controls
  53.  
  54. /////////////////////////////////////////////////////////////////////////////
  55. // Set structure packing
  56.  
  57. #ifdef _AFX_PACKING
  58. #pragma pack(push, _AFX_PACKING)
  59. #endif
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. // MFC data definition for data exported from the runtime DLL
  63.  
  64. #undef AFX_DATA
  65. #define AFX_DATA AFX_OLE_DATA
  66.  
  67. /////////////////////////////////////////////////////////////////////////////
  68. // COleControlModule - base class for .OCX module
  69. //  This object is statically linked into the control.
  70.  
  71. class COleControlModule : public CWinApp
  72. {
  73.     DECLARE_DYNAMIC(COleControlModule)
  74. public:
  75.     virtual BOOL InitInstance();
  76.     virtual int ExitInstance();
  77. };
  78.  
  79. /////////////////////////////////////////////////////////////////////////////
  80. //  Module state macro
  81.  
  82. #define AfxGetControlModuleContext  AfxGetStaticModuleState
  83. #define _afxModuleAddrThis AfxGetStaticModuleState()
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // Connection helper functions
  87.  
  88. BOOL AFXAPI AfxConnectionAdvise(LPUNKNOWN pUnkSrc, REFIID iid,
  89.     LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD* pdwCookie);
  90.  
  91. BOOL AFXAPI AfxConnectionUnadvise(LPUNKNOWN pUnkSrc, REFIID iid,
  92.     LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD dwCookie);
  93.  
  94. /////////////////////////////////////////////////////////////////////////////
  95. // Event maps
  96.  
  97. enum AFX_EVENTMAP_FLAGS
  98. {
  99.     afxEventCustom = 0,
  100.     afxEventStock = 1,
  101. };
  102.  
  103. struct AFX_EVENTMAP_ENTRY
  104. {
  105.     AFX_EVENTMAP_FLAGS flags;
  106.     DISPID dispid;
  107.     LPCTSTR pszName;
  108.     LPCSTR lpszParams;
  109. };
  110.  
  111. struct AFX_EVENTMAP
  112. {
  113.     const AFX_EVENTMAP* lpBaseEventMap;
  114.     const AFX_EVENTMAP_ENTRY* lpEntries;
  115.     DWORD* lpStockEventMask;
  116. };
  117.  
  118. #define DECLARE_EVENT_MAP() \
  119. private: \
  120.     static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[]; \
  121.     static DWORD _dwStockEventMask; \
  122. protected: \
  123.     static const AFX_DATA AFX_EVENTMAP eventMap; \
  124.     virtual const AFX_EVENTMAP* GetEventMap() const;
  125.  
  126. #define BEGIN_EVENT_MAP(theClass, baseClass) \
  127.     const AFX_EVENTMAP* theClass::GetEventMap() const \
  128.         { return &eventMap; } \
  129.     const AFX_DATADEF AFX_EVENTMAP theClass::eventMap = \
  130.         { &(baseClass::eventMap), theClass::_eventEntries, \
  131.             &theClass::_dwStockEventMask }; \
  132.     AFX_COMDAT DWORD theClass::_dwStockEventMask = (DWORD)-1; \
  133.     AFX_COMDAT const AFX_DATADEF AFX_EVENTMAP_ENTRY theClass::_eventEntries[] = \
  134.     {
  135.  
  136. #define END_EVENT_MAP() \
  137.         { afxEventCustom, DISPID_UNKNOWN, NULL, NULL }, \
  138.     };
  139.  
  140. #define EVENT_CUSTOM(pszName, pfnFire, vtsParams) \
  141.     { afxEventCustom, DISPID_UNKNOWN, _T(pszName), vtsParams },
  142.  
  143. #define EVENT_CUSTOM_ID(pszName, dispid, pfnFire, vtsParams) \
  144.     { afxEventCustom, dispid, _T(pszName), vtsParams },
  145.  
  146. #define EVENT_PARAM(vtsParams) (BYTE*)(vtsParams)
  147.  
  148. /////////////////////////////////////////////////////////////////////////////
  149. // Stock events
  150.  
  151. #define EVENT_STOCK_CLICK() \
  152.     { afxEventStock, DISPID_CLICK, _T("Click"), VTS_NONE },
  153.  
  154. #define EVENT_STOCK_DBLCLICK() \
  155.     { afxEventStock, DISPID_DBLCLICK, _T("DblClick"), VTS_NONE },
  156.  
  157. #define EVENT_STOCK_KEYDOWN() \
  158.     { afxEventStock, DISPID_KEYDOWN, _T("KeyDown"), VTS_PI2 VTS_I2 },
  159.  
  160. #define EVENT_STOCK_KEYPRESS() \
  161.     { afxEventStock, DISPID_KEYPRESS, _T("KeyPress"), VTS_PI2 },
  162.  
  163. #define EVENT_STOCK_KEYUP() \
  164.     { afxEventStock, DISPID_KEYUP, _T("KeyUp"), VTS_PI2 VTS_I2 },
  165.  
  166. #define EVENT_STOCK_MOUSEDOWN() \
  167.     { afxEventStock, DISPID_MOUSEDOWN, _T("MouseDown"), \
  168.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  169.  
  170. #define EVENT_STOCK_MOUSEMOVE() \
  171.     { afxEventStock, DISPID_MOUSEMOVE, _T("MouseMove"), \
  172.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  173.  
  174. #define EVENT_STOCK_MOUSEUP() \
  175.     { afxEventStock, DISPID_MOUSEUP, _T("MouseUp"), \
  176.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  177.  
  178. #define EVENT_STOCK_ERROREVENT() \
  179.     { afxEventStock, DISPID_ERROREVENT, _T("Error"), \
  180.       VTS_I2 VTS_PBSTR VTS_SCODE VTS_BSTR VTS_BSTR VTS_I4 VTS_PBOOL },
  181.  
  182. #define EVENT_STOCK_READYSTATECHANGE() \
  183.     { afxEventStock, DISPID_READYSTATECHANGE, _T("ReadyStateChange"), \
  184.       VTS_I4 },
  185.  
  186. // Shift state values for mouse and keyboard events
  187. #define SHIFT_MASK      0x01
  188. #define CTRL_MASK       0x02
  189. #define ALT_MASK        0x04
  190.  
  191. // Button values for mouse events
  192. #define LEFT_BUTTON     0x01
  193. #define RIGHT_BUTTON    0x02
  194. #define MIDDLE_BUTTON   0x04
  195.  
  196. /////////////////////////////////////////////////////////////////////////////
  197. // Stock properties
  198.  
  199. #define DISP_PROPERTY_STOCK(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType) \
  200.     { _T(szExternalName), dispid, NULL, vtPropType, \
  201.         (AFX_PMSG)(void (theClass::*)(void))&pfnGet, \
  202.         (AFX_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispStock }, \
  203.  
  204. #define DISP_STOCKPROP_APPEARANCE() \
  205.     DISP_PROPERTY_STOCK(COleControl, "Appearance", DISPID_APPEARANCE, \
  206.         COleControl::GetAppearance, COleControl::SetAppearance, VT_I2)
  207.  
  208. #define DISP_STOCKPROP_BACKCOLOR() \
  209.     DISP_PROPERTY_STOCK(COleControl, "BackColor", DISPID_BACKCOLOR, \
  210.         COleControl::GetBackColor, COleControl::SetBackColor, VT_COLOR)
  211.  
  212. #define DISP_STOCKPROP_BORDERSTYLE() \
  213.     DISP_PROPERTY_STOCK(COleControl, "BorderStyle", DISPID_BORDERSTYLE, \
  214.         COleControl::GetBorderStyle, COleControl::SetBorderStyle, VT_I2)
  215.  
  216. #define DISP_STOCKPROP_CAPTION() \
  217.     DISP_PROPERTY_STOCK(COleControl, "Caption", DISPID_CAPTION, \
  218.         COleControl::GetText, COleControl::SetText, VT_BSTR)
  219.  
  220. #define DISP_STOCKPROP_ENABLED() \
  221.     DISP_PROPERTY_STOCK(COleControl, "Enabled", DISPID_ENABLED, \
  222.         COleControl::GetEnabled, COleControl::SetEnabled, VT_BOOL)
  223.  
  224. #define DISP_STOCKPROP_FONT() \
  225.     DISP_PROPERTY_STOCK(COleControl, "Font", DISPID_FONT, \
  226.         COleControl::GetFont, COleControl::SetFont, VT_FONT)
  227.  
  228. #define DISP_STOCKPROP_FORECOLOR() \
  229.     DISP_PROPERTY_STOCK(COleControl, "ForeColor", DISPID_FORECOLOR, \
  230.         COleControl::GetForeColor, COleControl::SetForeColor, VT_COLOR)
  231.  
  232. #define DISP_STOCKPROP_HWND() \
  233.     DISP_PROPERTY_STOCK(COleControl, "hWnd", DISPID_HWND, \
  234.         COleControl::GetHwnd, SetNotSupported, VT_HANDLE)
  235.  
  236. #define DISP_STOCKPROP_TEXT() \
  237.     DISP_PROPERTY_STOCK(COleControl, "Text", DISPID_TEXT, \
  238.         COleControl::GetText, COleControl::SetText, VT_BSTR)
  239.  
  240. #define DISP_STOCKPROP_READYSTATE() \
  241.     DISP_PROPERTY_STOCK(COleControl, "ReadyState", DISPID_READYSTATE, \
  242.         COleControl::GetReadyState, SetNotSupported, VT_I4)
  243.  
  244. /////////////////////////////////////////////////////////////////////////////
  245. // Stock methods
  246.  
  247. #define DISP_FUNCTION_STOCK(theClass, szExternalName, dispid, pfnMember, vtRetVal, vtsParams) \
  248.     { _T(szExternalName), dispid, vtsParams, vtRetVal, \
  249.         (AFX_PMSG)(void (theClass::*)(void))&pfnMember, (AFX_PMSG)0, 0, \
  250.         afxDispStock }, \
  251.  
  252. #define DISP_STOCKFUNC_REFRESH() \
  253.     DISP_FUNCTION_STOCK(COleControl, "Refresh", DISPID_REFRESH, \
  254.             COleControl::Refresh, VT_EMPTY, VTS_NONE)
  255.  
  256. #define DISP_STOCKFUNC_DOCLICK() \
  257.     DISP_FUNCTION_STOCK(COleControl, "DoClick", DISPID_DOCLICK, \
  258.             COleControl::DoClick, VT_EMPTY, VTS_NONE)
  259.  
  260. /////////////////////////////////////////////////////////////////////////////
  261. // Macros for object factory and class ID
  262.  
  263. #define BEGIN_OLEFACTORY(class_name) \
  264. protected: \
  265.     class class_name##Factory : public COleObjectFactoryEx \
  266.     { \
  267.     public: \
  268.         class_name##Factory(REFCLSID clsid, CRuntimeClass* pRuntimeClass, \
  269.             BOOL bMultiInstance, LPCTSTR lpszProgID) : \
  270.                 COleObjectFactoryEx(clsid, pRuntimeClass, bMultiInstance, \
  271.                 lpszProgID) {} \
  272.         virtual BOOL UpdateRegistry(BOOL);
  273.  
  274. #define END_OLEFACTORY(class_name) \
  275.     }; \
  276.     friend class class_name##Factory; \
  277.     static AFX_DATA class_name##Factory factory; \
  278. public: \
  279.     static AFX_DATA const GUID guid; \
  280.     virtual HRESULT GetClassID(LPCLSID pclsid);
  281.  
  282. #define DECLARE_OLECREATE_EX(class_name) \
  283.     BEGIN_OLEFACTORY(class_name) \
  284.     END_OLEFACTORY(class_name)
  285.  
  286. #define IMPLEMENT_OLECREATE_EX(class_name, external_name, \
  287.             l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  288.     const TCHAR _szProgID_##class_name[] = _T(external_name); \
  289.     AFX_DATADEF class_name::class_name##Factory class_name::factory( \
  290.         class_name::guid, RUNTIME_CLASS(class_name), FALSE, \
  291.         _szProgID_##class_name); \
  292.     const AFX_DATADEF GUID class_name::guid = \
  293.         { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; \
  294.     HRESULT class_name::GetClassID(LPCLSID pclsid) \
  295.         { *pclsid = guid; return NOERROR; }
  296.  
  297. /////////////////////////////////////////////////////////////////////////////
  298. // Macros for type name and misc status
  299.  
  300. #define DECLARE_OLECTLTYPE(class_name) \
  301.     virtual UINT GetUserTypeNameID(); \
  302.     virtual DWORD GetMiscStatus();
  303.  
  304. #define IMPLEMENT_OLECTLTYPE(class_name, idsUserTypeName, dwOleMisc) \
  305.     UINT class_name::GetUserTypeNameID() { return idsUserTypeName; } \
  306.     DWORD class_name::GetMiscStatus() { return dwOleMisc; }
  307.  
  308. /////////////////////////////////////////////////////////////////////////////
  309. // Macros for property page IDs
  310.  
  311. #define DECLARE_PROPPAGEIDS(class_name) \
  312.     protected: \
  313.         virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
  314.  
  315. #define BEGIN_PROPPAGEIDS(class_name, count) \
  316.     static CLSID _rgPropPageIDs_##class_name[count]; \
  317.     AFX_COMDAT ULONG _cPropPages_##class_name = (ULONG)-1; \
  318.     LPCLSID class_name::GetPropPageIDs(ULONG& cPropPages) { \
  319.         if (_cPropPages_##class_name == (ULONG)-1) { \
  320.             _cPropPages_##class_name = count; \
  321.             LPCLSID pIDs = _rgPropPageIDs_##class_name; \
  322.             ULONG iPageMax = count; \
  323.             ULONG iPage = 0;
  324.  
  325. #define PROPPAGEID(clsid) \
  326.             ASSERT(iPage < iPageMax); \
  327.             if (iPage < iPageMax) \
  328.                 pIDs[iPage++] = clsid;
  329.  
  330. #define END_PROPPAGEIDS(class_name) \
  331.             ASSERT(iPage == iPageMax); \
  332.         } \
  333.         cPropPages = _cPropPages_##class_name; \
  334.         return _rgPropPageIDs_##class_name; }
  335.  
  336. /////////////////////////////////////////////////////////////////////////////
  337. // CFontHolder - helper class for dealing with font objects
  338.  
  339. class CFontHolder
  340. {
  341. // Constructors
  342. public:
  343.     CFontHolder(LPPROPERTYNOTIFYSINK pNotify);
  344.  
  345. // Attributes
  346.     LPFONT m_pFont;
  347.  
  348. // Operations
  349.     void InitializeFont(
  350.             const FONTDESC* pFontDesc = NULL,
  351.             LPDISPATCH pFontDispAmbient = NULL);
  352.     void SetFont(LPFONT pNewFont);
  353.     void ReleaseFont();
  354.     HFONT GetFontHandle();
  355.     HFONT GetFontHandle(long cyLogical, long cyHimetric);
  356.     CFont* Select(CDC* pDC, long cyLogical, long cyHimetric);
  357.     BOOL GetDisplayString(CString& strValue);
  358.     LPFONTDISP GetFontDispatch();
  359.     void QueryTextMetrics(LPTEXTMETRIC lptm);
  360.  
  361. // Implementation
  362. public:
  363.     ~CFontHolder();
  364.     void SetFontNotifySink(LPPROPERTYNOTIFYSINK pNotify);
  365.  
  366. protected:
  367.     DWORD m_dwConnectCookie;
  368.     LPPROPERTYNOTIFYSINK m_pNotify;
  369. };
  370.  
  371. /////////////////////////////////////////////////////////////////////////////
  372. // CPictureHolder - helper class for dealing with picture objects
  373.  
  374. class CPictureHolder
  375. {
  376. // Constructors
  377. public:
  378.     CPictureHolder();
  379.  
  380. // Attributes
  381.     LPPICTURE m_pPict;
  382.  
  383. // Operations
  384.     BOOL CreateEmpty();
  385.  
  386.     BOOL CreateFromBitmap(UINT idResource);
  387.     BOOL CreateFromBitmap(CBitmap* pBitmap, CPalette* pPal = NULL,
  388.         BOOL bTransferOwnership = TRUE);
  389.     BOOL CreateFromBitmap(HBITMAP hbm, HPALETTE hpal = NULL,
  390.         BOOL bTransferOwnership = FALSE);
  391.  
  392.     BOOL CreateFromMetafile(HMETAFILE hmf, int xExt, int yExt,
  393.         BOOL bTransferOwnership = FALSE);
  394.  
  395.     BOOL CreateFromIcon(UINT idResource);
  396.     BOOL CreateFromIcon(HICON hIcon, BOOL bTransferOwnership = FALSE);
  397.  
  398.     short GetType();
  399.     BOOL GetDisplayString(CString& strValue);
  400.     LPPICTUREDISP GetPictureDispatch();
  401.     void SetPictureDispatch(LPPICTUREDISP pDisp);
  402.     void Render(CDC* pDC, const CRect& rcRender, const CRect& rcWBounds);
  403.  
  404. // Implementation
  405. public:
  406.     ~CPictureHolder();
  407. };
  408.  
  409. /////////////////////////////////////////////////////////////////////////////
  410. // CDataPathProperty - Asynchonous properties for OLE Controls
  411.  
  412. class CDataPathProperty: public CAsyncMonikerFile
  413. {
  414.     DECLARE_DYNAMIC(CDataPathProperty)
  415. // Constructors
  416. public:
  417.     CDataPathProperty(COleControl* pControl = NULL);
  418.     CDataPathProperty(LPCTSTR lpszPath, COleControl* pControl = NULL);
  419.     // Calls SetPath(pControl) and SetPath(lpszPath) as appropriate.
  420.  
  421. // Attributes
  422. public:
  423.     void SetPath(LPCTSTR lpszPath);
  424.     // Sets the path to be opened by Open(COleControl*) and Open()
  425.     // lpszPath may be NULL.
  426.  
  427.     CString GetPath() const;
  428.     // Returns the current path setting.  Result may be empty.
  429.  
  430.     COleControl* GetControl();
  431.     // Returns a Pointer to the control.  Result may be NULL.
  432.  
  433.     void SetControl(COleControl* pControl);
  434.     // Sets the control which will be used with Open.  pControl may be NULL.
  435.  
  436. // Operations
  437. public:
  438.     // Overloads of Open takings some or all of: a path, a control,
  439.     // and a CFileException
  440.     // Overloads taking a COleControl call SetControl(pControl)
  441.     // Overloads taking an LPCTSTR cal SetPath(lpszPath)
  442.     virtual BOOL Open(COleControl* pControl, CFileException* pError = NULL);
  443.     virtual BOOL Open(LPCTSTR lpszPath, COleControl* pControl,
  444.         CFileException* pError = NULL);
  445.     virtual BOOL Open(LPCTSTR lpszPath, CFileException* pError = NULL);
  446.     virtual BOOL Open(CFileException* pError = NULL);
  447.     // Attempts to obtain an IBindHost* from the control returned by
  448.     // GetControl(). Calls CAsyncMonikerFile::Open with the path returned by
  449.     // GetPath() and, if it was obtained, the IBindHost*.
  450.     // Returns TRUE if successful.
  451.  
  452. // Overridables
  453. public:
  454.     virtual void ResetData();
  455.     // Derived classes should overide this.
  456.  
  457. // Implementation
  458. public:
  459. #ifdef _DEBUG
  460.     virtual void AssertValid() const;
  461.     virtual void Dump(CDumpContext& dc) const;
  462. #endif
  463.  
  464. private:
  465.     COleControl* m_pControl;
  466.     CString m_strPath;
  467. };
  468.  
  469. /////////////////////////////////////////////////////////////////////////////
  470. // CCachedDataPathProperty - Cached asynchonous properties for OLE Controls
  471.  
  472. class CCachedDataPathProperty : public CDataPathProperty
  473. {
  474.     DECLARE_DYNAMIC(CCachedDataPathProperty)
  475. //Constructors
  476. public:
  477.     CCachedDataPathProperty(COleControl* pControl = NULL);
  478.     CCachedDataPathProperty(LPCTSTR lpszPath, COleControl* pControl = NULL);
  479.  
  480. // Attributes
  481. public:
  482.     CMemFile m_Cache;
  483.  
  484. // Implementation
  485. public:
  486.     virtual void OnDataAvailable(DWORD dwSize, DWORD bscfFlag);
  487.     virtual void Close();
  488.     virtual void ResetData();
  489. #ifdef _DEBUG
  490.     virtual void AssertValid() const;
  491.     virtual void Dump(CDumpContext& dc) const;
  492. #endif
  493. };
  494.  
  495. /////////////////////////////////////////////////////////////////////////////
  496. // COleControl - base class for a control implemented in C++ with MFC
  497.  
  498. struct _AFXCTL_ADVISE_INFO;     // implementation class
  499. struct _AFXCTL_UIACTIVE_INFO;   // implementation class
  500.  
  501. class CControlRectTracker : public CRectTracker
  502. {
  503. // Implementation
  504. public:
  505.     CControlRectTracker(LPCRECT lpSrcRect, UINT nStyle)
  506.         : CRectTracker(lpSrcRect, nStyle) { }
  507.     CRect m_rectClip;   // saves the original clipping rectangle
  508. };
  509.  
  510. #ifdef _AFXDLL
  511. class COleControl : public CWnd
  512. #else
  513. class AFX_NOVTABLE COleControl : public CWnd
  514. #endif
  515. {
  516.     DECLARE_DYNAMIC(COleControl)
  517.  
  518. // Constructors
  519. public:
  520.     COleControl();
  521.  
  522. // Operations
  523.  
  524.     // Initialization
  525.     void SetInitialSize(int cx, int cy);
  526.     void InitializeIIDs(const IID* piidPrimary, const IID* piidEvents);
  527.  
  528.     // Invalidating
  529.     void InvalidateControl(LPCRECT lpRect = NULL, BOOL bErase = TRUE);
  530.  
  531.     // Modified flag
  532.     BOOL IsModified();
  533.     void SetModifiedFlag(BOOL bModified = TRUE);
  534.  
  535.     // Drawing operations
  536.     void DoSuperclassPaint(CDC* pDC, const CRect& rcBounds);
  537.     BOOL IsOptimizedDraw();
  538.  
  539.     // Property exchange
  540.     BOOL ExchangeVersion(CPropExchange* pPX, DWORD dwVersionDefault,
  541.         BOOL bConvert = TRUE);
  542.     BOOL ExchangeExtent(CPropExchange* pPX);
  543.     void ExchangeStockProps(CPropExchange* pPX);
  544.     BOOL IsConvertingVBX();
  545.  
  546.     DWORD SerializeVersion(CArchive& ar, DWORD dwVersionDefault,
  547.         BOOL bConvert = TRUE);
  548.     void SerializeExtent(CArchive& ar);
  549.     void SerializeStockProps(CArchive& ar);
  550.  
  551.     void ResetVersion(DWORD dwVersionDefault);
  552.     void ResetStockProps();
  553.  
  554.     // Stock methods
  555.     void Refresh();
  556.     void DoClick();
  557.  
  558.     // Stock properties
  559.     short GetAppearance();
  560.     void SetAppearance(short);
  561.     OLE_COLOR GetBackColor();
  562.     void SetBackColor(OLE_COLOR);
  563.     short GetBorderStyle();
  564.     void SetBorderStyle(short);
  565.     BOOL GetEnabled();
  566.     void SetEnabled(BOOL);
  567.     CFontHolder& InternalGetFont();
  568.     LPFONTDISP GetFont();
  569.     void SetFont(LPFONTDISP);
  570.     OLE_COLOR GetForeColor();
  571.     void SetForeColor(OLE_COLOR);
  572.     OLE_HANDLE GetHwnd();
  573.     const CString& InternalGetText();
  574.     BSTR GetText();
  575.     void SetText(LPCTSTR);
  576.     long GetReadyState();
  577.     void InternalSetReadyState(long lNewReadyState);
  578.  
  579.     // Using colors
  580.     COLORREF TranslateColor(OLE_COLOR clrColor, HPALETTE hpal = NULL);
  581.  
  582.     // Using fonts
  583.     CFont* SelectStockFont(CDC* pDC);
  584.     CFont* SelectFontObject(CDC* pDC, CFontHolder& fontHolder);
  585.     void GetStockTextMetrics(LPTEXTMETRIC lptm);
  586.     void GetFontTextMetrics(LPTEXTMETRIC lptm, CFontHolder& fontHolder);
  587.  
  588.     // Client site access
  589.     LPOLECLIENTSITE GetClientSite();
  590.  
  591.     // Generic ambient property access
  592.     BOOL GetAmbientProperty(DISPID dispid, VARTYPE vtProp, void* pvProp);
  593.     BOOL WillAmbientsBeValidDuringLoad();
  594.  
  595.     // Specific ambient properties
  596.     short AmbientAppearance();
  597.     OLE_COLOR AmbientBackColor();
  598.     CString AmbientDisplayName();
  599.     LPFONTDISP AmbientFont();
  600.     OLE_COLOR AmbientForeColor();
  601.     LCID AmbientLocaleID();
  602.     CString AmbientScaleUnits();
  603.     short AmbientTextAlign();
  604.     BOOL AmbientUserMode();
  605.     BOOL AmbientUIDead();
  606.     BOOL AmbientShowGrabHandles();
  607.     BOOL AmbientShowHatching();
  608.  
  609.     // Firing events
  610.     void AFX_CDECL FireEvent(DISPID dispid, BYTE* pbParams, ...);
  611.  
  612.     // Firing functions for stock events
  613.     void FireKeyDown(USHORT* pnChar, short nShiftState);
  614.     void FireKeyUp(USHORT* pnChar, short nShiftState);
  615.     void FireKeyPress(USHORT* pnChar);
  616.     void FireMouseDown(short nButton, short nShiftState,
  617.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  618.     void FireMouseUp(short nButton, short nShiftState,
  619.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  620.     void FireMouseMove(short nButton, short nShiftState,
  621.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  622.     void FireClick();
  623.     void FireDblClick();
  624.     void FireError(SCODE scode, LPCTSTR lpszDescription, UINT nHelpID = 0);
  625.     void FireReadyStateChange();
  626.  
  627.     // Changing size and/or rectangle
  628.     BOOL GetRectInContainer(LPRECT lpRect);
  629.     BOOL SetRectInContainer(LPCRECT lpRect);
  630.     void GetControlSize(int* pcx, int* pcy);
  631.     BOOL SetControlSize(int cx, int cy);
  632.  
  633.     // Window management
  634.     void RecreateControlWindow();
  635.  
  636.     // Modal dialog operations
  637.     void PreModalDialog(HWND hWndParent = NULL);
  638.     void PostModalDialog(HWND hWndParent = NULL);
  639.  
  640.     // Data binding operations
  641.     void BoundPropertyChanged(DISPID dispid);
  642.     BOOL BoundPropertyRequestEdit(DISPID dispid);
  643.  
  644.     // Dispatch exceptions
  645.     void ThrowError(SCODE sc, UINT nDescriptionID, UINT nHelpID = -1);
  646.     void ThrowError(SCODE sc, LPCTSTR pszDescription = NULL, UINT nHelpID = 0);
  647.     void GetNotSupported();
  648.     void SetNotSupported();
  649.     void SetNotPermitted();
  650.  
  651.     // Communication with the control site
  652.     void ControlInfoChanged();
  653.     BOOL LockInPlaceActive(BOOL bLock);
  654.     LPDISPATCH GetExtendedControl();
  655.     void TransformCoords(POINTL* lpptlHimetric,
  656.         POINTF* lpptfContainer, DWORD flags);
  657.  
  658.     // Simple frame
  659.     void EnableSimpleFrame();
  660.  
  661.     // Windowless operations
  662.     CWnd* SetCapture();
  663.     BOOL ReleaseCapture();
  664.     CWnd* GetCapture();
  665.     CWnd* SetFocus();
  666.     CWnd* GetFocus();
  667.     CDC* GetDC(LPCRECT lprcRect = NULL, DWORD dwFlags = OLEDC_PAINTBKGND);
  668.     int ReleaseDC(CDC* pDC);
  669.     void InvalidateRgn(CRgn* pRgn, BOOL bErase = TRUE);
  670.     void ScrollWindow(int xAmount, int yAmount, LPCRECT lpRect = NULL,
  671.         LPCRECT lpClipRect = NULL);
  672.     BOOL ClipCaretRect(LPRECT lpRect);
  673.     virtual void GetClientRect(LPRECT lpRect) const;
  674.  
  675. // Overridables
  676.     virtual void DoPropExchange(CPropExchange* pPX);
  677.     virtual void OnResetState();
  678.     virtual void OnDraw(
  679.                 CDC* pDC, const CRect& rcBounds, const CRect& rcInvalid);
  680.     virtual void OnDrawMetafile(CDC* pDC, const CRect& rcBounds);
  681.  
  682.     // Class ID (implemented by IMPLEMENT_OLECREATE_EX macro)
  683.     virtual HRESULT GetClassID(LPCLSID pclsid) = 0;
  684.  
  685.     // For customizing the default messages on the status bar
  686.     virtual void GetMessageString(UINT nID, CString& rMessage) const;
  687.  
  688.     // Display of error events to user
  689.     virtual void DisplayError(SCODE scode, LPCTSTR lpszDescription,
  690.         LPCTSTR lpszSource, LPCTSTR lpszHelpFile, UINT nHelpID);
  691.  
  692.     // IOleObject notifications
  693.     virtual void OnSetClientSite();
  694.     virtual BOOL OnSetExtent(LPSIZEL lpSizeL);
  695.     virtual void OnClose(DWORD dwSaveOption);
  696.  
  697.     // IOleInPlaceObject notifications
  698.     virtual BOOL OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);
  699.  
  700.     // Event connection point notifications
  701.     virtual void OnEventAdvise(BOOL bAdvise);
  702.  
  703.     // Override to hook firing of Click event
  704.     virtual void OnClick(USHORT iButton);
  705.  
  706.     // Override to get character after key events have been processed.
  707.     virtual void OnKeyDownEvent(USHORT nChar, USHORT nShiftState);
  708.     virtual void OnKeyUpEvent(USHORT nChar, USHORT nShiftState);
  709.     virtual void OnKeyPressEvent(USHORT nChar);
  710.  
  711.     // Change notifications
  712.     virtual void OnAppearanceChanged();
  713.     virtual void OnBackColorChanged();
  714.     virtual void OnBorderStyleChanged();
  715.     virtual void OnEnabledChanged();
  716.     virtual void OnTextChanged();
  717.     virtual void OnFontChanged();
  718.     virtual void OnForeColorChanged();
  719.  
  720.     // IOleControl notifications
  721.     virtual void OnGetControlInfo(LPCONTROLINFO pControlInfo);
  722.     virtual void OnMnemonic(LPMSG pMsg);
  723.     virtual void OnAmbientPropertyChange(DISPID dispid);
  724.     virtual void OnFreezeEvents(BOOL bFreeze);
  725.  
  726.     // In-place activation
  727.     virtual HMENU OnGetInPlaceMenu();
  728.     virtual void OnShowToolBars();
  729.     virtual void OnHideToolBars();
  730.  
  731.     // IViewObject
  732.     virtual BOOL OnGetColorSet(DVTARGETDEVICE* ptd, HDC hicTargetDev,
  733.                 LPLOGPALETTE* ppColorSet);
  734.     virtual BOOL OnGetViewExtent(DWORD dwDrawAspect, LONG lindex,
  735.         DVTARGETDEVICE* ptd, LPSIZEL lpsizel);
  736.     virtual BOOL OnGetViewRect(DWORD dwAspect, LPRECTL pRect);
  737.     virtual DWORD OnGetViewStatus();
  738.     virtual BOOL OnQueryHitPoint(DWORD dwAspect, LPCRECT pRectBounds,
  739.         POINT ptlLoc, LONG lCloseHint, DWORD* pHitResult);
  740.     virtual BOOL OnQueryHitRect(DWORD dwAspect, LPCRECT pRectBounds,
  741.         LPCRECT prcLoc, LONG lCloseHint, DWORD* pHitResult);
  742.     virtual BOOL OnGetNaturalExtent(DWORD dwAspect, LONG lindex,
  743.         DVTARGETDEVICE* ptd, HDC hicTargetDev, DVEXTENTINFO* pExtentInfo,
  744.         LPSIZEL psizel);
  745.  
  746.     // IDataObject - see COleDataSource for a description of these overridables
  747.     virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
  748.     virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
  749.     virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  750.     virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  751.         BOOL bRelease);
  752.  
  753.     // Verbs
  754.     virtual BOOL OnEnumVerbs(LPENUMOLEVERB* ppenumOleVerb);
  755.     virtual BOOL OnDoVerb(LONG iVerb, LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  756.     virtual BOOL OnEdit(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  757.     virtual BOOL OnProperties(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  758.  
  759.     // IPerPropertyBrowsing overrides
  760.     virtual BOOL OnGetDisplayString(DISPID dispid, CString& strValue);
  761.     virtual BOOL OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid,
  762.         BOOL* pbPageOptional);
  763.     virtual BOOL OnGetPredefinedStrings(DISPID dispid,
  764.         CStringArray* pStringArray, CDWordArray* pCookieArray);
  765.     virtual BOOL OnGetPredefinedValue(DISPID dispid, DWORD dwCookie,
  766.         VARIANT* lpvarOut);
  767.  
  768.     // Subclassing
  769.     virtual BOOL IsSubclassedControl();
  770.  
  771.     // Window reparenting
  772.     virtual void ReparentControlWindow(HWND hWndOuter, HWND hWndParent);
  773.  
  774.     // Window procedure
  775.     virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  776.  
  777.     // General-purpose flags
  778.     enum ControlFlags {
  779.         fastBeginPaint      = 0x0001,
  780.         clipPaintDC         = 0x0002,
  781.         pointerInactive     = 0x0004,
  782.         noFlickerActivate   = 0x0008,
  783.         windowlessActivate  = 0x0010,
  784.         canOptimizeDraw     = 0x0020,
  785.     };
  786.     virtual DWORD GetControlFlags();
  787.  
  788.     // Inactive pointer handling
  789.     virtual DWORD GetActivationPolicy();
  790.     virtual BOOL OnInactiveSetCursor(LPCRECT lprcBounds, long x, long y,
  791.         DWORD dwMouseMsg, BOOL bSetAlways);
  792.     virtual void OnInactiveMouseMove(LPCRECT lprcBounds, long x, long y,
  793.         DWORD dwKeyState);
  794.  
  795.     // Windowless activation handling
  796.     virtual BOOL OnWindowlessMessage(UINT msg, WPARAM wParam, LPARAM lParam,
  797.         LRESULT* plResult);
  798.     virtual IDropTarget* GetWindowlessDropTarget();
  799.  
  800.     // Inactive/windowless helper functions
  801.     virtual void GetClientOffset(long* pdxOffset, long* pdyOffset) const;
  802.     virtual UINT ParentToClient(LPCRECT lprcBounds, LPPOINT pPoint,
  803.         BOOL bHitTest = FALSE) const;
  804.     virtual void ClientToParent(LPCRECT lprcBounds, LPPOINT pPoint) const;
  805.  
  806.     // Asynchronous properties
  807.     void Load(LPCTSTR strNewPath, CDataPathProperty& prop);
  808.  
  809. // Implementation
  810. public:
  811.     ~COleControl();
  812.     void RequestAsynchronousExchange(DWORD dwVersion);
  813.  
  814. #ifdef _DEBUG
  815.     void AssertValid() const;
  816.     void Dump(CDumpContext& dc) const;
  817. #endif // _DEBUG
  818.  
  819. protected:
  820.     // Friend classes
  821.     friend class COleControlInnerUnknown;
  822.     friend class CReflectorWnd;
  823.     friend class CControlFrameWnd;
  824.  
  825.     // Interface hook for primary automation interface
  826.     LPUNKNOWN GetInterfaceHook(const void* piid);
  827.  
  828.     // Shutdown
  829.     virtual void OnFinalRelease();
  830.     void ReleaseCaches();
  831.  
  832.     // Window management
  833.     virtual BOOL CreateControlWindow(HWND hWndParent, const CRect& rcPos,
  834.         LPCRECT prcClipped = NULL);
  835.     void CreateWindowForSubclassedControl();
  836.     BOOL IgnoreWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam,
  837.         LRESULT* plResult);
  838.     virtual LRESULT DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
  839.  
  840.     // Serialization
  841.     HRESULT SaveState(IStream* pStm);
  842.     HRESULT LoadState(IStream* pStm);
  843.     virtual void Serialize(CArchive& ar);
  844.  
  845.     // Drawing
  846.     void DrawContent(CDC* pDC, CRect& rc);
  847.     void DrawMetafile(CDC* pDC, CRect& rc);
  848.     BOOL GetMetafileData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  849.  
  850.     // Implementation of IDataObject
  851.     // CControlDataSource implements OnRender reflections to COleControl
  852.     class CControlDataSource : public COleDataSource
  853.     {
  854.     public:
  855.         CControlDataSource(COleControl* pCtrl);
  856.     protected:
  857.         virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
  858.         virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
  859.         virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  860.         virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  861.             BOOL bRelease);
  862.         COleControl* m_pCtrl;
  863.     };
  864.     friend class CControlDataSource;
  865.  
  866.     // IDataObject formats
  867.     CControlDataSource* GetDataSource();
  868.     virtual void SetInitialDataFormats();
  869.     BOOL GetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  870.         REFCLSID fmtid);
  871.     BOOL SetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  872.         REFCLSID fmtid);
  873.  
  874.     // Type library
  875.     BOOL GetDispatchIID(IID* pIID);
  876.  
  877.     // Connection point container
  878.     virtual LPCONNECTIONPOINT GetConnectionHook(REFIID iid);
  879.     virtual BOOL GetExtraConnectionPoints(CPtrArray* pConnPoints);
  880.  
  881.     // Events
  882.     static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[];
  883.     virtual const AFX_EVENTMAP* GetEventMap() const;
  884.     static const AFX_DATA AFX_EVENTMAP eventMap;
  885.     const AFX_EVENTMAP_ENTRY* GetEventMapEntry(LPCTSTR pszName,
  886.         DISPID* pDispid) const;
  887.     void FireEventV(DISPID dispid, BYTE* pbParams, va_list argList);
  888.  
  889.     // Stock events
  890.     void KeyDown(USHORT* pnChar);
  891.     void KeyUp(USHORT* pnChar);
  892.     void ButtonDown(USHORT iButton, UINT nFlags, CPoint point);
  893.     void ButtonUp(USHORT iButton, UINT nFlags, CPoint point);
  894.     void ButtonDblClk(USHORT iButton, UINT nFlags, CPoint point);
  895.  
  896.     // Masks to identify which stock events and properties are used
  897.     void InitStockEventMask();
  898.     void InitStockPropMask();
  899.     DWORD GetStockEventMask() const;
  900.     DWORD GetStockPropMask() const;
  901.  
  902.     // Support for subclassing a Windows control
  903.     CWnd* GetOuterWindow() const;       // m_pReflect if any, otherwise this
  904.     virtual void OnReflectorDestroyed();
  905.  
  906.     // Aggregation of default handler
  907.     virtual BOOL OnCreateAggregates();
  908.     LPVOID QueryDefHandler(REFIID iid);
  909.  
  910.     // State change notifications
  911.     void SendAdvise(UINT uCode);
  912.  
  913.     // Non-in-place activation
  914.     virtual HRESULT OnOpen(BOOL bTryInPlace, LPMSG pMsg);
  915. #ifdef _AFXDLL
  916.     void ResizeOpenControl(int cx, int cy);
  917.     virtual CControlFrameWnd* CreateFrameWindow();
  918.     virtual void ResizeFrameWindow(int cx, int cy);
  919.     virtual void OnFrameClose();
  920. #endif
  921.     virtual HRESULT OnHide();
  922.  
  923.     // In-place activation
  924.     virtual HRESULT OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg);
  925.     void ForwardActivationMsg(LPMSG pMsg);
  926.     virtual void AddFrameLevelUI();
  927.     virtual void RemoveFrameLevelUI();
  928.     virtual BOOL BuildSharedMenu();
  929.     virtual void DestroySharedMenu();
  930.  
  931.     // Property sheet
  932.     virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
  933.  
  934.     // IOleObject implementation
  935.     void GetUserType(LPTSTR pszUserType);
  936.     virtual UINT GetUserTypeNameID() = 0;
  937.     virtual DWORD GetMiscStatus() = 0;
  938.  
  939.     // Rectangle tracker
  940.     void CreateTracker(BOOL bHandles, BOOL bHatching);
  941.     void CreateTracker(BOOL bHandles, BOOL bHatching, LPCRECT prcClip);
  942.     void DestroyTracker();
  943.  
  944.     // Automation
  945.     BOOL IsInvokeAllowed(DISPID dispid);
  946.  
  947.     // Ambient property interface initialization
  948.     COleDispatchDriver* GetAmbientDispatchDriver();
  949.  
  950.     // Data members
  951.     const IID* m_piidPrimary;           // IID for control automation
  952.     const IID* m_piidEvents;            // IID for control events
  953.     DWORD m_dwVersionLoaded;            // Version number of loaded state
  954.     COleDispatchDriver m_ambientDispDriver; // Driver for ambient properties
  955.     ULONG m_cEventsFrozen;              // Event freeze count (>0 means frozen)
  956.     union
  957.     {
  958. #ifdef _AFXDLL
  959.         CControlFrameWnd* m_pWndOpenFrame;  // Open frame window.
  960. #endif
  961.         CControlRectTracker* m_pRectTracker;       // Tracker for UI active control
  962.     };
  963.     CRect m_rcPos;                      // Control's position rectangle
  964.     CRect m_rcBounds;                   // Bounding rectangle for drawing
  965.     CPoint m_ptOffset;                  // Child window origin
  966.     long m_cxExtent;                    // Control's width in HIMETRIC units
  967.     long m_cyExtent;                    // Control's height in HIMETRIC units
  968.     class CReflectorWnd* m_pReflect;    // Reflector window
  969.     UINT m_nIDTracking;                 // Tracking command ID or string IDS
  970.     UINT m_nIDLastMessage;              // Last displayed message string IDS
  971.     unsigned m_bAutoMenuEnable : 1;     // Disable menu items without handlers?
  972.     unsigned m_bFinalReleaseCalled : 1; // Are we handling the final Release?
  973.     unsigned m_bModified : 1;           // "Dirty" bit.
  974.     unsigned m_bCountOnAmbients : 1;    // Can we count on Ambients during load?
  975.     unsigned m_iButtonState : 3;        // Which buttons are down?
  976.     unsigned m_iDblClkState : 3;        // Which buttons involved in dbl click?
  977.     unsigned m_bInPlaceActive : 1;      // Are we in-place active?
  978.     unsigned m_bUIActive : 1;           // Are we UI active?
  979.     unsigned m_bPendingUIActivation : 1; // Are we about to become UI active?
  980. #ifdef _AFXDLL
  981.     unsigned m_bOpen : 1;               // Are we open (non-in-place)?
  982. #endif
  983.     unsigned m_bChangingExtent : 1;     // Extent is currently being changed
  984.     unsigned m_bConvertVBX : 1;         // VBX conversion in progress
  985.     unsigned m_bSimpleFrame : 1;        // Simple frame support
  986.     unsigned m_bUIDead : 1;             // UIDead ambient property value
  987.     unsigned m_bInitialized : 1;        // Was IPersist*::{InitNew,Load} called?
  988.     unsigned m_bAutoClip : 1;           // Does container automatically clip?
  989.     unsigned m_bMsgReflect : 1;         // Does container reflect messages?
  990.     unsigned m_bInPlaceSiteEx : 1;      // Extended in-place site?
  991.     unsigned m_bInPlaceSiteWndless : 1; // Windowless in-place site?
  992.     unsigned m_bNoRedraw : 1;           // Should we skip OnPaint this time?
  993.     unsigned m_bOptimizedDraw : 1;      // Is optimized drawing possible?
  994.  
  995.     // Stock properties
  996.     OLE_COLOR m_clrBackColor;           // BackColor
  997.     OLE_COLOR m_clrForeColor;           // ForeColor
  998.     CString m_strText;                  // Text/Caption
  999.     CFontHolder m_font;                 // Font
  1000.     HFONT m_hFontPrev;                  // Previously selected font object
  1001.     short m_sAppearance;                // Appearance
  1002.     short m_sBorderStyle;               // BorderStyle
  1003.     BOOL m_bEnabled;                    // Enabled
  1004.     long m_lReadyState;                 // ReadyState
  1005.  
  1006.     // UI Active info (shared OLE menu data)
  1007.     _AFXCTL_UIACTIVE_INFO* m_pUIActiveInfo;
  1008.  
  1009.     // Default Handler aggregation
  1010.     LPUNKNOWN m_pDefIUnknown;
  1011.     _AFXCTL_ADVISE_INFO* m_pAdviseInfo;
  1012.     LPPERSISTSTORAGE m_pDefIPersistStorage;
  1013.     LPVIEWOBJECT m_pDefIViewObject;
  1014.     LPOLECACHE m_pDefIOleCache;
  1015.  
  1016.     // OLE client site interfaces
  1017.     LPOLECLIENTSITE m_pClientSite;          // Client site
  1018.     union
  1019.     {
  1020.         LPOLEINPLACESITE m_pInPlaceSite;    // In-place site
  1021.         LPOLEINPLACESITEEX m_pInPlaceSiteEx;
  1022.         LPOLEINPLACESITEWINDOWLESS m_pInPlaceSiteWndless;
  1023.     };
  1024.     LPOLECONTROLSITE m_pControlSite;        // Control site
  1025.     LPOLEADVISEHOLDER m_pOleAdviseHolder;   // Advise holder
  1026.     LPDATAADVISEHOLDER m_pDataAdviseHolder; // Data advise holder
  1027.     LPSIMPLEFRAMESITE m_pSimpleFrameSite;   // Simple frame site
  1028.  
  1029.     // OLE in-place activation info
  1030.     LPOLEINPLACEFRAME m_pInPlaceFrame;
  1031.     OLEINPLACEFRAMEINFO m_frameInfo;
  1032.     LPOLEINPLACEUIWINDOW m_pInPlaceDoc;
  1033.  
  1034.     // OLE data source
  1035.     CControlDataSource* m_pDataSource;
  1036.  
  1037.     // OLE data path load data
  1038.     BOOL m_bDataPathPropertiesLoaded;
  1039.     DWORD m_dwDataPathVersionToReport;
  1040.  
  1041. // Message Maps
  1042. protected:
  1043.     //{{AFX_MSG(COleControl)
  1044.     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  1045.     afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  1046.     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  1047.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  1048.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  1049.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  1050.     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  1051.     afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
  1052.     afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
  1053.     afx_msg void OnMButtonDblClk(UINT nFlags, CPoint point);
  1054.     afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  1055.     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
  1056.     afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
  1057.     afx_msg void OnInitMenuPopup(CMenu*, UINT, BOOL);
  1058.     afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
  1059.     afx_msg LRESULT OnSetMessageString(WPARAM wParam, LPARAM lParam);
  1060.     afx_msg void OnEnterIdle(UINT nWhy, CWnd* pWho);
  1061.     afx_msg void OnCancelMode();
  1062.     afx_msg void OnPaint(CDC* pDC);
  1063.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  1064.     afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  1065.     afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  1066.     afx_msg int  OnMouseActivate(CWnd *pDesktopWnd, UINT nHitTest, UINT message);
  1067.     afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
  1068.     afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct);
  1069.     afx_msg void OnDestroy();
  1070.     afx_msg  void OnKillFocus(CWnd* pNewWnd);
  1071.     afx_msg void OnSetFocus(CWnd* pOldWnd);
  1072.     afx_msg void OnNcPaint();
  1073.     afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
  1074.     afx_msg UINT OnNcHitTest(CPoint point);
  1075.     afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
  1076.     afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  1077.     afx_msg UINT OnGetDlgCode();
  1078.     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  1079.     afx_msg void OnSize(UINT nType, int cx, int cy);
  1080.     afx_msg void OnMove(int x, int y);
  1081.     afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
  1082.     //}}AFX_MSG
  1083.  
  1084.     afx_msg LRESULT OnOcmCtlColorBtn(WPARAM wParam, LPARAM lParam);
  1085.     afx_msg LRESULT OnOcmCtlColorDlg(WPARAM wParam, LPARAM lParam);
  1086.     afx_msg LRESULT OnOcmCtlColorEdit(WPARAM wParam, LPARAM lParam);
  1087.     afx_msg LRESULT OnOcmCtlColorListBox(WPARAM wParam, LPARAM lParam);
  1088.     afx_msg LRESULT OnOcmCtlColorMsgBox(WPARAM wParam, LPARAM lParam);
  1089.     afx_msg LRESULT OnOcmCtlColorScrollBar(WPARAM wParam, LPARAM lParam);
  1090.     afx_msg LRESULT OnOcmCtlColorStatic(WPARAM wParam, LPARAM lParam);
  1091.  
  1092.     DECLARE_MESSAGE_MAP()
  1093.  
  1094.     // button handler helpers
  1095.     void OnButtonUp(USHORT nButton, UINT nFlags, CPoint point);
  1096.     void OnButtonDown(USHORT nButton, UINT nFlags, CPoint point);
  1097.     void OnButtonDblClk(USHORT nButton, UINT nFlags, CPoint point);
  1098.  
  1099. // Interface Maps
  1100. public:
  1101.     // IPersistStorage
  1102.     BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
  1103.         INIT_INTERFACE_PART(COleControl, PersistStorage)
  1104.         STDMETHOD(GetClassID)(LPCLSID);
  1105.         STDMETHOD(IsDirty)();
  1106.         STDMETHOD(InitNew)(LPSTORAGE);
  1107.         STDMETHOD(Load)(LPSTORAGE);
  1108.         STDMETHOD(Save)(LPSTORAGE, BOOL);
  1109.         STDMETHOD(SaveCompleted)(LPSTORAGE);
  1110.         STDMETHOD(HandsOffStorage)();
  1111.     END_INTERFACE_PART_STATIC(PersistStorage)
  1112.  
  1113.     // IPersistStreamInit
  1114.     BEGIN_INTERFACE_PART(PersistStreamInit, IPersistStreamInit)
  1115.         INIT_INTERFACE_PART(COleControl, PersistStreamInit)
  1116.         STDMETHOD(GetClassID)(LPCLSID);
  1117.         STDMETHOD(IsDirty)();
  1118.         STDMETHOD(Load)(LPSTREAM);
  1119.         STDMETHOD(Save)(LPSTREAM, BOOL);
  1120.         STDMETHOD(GetSizeMax)(ULARGE_INTEGER *);
  1121.         STDMETHOD(InitNew)();
  1122.     END_INTERFACE_PART_STATIC(PersistStreamInit)
  1123.  
  1124.     // IPersistMemory
  1125.     BEGIN_INTERFACE_PART(PersistMemory, IPersistMemory)
  1126.         INIT_INTERFACE_PART(COleControl, PersistMemory)
  1127.         STDMETHOD(GetClassID)(LPCLSID);
  1128.         STDMETHOD(IsDirty)();
  1129.         STDMETHOD(Load)(LPVOID, ULONG);
  1130.         STDMETHOD(Save)(LPVOID, BOOL, ULONG);
  1131.         STDMETHOD(GetSizeMax)(ULONG*);
  1132.         STDMETHOD(InitNew)();
  1133.     END_INTERFACE_PART_STATIC(PersistMemory)
  1134.  
  1135.     // IPersistPropertyBag
  1136.     BEGIN_INTERFACE_PART(PersistPropertyBag, IPersistPropertyBag)
  1137.         INIT_INTERFACE_PART(COleControl, PersistPropertyBag)
  1138.         STDMETHOD(GetClassID)(LPCLSID);
  1139.         STDMETHOD(InitNew)();
  1140.         STDMETHOD(Load)(LPPROPERTYBAG, LPERRORLOG);
  1141.         STDMETHOD(Save)(LPPROPERTYBAG, BOOL, BOOL);
  1142.     END_INTERFACE_PART_STATIC(PersistPropertyBag)
  1143.  
  1144.     // IOleObject
  1145.     BEGIN_INTERFACE_PART(OleObject, IOleObject)
  1146.         INIT_INTERFACE_PART(COleControl, OleObject)
  1147.         STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
  1148.         STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
  1149.         STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
  1150.         STDMETHOD(Close)(DWORD);
  1151.         STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
  1152.         STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  1153.         STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
  1154.         STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
  1155.         STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);
  1156.         STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
  1157.         STDMETHOD(Update)();
  1158.         STDMETHOD(IsUpToDate)();
  1159.         STDMETHOD(GetUserClassID)(CLSID*);
  1160.         STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
  1161.         STDMETHOD(SetExtent)(DWORD, LPSIZEL);
  1162.         STDMETHOD(GetExtent)(DWORD, LPSIZEL);
  1163.         STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
  1164.         STDMETHOD(Unadvise)(DWORD);
  1165.         STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
  1166.         STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
  1167.         STDMETHOD(SetColorScheme)(LPLOGPALETTE);
  1168.     END_INTERFACE_PART(OleObject)
  1169.  
  1170.     // IViewObjectEx
  1171.     BEGIN_INTERFACE_PART(ViewObject, IViewObjectEx)
  1172.         INIT_INTERFACE_PART(COleControl, ViewObject)
  1173.         STDMETHOD(Draw)(DWORD, LONG, void*, DVTARGETDEVICE*, HDC, HDC,
  1174.             LPCRECTL, LPCRECTL, BOOL (CALLBACK*)(DWORD), DWORD);
  1175.         STDMETHOD(GetColorSet)(DWORD, LONG, void*, DVTARGETDEVICE*,
  1176.             HDC, LPLOGPALETTE*);
  1177.         STDMETHOD(Freeze)(DWORD, LONG, void*, DWORD*);
  1178.         STDMETHOD(Unfreeze)(DWORD);
  1179.         STDMETHOD(SetAdvise)(DWORD, DWORD, LPADVISESINK);
  1180.         STDMETHOD(GetAdvise)(DWORD*, DWORD*, LPADVISESINK*);
  1181.         STDMETHOD(GetExtent) (DWORD, LONG, DVTARGETDEVICE*, LPSIZEL);
  1182.         STDMETHOD(GetRect)(DWORD, LPRECTL);
  1183.         STDMETHOD(GetViewStatus)(DWORD*);
  1184.         STDMETHOD(QueryHitPoint)(DWORD, LPCRECT, POINT, LONG, DWORD*);
  1185.         STDMETHOD(QueryHitRect)(DWORD, LPCRECT, LPCRECT, LONG, DWORD*);
  1186.         STDMETHOD(GetNaturalExtent)(DWORD, LONG, DVTARGETDEVICE*, HDC,
  1187.             DVEXTENTINFO*, LPSIZEL);
  1188.     END_INTERFACE_PART(ViewObject)
  1189.  
  1190.     // IDataObject
  1191.     BEGIN_INTERFACE_PART(DataObject, IDataObject)
  1192.         INIT_INTERFACE_PART(COleControl, DataObject)
  1193.         STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
  1194.         STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
  1195.         STDMETHOD(QueryGetData)(LPFORMATETC);
  1196.         STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
  1197.         STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
  1198.         STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
  1199.         STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
  1200.         STDMETHOD(DUnadvise)(DWORD);
  1201.         STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
  1202.     END_INTERFACE_PART_STATIC(DataObject)
  1203.  
  1204.     // IOleInPlaceObject
  1205.     BEGIN_INTERFACE_PART(OleInPlaceObject, IOleInPlaceObjectWindowless)
  1206.         INIT_INTERFACE_PART(COleControl, OleInPlaceObject)
  1207.         STDMETHOD(GetWindow)(HWND*);
  1208.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  1209.         STDMETHOD(InPlaceDeactivate)();
  1210.         STDMETHOD(UIDeactivate)();
  1211.         STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT);
  1212.         STDMETHOD(ReactivateAndUndo)();
  1213.         STDMETHOD(OnWindowMessage)(UINT msg, WPARAM wParam, LPARAM lparam,
  1214.             LRESULT* plResult);
  1215.         STDMETHOD(GetDropTarget)(IDropTarget **ppDropTarget);
  1216.     END_INTERFACE_PART(OleInPlaceObject)
  1217.  
  1218.     // IOleInPlaceActiveObject
  1219.     BEGIN_INTERFACE_PART(OleInPlaceActiveObject, IOleInPlaceActiveObject)
  1220.         INIT_INTERFACE_PART(COleControl, OleInPlaceActiveObject)
  1221.         STDMETHOD(GetWindow)(HWND*);
  1222.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  1223.         STDMETHOD(TranslateAccelerator)(LPMSG);
  1224.         STDMETHOD(OnFrameWindowActivate)(BOOL);
  1225.         STDMETHOD(OnDocWindowActivate)(BOOL);
  1226.         STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
  1227.         STDMETHOD(EnableModeless)(BOOL);
  1228.     END_INTERFACE_PART(OleInPlaceActiveObject)
  1229.  
  1230.     // IOleCache
  1231.     BEGIN_INTERFACE_PART(OleCache, IOleCache)
  1232.         INIT_INTERFACE_PART(COleControl, OleCache)
  1233.         STDMETHOD(Cache)(LPFORMATETC, DWORD, LPDWORD);
  1234.         STDMETHOD(Uncache)(DWORD);
  1235.         STDMETHOD(EnumCache)(LPENUMSTATDATA*);
  1236.         STDMETHOD(InitCache)(LPDATAOBJECT);
  1237.         STDMETHOD(SetData)(LPFORMATETC, STGMEDIUM*, BOOL);
  1238.     END_INTERFACE_PART_STATIC(OleCache)
  1239.  
  1240.     // IOleControl
  1241.     BEGIN_INTERFACE_PART(OleControl, IOleControl)
  1242.         INIT_INTERFACE_PART(COleControl, OleControl)
  1243.         STDMETHOD(GetControlInfo)(LPCONTROLINFO pCI);
  1244.         STDMETHOD(OnMnemonic)(LPMSG pMsg);
  1245.         STDMETHOD(OnAmbientPropertyChange)(DISPID dispid);
  1246.         STDMETHOD(FreezeEvents)(BOOL bFreeze);
  1247.     END_INTERFACE_PART(OleControl)
  1248.  
  1249.     // IProvideClassInfo2
  1250.     BEGIN_INTERFACE_PART(ProvideClassInfo, IProvideClassInfo2)
  1251.         INIT_INTERFACE_PART(COleControl, ProvideClassInfo)
  1252.         STDMETHOD(GetClassInfo)(LPTYPEINFO* ppTypeInfo);
  1253.         STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID* pGUID);
  1254.     END_INTERFACE_PART_STATIC(ProvideClassInfo)
  1255.  
  1256.     // ISpecifyPropertyPages
  1257.     BEGIN_INTERFACE_PART(SpecifyPropertyPages, ISpecifyPropertyPages)
  1258.         INIT_INTERFACE_PART(COleControl, SpecifyPropertyPages)
  1259.         STDMETHOD(GetPages)(CAUUID*);
  1260.     END_INTERFACE_PART_STATIC(SpecifyPropertyPages)
  1261.  
  1262.     // IPerPropertyBrowsing
  1263.     BEGIN_INTERFACE_PART(PerPropertyBrowsing, IPerPropertyBrowsing)
  1264.         INIT_INTERFACE_PART(COleControl, PerPropertyBrowsing)
  1265.         STDMETHOD(GetDisplayString)(DISPID dispid, BSTR* lpbstr);
  1266.         STDMETHOD(MapPropertyToPage)(DISPID dispid, LPCLSID lpclsid);
  1267.         STDMETHOD(GetPredefinedStrings)(DISPID dispid,
  1268.             CALPOLESTR* lpcaStringsOut, CADWORD* lpcaCookiesOut);
  1269.         STDMETHOD(GetPredefinedValue)(DISPID dispid, DWORD dwCookie,
  1270.             VARIANT* lpvarOut);
  1271.     END_INTERFACE_PART_STATIC(PerPropertyBrowsing)
  1272.  
  1273.     // IPropertyNotifySink for font updates (not exposed via QueryInterface)
  1274.     BEGIN_INTERFACE_PART(FontNotification, IPropertyNotifySink)
  1275.         INIT_INTERFACE_PART(COleControl, FontNotification)
  1276.         STDMETHOD(OnChanged)(DISPID dispid);
  1277.         STDMETHOD(OnRequestEdit)(DISPID dispid);
  1278.     END_INTERFACE_PART_STATIC(FontNotification)
  1279.  
  1280.     // IQuickActivate
  1281.     BEGIN_INTERFACE_PART(QuickActivate, IQuickActivate)
  1282.         STDMETHOD(QuickActivate)(QACONTAINER *pQAContainer, QACONTROL *pqacontrol);
  1283.         STDMETHOD(SetContentExtent)(LPSIZEL lpsizel);
  1284.         STDMETHOD(GetContentExtent)(LPSIZEL lpsizel);
  1285.     END_INTERFACE_PART_STATIC(QuickActivate)
  1286.  
  1287.     // IPointerInactive
  1288.     BEGIN_INTERFACE_PART(PointerInactive, IPointerInactive)
  1289.         STDMETHOD(GetActivationPolicy)(DWORD* pdwPolicy);
  1290.         STDMETHOD(OnInactiveSetCursor)(LPCRECT lprcBounds, long x, long y,
  1291.             DWORD dwMouseMsg, BOOL bSetAlways);
  1292.         STDMETHOD(OnInactiveMouseMove)(LPCRECT lprcBounds, long x, long y,
  1293.             DWORD dwKeyState);
  1294.     END_INTERFACE_PART_STATIC(PointerInactive)
  1295.  
  1296.     DECLARE_INTERFACE_MAP()
  1297.  
  1298. // Connection maps
  1299. protected:
  1300.     // Connection point for events
  1301.     BEGIN_CONNECTION_PART(COleControl, EventConnPt)
  1302.         virtual void OnAdvise(BOOL bAdvise);
  1303.         virtual REFIID GetIID();
  1304.         virtual LPUNKNOWN QuerySinkInterface(LPUNKNOWN pUnkSink);
  1305.     END_CONNECTION_PART(EventConnPt)
  1306.  
  1307.     // Connection point for property notifications
  1308.     BEGIN_CONNECTION_PART(COleControl, PropConnPt)
  1309.         CONNECTION_IID(IID_IPropertyNotifySink)
  1310.     END_CONNECTION_PART(PropConnPt)
  1311.  
  1312.     DECLARE_CONNECTION_MAP()
  1313. };
  1314.  
  1315. /////////////////////////////////////////////////////////////////////////////
  1316. // Registry functions
  1317.  
  1318. enum AFX_REG_FLAGS
  1319. {
  1320.     afxRegDefault               = 0x0000,
  1321.     afxRegInsertable            = 0x0001,
  1322.     afxRegApartmentThreading    = 0x0002,
  1323. };
  1324.  
  1325. BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid,
  1326.     LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL);
  1327.  
  1328. BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlid, WORD wVerMajor = 0,
  1329.     WORD wVerMinor = 0, LCID lcid = 0);
  1330.  
  1331. BOOL AFXAPI AfxOleRegisterControlClass(HINSTANCE hInstance, REFCLSID clsid,
  1332.     LPCTSTR pszProgID, UINT idTypeName, UINT idBitmap, int nRegFlags,
  1333.     DWORD dwMiscStatus, REFGUID tlid, WORD wVerMajor, WORD wVerMinor);
  1334.  
  1335. BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsid, LPCTSTR pszProgID);
  1336.  
  1337. BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
  1338.     REFCLSID clsid, UINT idTypeName);
  1339.  
  1340. BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
  1341.     REFCLSID clsid, UINT idTypeName, int nRegFlags);
  1342.  
  1343. /////////////////////////////////////////////////////////////////////////////
  1344. // Licensing functions
  1345.  
  1346. BOOL AFXAPI AfxVerifyLicFile(HINSTANCE hInstance, LPCTSTR pszLicFileName,
  1347.     LPCOLESTR pszLicFileContents, UINT cch=-1);
  1348.  
  1349. /////////////////////////////////////////////////////////////////////////////
  1350. // CPropExchange - Abstract base class for property exchange
  1351.  
  1352. #ifdef _AFXDLL
  1353. class CPropExchange
  1354. #else
  1355. class AFX_NOVTABLE CPropExchange
  1356. #endif
  1357. {
  1358. // Operations
  1359. public:
  1360.     BOOL IsLoading();
  1361.     DWORD GetVersion();
  1362.  
  1363.     BOOL IsAsynchronous();
  1364.     // FALSE -> Do Sync stuff, and start async stuff if possible
  1365.     // TRUE -> Do not do Sync stuff.  Always start Async stuff
  1366.  
  1367.     virtual BOOL ExchangeVersion(DWORD& dwVersionLoaded, DWORD dwVersionDefault,
  1368.         BOOL bConvert);
  1369.  
  1370.     virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  1371.                 void* pvProp, const void* pvDefault = NULL) = 0;
  1372.     virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, HGLOBAL* phBlob,
  1373.                 HGLOBAL hBlobDefault = NULL) = 0;
  1374.     virtual BOOL ExchangeFontProp(LPCTSTR pszPropName, CFontHolder& font,
  1375.                 const FONTDESC* pFontDesc,
  1376.                 LPFONTDISP pFontDispAmbient) = 0;
  1377.     virtual BOOL ExchangePersistentProp(LPCTSTR pszPropName,
  1378.                 LPUNKNOWN* ppUnk, REFIID iid, LPUNKNOWN pUnkDefault) = 0;
  1379.  
  1380. // Implementation
  1381. protected:
  1382.     CPropExchange();
  1383.     BOOL m_bLoading;
  1384.     BOOL m_bAsync;
  1385.     DWORD m_dwVersion;
  1386. };
  1387.  
  1388. /////////////////////////////////////////////////////////////////////////////
  1389. // Property-exchange (PX_) helper functions
  1390.  
  1391. BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue);
  1392.  
  1393. BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue,
  1394.     short sDefault);
  1395.  
  1396. BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue);
  1397.  
  1398. BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue,
  1399.     USHORT usDefault);
  1400.  
  1401. BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue);
  1402.  
  1403. BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue,
  1404.     long lDefault);
  1405.  
  1406. BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue);
  1407.  
  1408. BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue,
  1409.     ULONG ulDefault);
  1410.  
  1411. BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue);
  1412.  
  1413. BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue,
  1414.     OLE_COLOR clrDefault);
  1415.  
  1416. BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue);
  1417.  
  1418. BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue,
  1419.     BOOL bDefault);
  1420.  
  1421. BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue);
  1422.  
  1423. BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue,
  1424.     const CString& strDefault);
  1425. BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue,
  1426.     LPCTSTR lpszDefault);
  1427.  
  1428. BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue);
  1429.  
  1430. BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue,
  1431.     CY cyDefault);
  1432.  
  1433. BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue);
  1434.  
  1435. BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue,
  1436.     float floatDefault);
  1437.  
  1438. BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue);
  1439.  
  1440. BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue,
  1441.     double doubleDefault);
  1442.  
  1443. BOOL AFX_CDECL PX_Blob(CPropExchange* pPX, LPCTSTR pszPropName, HGLOBAL& hBlob,
  1444.     HGLOBAL hBlobDefault = NULL);
  1445.  
  1446. BOOL AFX_CDECL PX_Font(CPropExchange* pPX, LPCTSTR pszPropName, CFontHolder& font,
  1447.     const FONTDESC* pFontDesc = NULL,
  1448.     LPFONTDISP pFontDispAmbient = NULL);
  1449.  
  1450. BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
  1451.     CPictureHolder& pict);
  1452.  
  1453. BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
  1454.     CPictureHolder& pict, CPictureHolder& pictDefault);
  1455.  
  1456. BOOL AFX_CDECL PX_IUnknown(CPropExchange* pPX, LPCTSTR pszPropName, LPUNKNOWN& pUnk,
  1457.     REFIID iid, LPUNKNOWN pUnkDefault = NULL);
  1458.  
  1459. BOOL AFX_CDECL PX_VBXFontConvert(CPropExchange* pPX, CFontHolder& font);
  1460.  
  1461. BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName,
  1462.     CDataPathProperty& dataPathProp, LPCTSTR pszDefault = NULL);
  1463.  
  1464. BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName,
  1465.     CDataPathProperty& dataPathProp, const CString& strDefault);
  1466.  
  1467. /////////////////////////////////////////////////////////////////////////////
  1468. // Structures used by COlePropertyPage
  1469.  
  1470. typedef struct tagAFX_PPFIELDSTATUS
  1471. {
  1472.     UINT    nID;
  1473.     BOOL    bDirty;
  1474.  
  1475. } AFX_PPFIELDSTATUS;
  1476.  
  1477. /////////////////////////////////////////////////////////////////////////////
  1478. // Property Page Dialog Class
  1479.  
  1480. #ifdef _AFXDLL
  1481. class COlePropertyPage : public CDialog
  1482. #else
  1483. class AFX_NOVTABLE COlePropertyPage : public CDialog
  1484. #endif
  1485. {
  1486.     DECLARE_DYNAMIC(COlePropertyPage)
  1487.  
  1488. // Constructors
  1489. public:
  1490.     COlePropertyPage(UINT idDlg, UINT idCaption);
  1491.  
  1492. // Operations
  1493.     LPDISPATCH* GetObjectArray(ULONG* pnObjects);
  1494.     void SetModifiedFlag(BOOL bModified = TRUE);
  1495.     BOOL IsModified();
  1496.     LPPROPERTYPAGESITE GetPageSite();
  1497.     void SetDialogResource(HGLOBAL hDialog);
  1498.     void SetPageName(LPCTSTR lpszPageName);
  1499.     void SetHelpInfo(LPCTSTR lpszDocString, LPCTSTR lpszHelpFile = NULL,
  1500.         DWORD dwHelpContext = 0);
  1501.  
  1502.     BOOL GetControlStatus(UINT nID);
  1503.     BOOL SetControlStatus(UINT nID, BOOL bDirty);
  1504.     void IgnoreApply(UINT nID);
  1505.  
  1506.     int MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL,
  1507.             UINT nType = MB_OK);
  1508.     // note that this is a non-virtual override of CWnd::MessageBox()
  1509.  
  1510. // Overridables
  1511.     virtual void OnSetPageSite();
  1512.     virtual void OnObjectsChanged();
  1513.     virtual BOOL OnHelp(LPCTSTR lpszHelpDir);
  1514.     virtual BOOL OnInitDialog();
  1515.     virtual BOOL OnEditProperty(DISPID dispid);
  1516.  
  1517. // Implementation
  1518.  
  1519.     // DDP_ property get/set helper routines
  1520.     BOOL SetPropText(LPCTSTR pszPropName, BYTE &Value);
  1521.     BOOL GetPropText(LPCTSTR pszPropName, BYTE* pValue);
  1522.     BOOL SetPropText(LPCTSTR pszPropName, short &Value);
  1523.     BOOL GetPropText(LPCTSTR pszPropName, short* pValue);
  1524.     BOOL SetPropText(LPCTSTR pszPropName, int &Value);
  1525.     BOOL GetPropText(LPCTSTR pszPropName, int* pValue);
  1526.     BOOL SetPropText(LPCTSTR pszPropName, UINT &Value);
  1527.     BOOL GetPropText(LPCTSTR pszPropName, UINT* pValue);
  1528.     BOOL SetPropText(LPCTSTR pszPropName, long &Value);
  1529.     BOOL GetPropText(LPCTSTR pszPropName, long* pValue);
  1530.     BOOL SetPropText(LPCTSTR pszPropName, DWORD &Value);
  1531.     BOOL GetPropText(LPCTSTR pszPropName, DWORD* pValue);
  1532.     BOOL SetPropText(LPCTSTR pszPropName, CString &Value);
  1533.     BOOL GetPropText(LPCTSTR pszPropName, CString* pValue);
  1534.     BOOL SetPropText(LPCTSTR pszPropName, float &Value);
  1535.     BOOL GetPropText(LPCTSTR pszPropName, float* pValue);
  1536.     BOOL SetPropText(LPCTSTR pszPropName, double &Value);
  1537.     BOOL GetPropText(LPCTSTR pszPropName, double* pValue);
  1538.     BOOL SetPropCheck(LPCTSTR pszPropName, int Value);
  1539.     BOOL GetPropCheck(LPCTSTR pszPropName, int* pValue);
  1540.     BOOL SetPropRadio(LPCTSTR pszPropName, int Value);
  1541.     BOOL GetPropRadio(LPCTSTR pszPropName, int* pValue);
  1542.     BOOL SetPropIndex(LPCTSTR pszPropName, int Value);
  1543.     BOOL GetPropIndex(LPCTSTR pszPropName, int* pValue);
  1544.     CPtrArray m_arrayDDP;      // pending DDP data
  1545.  
  1546.     // Destructors
  1547.     ~COlePropertyPage();
  1548.  
  1549. protected:
  1550.     LRESULT WindowProc(UINT msg, WPARAM wParam, LPARAM lParam);
  1551.     BOOL OnCommand(WPARAM wParam, LPARAM lParam);
  1552.     BOOL PreTranslateMessage(LPMSG lpMsg);
  1553.     virtual void OnFinalRelease();
  1554.     void CleanupObjectArray();
  1555.     static BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
  1556.     static BOOL CALLBACK EnumControls(HWND hWnd, LPARAM lParam);
  1557.  
  1558. private:
  1559.     BOOL m_bDirty;
  1560.     UINT m_idDlg;
  1561.     UINT m_idCaption;
  1562.     CString m_strPageName;
  1563.     SIZE m_sizePage;
  1564.     CString m_strDocString;
  1565.     CString m_strHelpFile;
  1566.     DWORD m_dwHelpContext;
  1567.     LPPROPERTYPAGESITE m_pPageSite;
  1568.  
  1569.     LPDISPATCH* m_ppDisp;   // Array of IDispatch pointers, used to
  1570.                                 // access the properties of each control
  1571.  
  1572.     LPDWORD m_pAdvisors;        // Array of connection tokens used by
  1573.                                 // IConnecitonPoint::Advise/UnAdvise.
  1574.  
  1575.     BOOL m_bPropsChanged;       // IPropertyNotifySink::OnChanged has been
  1576.                                 // called, but not acted upon yet.
  1577.  
  1578.     ULONG m_nObjects;           // Objects in m_ppDisp, m_ppDataObj, m_pAdvisors
  1579.  
  1580.     BOOL m_bInitializing;       // TRUE if the contents of the fields of
  1581.                                 // the dialog box are being initialized
  1582.  
  1583.     int m_nControls;            // Number of fields on this property page
  1584.  
  1585.     AFX_PPFIELDSTATUS* m_pStatus;   // Array containing information on
  1586.                                     // which fields are dirty
  1587.  
  1588.     CDWordArray m_IDArray;      // Array containing information on which
  1589.                                 // controls to ignore when deciding if
  1590.                                 // the apply button is to be enabled
  1591.  
  1592.     HGLOBAL m_hDialog;          // Handle of the dialog resource
  1593.  
  1594. #ifdef _DEBUG
  1595. protected:
  1596.     BOOL m_bNonStandardSize;
  1597. #endif
  1598.  
  1599. protected:
  1600.     // Generated message map functions
  1601.     //{{AFX_MSG(COlePropertyPage)
  1602.     afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
  1603.     //}}AFX_MSG
  1604.     DECLARE_MESSAGE_MAP()
  1605.  
  1606. // Interface Maps
  1607. public:
  1608.     BEGIN_INTERFACE_PART(PropertyPage, IPropertyPage2)
  1609.         INIT_INTERFACE_PART(COlePropertyPage, PropertyPage)
  1610.         STDMETHOD(SetPageSite)(LPPROPERTYPAGESITE);
  1611.         STDMETHOD(Activate)(HWND, LPCRECT, BOOL);
  1612.         STDMETHOD(Deactivate)();
  1613.         STDMETHOD(GetPageInfo)(LPPROPPAGEINFO);
  1614.         STDMETHOD(SetObjects)(ULONG, LPUNKNOWN*);
  1615.         STDMETHOD(Show)(UINT);
  1616.         STDMETHOD(Move)(LPCRECT);
  1617.         STDMETHOD(IsPageDirty)();
  1618.         STDMETHOD(Apply)();
  1619.         STDMETHOD(Help)(LPCOLESTR);
  1620.         STDMETHOD(TranslateAccelerator)(LPMSG);
  1621.         STDMETHOD(EditProperty)(DISPID);
  1622.     END_INTERFACE_PART(PropertyPage)
  1623.  
  1624.     BEGIN_INTERFACE_PART(PropNotifySink, IPropertyNotifySink)
  1625.         INIT_INTERFACE_PART(COlePropertyPage, PropNotifySink)
  1626.         STDMETHOD(OnRequestEdit)(DISPID);
  1627.         STDMETHOD(OnChanged)(DISPID);
  1628.     END_INTERFACE_PART(PropNotifySink)
  1629.  
  1630.     DECLARE_INTERFACE_MAP()
  1631. };
  1632.  
  1633. /////////////////////////////////////////////////////////////////////////////
  1634. //  CStockPropPage
  1635.  
  1636. #ifdef _AFXDLL
  1637. class CStockPropPage : public COlePropertyPage
  1638. #else
  1639. class AFX_NOVTABLE CStockPropPage : public COlePropertyPage
  1640. #endif
  1641. {
  1642.     DECLARE_DYNAMIC(CStockPropPage)
  1643.  
  1644. // Constructor
  1645. public:
  1646.     CStockPropPage(UINT idDlg, UINT idCaption);
  1647.  
  1648. // Implementation
  1649. protected:
  1650.     void FillPropnameList(REFGUID guid, int nIndirect, CComboBox& combo);
  1651.     void OnSelchangePropname(CComboBox& combo);
  1652.     BOOL OnEditProperty(DISPID dispid, CComboBox& combo);
  1653.  
  1654.     LCID m_lcid;
  1655.     CString m_strPropName;
  1656.     int m_iPropName;
  1657.  
  1658.     DECLARE_MESSAGE_MAP()
  1659. };
  1660.  
  1661. ///////////////////////////////////////////////////////////////////////////////
  1662. // CColorButton: used by CColorPropPage
  1663.  
  1664. class CColorButton : public CButton
  1665. {
  1666. public:
  1667.     CColorButton(void);
  1668.     void SetFaceColor(COLORREF colFace);
  1669.     COLORREF colGetFaceColor(void);
  1670.     void SetState(BOOL fSelected);
  1671.     static UINT idClicked;
  1672. protected:
  1673.     virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  1674. private:
  1675.     BOOL m_fSelected;
  1676.     COLORREF m_colFace;
  1677. };
  1678.  
  1679. /////////////////////////////////////////////////////////////////////////////
  1680. // CColorPropPage
  1681.  
  1682. class CColorPropPage : public CStockPropPage
  1683. {
  1684.     DECLARE_DYNCREATE(CColorPropPage)
  1685. #ifdef _AFXDLL
  1686.     DECLARE_OLECREATE_EX(CColorPropPage)
  1687. #endif
  1688.  
  1689. // Construction
  1690. public:
  1691.     CColorPropPage();   // Constructor
  1692.  
  1693. // Dialog Data
  1694.     //{{AFX_DATA(CColorPropPage)
  1695.     enum { IDD = AFX_IDD_PROPPAGE_COLOR };
  1696.     CComboBox   m_SysColors;
  1697.     CComboBox   m_ColorProp;
  1698.     //}}AFX_DATA
  1699.  
  1700. // Implementation
  1701. public:
  1702.     enum { NBUTTONS = 16 };
  1703.  
  1704. protected:
  1705.     virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV support
  1706.     virtual BOOL OnInitDialog(void);
  1707.     virtual BOOL OnEditProperty(DISPID dispid);
  1708.     virtual void OnObjectsChanged();
  1709.     void FillSysColors();
  1710.     BOOL SetColorProp(CDataExchange* pDX, COLORREF color, LPCTSTR pszPropName);
  1711.     BOOL GetColorProp(CDataExchange* pDX, COLORREF* pcolor, LPCTSTR pszPropName);
  1712.  
  1713. private:
  1714.     CColorButton m_Buttons[NBUTTONS];
  1715.     CColorButton *m_pSelectedButton;
  1716.  
  1717.     void SetButton(CColorButton *Button);
  1718.  
  1719.     // Generated message map functions
  1720.     //{{AFX_MSG(CColorPropPage)
  1721.     afx_msg void OnSelchangeColorprop();
  1722.     afx_msg void OnSelect(void);
  1723.     afx_msg void OnSelchangeSystemcolors();
  1724.     //}}AFX_MSG
  1725.  
  1726.     DECLARE_MESSAGE_MAP()
  1727. };
  1728.  
  1729. // Stores all the information about a font
  1730. typedef struct tagFONTOBJECT
  1731. {
  1732.     CString strName;
  1733.     CY  cySize;
  1734.     BOOL bBold;
  1735.     BOOL bItalic;
  1736.     BOOL bUnderline;
  1737.     BOOL bStrikethrough;
  1738.     short sWeight;
  1739. } FONTOBJECT;
  1740.  
  1741. // Merge objects are used when trying to consolidate multiple font properties.
  1742. // If the characteristics of these multiple properties differ then this is
  1743. // represented in the merge object.
  1744. typedef struct tagMERGEOBJECT
  1745. {
  1746.     BOOL bNameOK;
  1747.     BOOL bSizeOK;
  1748.     BOOL bStyleOK;
  1749.     BOOL bUnderlineOK;
  1750.     BOOL bStrikethroughOK;
  1751. } MERGEOBJECT;
  1752.  
  1753. /////////////////////////////////////////////////////////////////////////////
  1754. // CSizeComboBox window
  1755.  
  1756. class CSizeComboBox : public CComboBox
  1757. {
  1758. // Operations
  1759. public:
  1760.     int AddSize(int PointSize, LONG lfHeight);
  1761.  
  1762.     void            GetPointSize(CY& cy);
  1763.     LONG            GetHeight(int sel=-1);
  1764.     void            UpdateLogFont( LPLOGFONT lpLF, int sel=-1 );
  1765. };
  1766.  
  1767. /////////////////////////////////////////////////////////////////////////////
  1768. // CFontComboBox window
  1769.  
  1770. struct FONTITEM_PPG
  1771. {
  1772.     DWORD dwFontType;
  1773.     LOGFONT lf;
  1774. };
  1775.  
  1776. class CFontComboBox : public CComboBox
  1777. {
  1778. // Construction
  1779. public:
  1780.     CFontComboBox();
  1781.     virtual ~CFontComboBox();
  1782.  
  1783. // Operations
  1784. public:
  1785.     int AddFont(LOGFONT *, DWORD);
  1786.     CString GetCurrentName();
  1787.  
  1788.     FONTITEM_PPG* GetFontItem(int sel=-1);
  1789.     LPLOGFONT GetLogFont(int sel=-1);
  1790.     DWORD GetFontType(int sel=-1);
  1791.  
  1792. // Implementation
  1793. public:
  1794.     virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
  1795.     virtual void DeleteItem(LPDELETEITEMSTRUCT lpDIS);
  1796.  
  1797. protected:
  1798.     CBitmap m_bmpTrueType;
  1799.     CBitmap m_bmpMask;
  1800. };
  1801.  
  1802. ///////////////////////////////////////////////////////////////////////////
  1803. // CFontPropPage class
  1804.  
  1805. class CFontPropPage : public CStockPropPage
  1806. {
  1807.     DECLARE_DYNCREATE(CFontPropPage)
  1808. #ifdef _AFXDLL
  1809.     DECLARE_OLECREATE_EX(CFontPropPage)
  1810. #endif
  1811.  
  1812. public:
  1813.     CFontPropPage();
  1814.  
  1815.     // Dialog Data
  1816.     //{{AFX_DATA(CFontPropPage)
  1817.     enum { IDD = AFX_IDD_PROPPAGE_FONT };
  1818.     CComboBox   m_FontProp;
  1819.     CStatic m_SampleBox;
  1820.     CComboBox   m_FontStyles;
  1821.     CSizeComboBox   m_FontSizes;
  1822.     CFontComboBox   m_FontNames;
  1823.     //}}AFX_DATA
  1824.  
  1825. // Attributes
  1826. protected:
  1827.     int nPixelsY;
  1828.     CFont SampleFont;
  1829.     DWORD m_nCurrentStyle;
  1830.     DWORD m_nActualStyle;
  1831.     DWORD m_nStyles;
  1832.     BOOL m_bStrikeOut;
  1833.     BOOL m_bUnderline;
  1834.     CString m_strFontSize;
  1835.  
  1836. // Implementation
  1837. protected:
  1838.  
  1839.     void FillFacenameList();
  1840.     void FillSizeList();
  1841.     virtual void DoDataExchange(CDataExchange* pDX);
  1842.     virtual void OnPaint();
  1843.     virtual BOOL OnEditProperty(DISPID dispid);
  1844.     virtual void OnObjectsChanged();
  1845.     void UpdateSampleFont();
  1846.     void SelectFontFromList(CString strFaceName, MERGEOBJECT* pmobj);
  1847.  
  1848.     //{{AFX_MSG(CFontPropPage)
  1849.     virtual BOOL OnInitDialog();
  1850.     afx_msg void OnEditupdateFontnames();
  1851.     afx_msg void OnEditupdateFontsizes();
  1852.     afx_msg void OnSelchangeFontnames();
  1853.     afx_msg void OnSelchangeFontsizes();
  1854.     afx_msg void OnSelchangeFontstyles();
  1855.     afx_msg void OnEditchangeFontstyles();
  1856.     afx_msg void OnStrikeout();
  1857.     afx_msg void OnUnderline();
  1858.     afx_msg void OnSelchangeFontprop();
  1859.     //}}AFX_MSG
  1860.     DECLARE_MESSAGE_MAP()
  1861.  
  1862.     static int CALLBACK EnumFontFamiliesCallBack(ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int FontType, LPARAM lParam);
  1863.     static int CALLBACK EnumFontFamiliesCallBack2(ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int FontType, LPARAM lParam);
  1864.  
  1865.     BOOL SetFontProps(CDataExchange* pDX, FONTOBJECT fobj, LPCTSTR pszPropName);
  1866.     BOOL GetFontProps(CDataExchange* pDX, FONTOBJECT*  pfobj, LPCTSTR pszPropName, MERGEOBJECT* pmobj);
  1867. };
  1868.  
  1869. ////////////////////////////////////////////////////////////////////////////
  1870. //  CPicturePropPage
  1871.  
  1872. class CPicturePropPage : public CStockPropPage
  1873. {
  1874.     DECLARE_DYNCREATE(CPicturePropPage)
  1875. #ifdef _AFXDLL
  1876.     DECLARE_OLECREATE_EX(CPicturePropPage)
  1877. #endif
  1878.  
  1879. // Construction
  1880. public:
  1881.     CPicturePropPage(); // standard constructor
  1882.     ~CPicturePropPage();
  1883.  
  1884. // Dialog Data
  1885.     //{{AFX_DATA(CPicturePropPage)
  1886.     enum { IDD = AFX_IDD_PROPPAGE_PICTURE };
  1887.     CComboBox   m_PropName;
  1888.     CStatic m_Static;
  1889.     //}}AFX_DATA
  1890.  
  1891. // Implementation
  1892. protected:
  1893.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  1894.     virtual BOOL OnInitDialog(void);
  1895.     virtual BOOL OnEditProperty(DISPID dispid);
  1896.     virtual void OnObjectsChanged();
  1897.  
  1898.     BOOL SetPictureProp(CDataExchange* pDX, LPPICTUREDISP pPictDisp, LPCTSTR pszPropName);
  1899.     BOOL GetPictureProp(CDataExchange* pDX, LPPICTUREDISP* ppPictDisp, LPCTSTR pszPropName);
  1900.     void ChangePicture(LPPICTURE pPict);
  1901.  
  1902.     LPPICTUREDISP m_pPictDisp;
  1903.  
  1904. // Generated message map functions
  1905. protected:
  1906.     //{{AFX_MSG(CPicturePropPage)
  1907.     afx_msg void OnPaint();
  1908.     afx_msg void OnBrowse();
  1909.     afx_msg void OnClear();
  1910.     afx_msg void OnSelchangePictProp();
  1911.     //}}AFX_MSG
  1912.     DECLARE_MESSAGE_MAP()
  1913. };
  1914.  
  1915. /////////////////////////////////////////////////////////////////////////////
  1916. // Property Page Dialog Data Exchange routines
  1917.  
  1918. // simple text operations
  1919. void AFXAPI DDP_Text(CDataExchange*pDX, int id, BYTE& member, LPCTSTR pszPropName);
  1920. void AFXAPI DDP_Text(CDataExchange*pDX, int id, short& member, LPCTSTR pszPropName);
  1921. void AFXAPI DDP_Text(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1922. void AFXAPI DDP_Text(CDataExchange*pDX, int id, UINT& member, LPCTSTR pszPropName);
  1923. void AFXAPI DDP_Text(CDataExchange*pDX, int id, long& member, LPCTSTR pszPropName);
  1924. void AFXAPI DDP_Text(CDataExchange*pDX, int id, DWORD& member, LPCTSTR pszPropName);
  1925. void AFXAPI DDP_Text(CDataExchange*pDX, int id, float& member, LPCTSTR pszPropName);
  1926. void AFXAPI DDP_Text(CDataExchange*pDX, int id, double& member, LPCTSTR pszPropName);
  1927. void AFXAPI DDP_Text(CDataExchange*pDX, int id, CString& member, LPCTSTR pszPropName);
  1928. void AFXAPI DDP_Check(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1929. void AFXAPI DDP_Radio(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1930. void AFXAPI DDP_LBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1931. void AFXAPI DDP_LBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1932. void AFXAPI DDP_LBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
  1933. void AFXAPI DDP_CBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1934. void AFXAPI DDP_CBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1935. void AFXAPI DDP_CBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
  1936. void AFXAPI DDP_PostProcessing(CDataExchange *pDX);
  1937.  
  1938. ////////////////////////////////////////////////////////////////////////////
  1939. // AfxOleTypeMatchGuid - Tests whether a given TYPEDESC matches a type with a
  1940. // given GUID, when all aliases have been expanded.
  1941.  
  1942. BOOL AFXAPI AfxOleTypeMatchGuid(LPTYPEINFO pTypeInfo,
  1943.     TYPEDESC* pTypeDesc, REFGUID guidType, ULONG cIndirectionLevels);
  1944.  
  1945. /////////////////////////////////////////////////////////////////////////////
  1946. // Inline function declarations
  1947.  
  1948. #ifdef _AFX_PACKING
  1949. #pragma pack(pop)
  1950. #endif
  1951.  
  1952. #ifdef _AFX_ENABLE_INLINES
  1953. #define _AFXCTL_INLINE AFX_INLINE
  1954. #include <afxctl.inl>
  1955. #endif
  1956.  
  1957. #undef AFX_DATA
  1958. #define AFX_DATA
  1959.  
  1960. #ifdef _AFX_MINREBUILD
  1961. #pragma component(minrebuild, on)
  1962. #endif
  1963. #ifndef _AFX_FULLTYPEINFO
  1964. #pragma component(mintypeinfo, off)
  1965. #endif
  1966.  
  1967. #endif // __AFXCTL_H__
  1968.  
  1969. /////////////////////////////////////////////////////////////////////////////
  1970.