home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / mfcinc.pak / AFXCTL.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  50KB  |  1,411 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1995 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. #ifndef _AFXDLL
  18.     #error Please define _AFXDLL when including afxctl.h
  19. #endif
  20.  
  21. // make sure afxole.h is included first
  22. #ifndef __AFXOLE_H_
  23.     #include <afxole.h>
  24. #endif
  25.  
  26. // include OLE Control header
  27. #ifndef _OLECTL_H_
  28.     #include <olectl.h>
  29. #endif
  30.  
  31. #ifdef _AFX_MINREBUILD
  32. #pragma component(minrebuild, off)
  33. #endif
  34. #ifndef _AFX_FULLTYPEINFO
  35. #pragma component(mintypeinfo, on)
  36. #endif
  37.  
  38. /////////////////////////////////////////////////////////////////////////////
  39. // Classes declared in this file
  40.  
  41. //CWinApp
  42.     class COleControlModule;        // Module housekeeping for an .OCX
  43.  
  44. class CFontHolder;                  // For manipulating font objects
  45. class CPictureHolder;               // For manipulating picture objects
  46.  
  47. //CWnd
  48.     class COleControl;              // OLE Control
  49.  
  50. //CDialog
  51.     class COlePropertyPage;         // OLE Property page
  52.  
  53. class CPropExchange;                // Abstract base for property exchange
  54.  
  55. /////////////////////////////////////////////////////////////////////////////
  56. // Set structure packing
  57.  
  58. #ifdef _AFX_PACKING
  59. #pragma pack(push, _AFX_PACKING)
  60. #endif
  61.  
  62. /////////////////////////////////////////////////////////////////////////////
  63. // MFC data definition for data exported from the runtime DLL
  64.  
  65. #undef AFX_DATA
  66. #define AFX_DATA AFX_OLE_DATA
  67.  
  68. /////////////////////////////////////////////////////////////////////////////
  69. // COleControlModule - base class for .OCX module
  70. //  This object is statically linked into the control.
  71.  
  72. class COleControlModule : public CWinApp
  73. {
  74.     DECLARE_DYNAMIC(COleControlModule)
  75. public:
  76.     virtual BOOL InitInstance();
  77.     virtual int ExitInstance();
  78. };
  79.  
  80. /////////////////////////////////////////////////////////////////////////////
  81. //  Module state macro
  82.  
  83. #define AfxGetControlModuleContext  AfxGetStaticModuleState
  84. #define _afxModuleAddrThis AfxGetStaticModuleState()
  85.  
  86. /////////////////////////////////////////////////////////////////////////////
  87. // Connection helper functions
  88.  
  89. BOOL AFXAPI AfxConnectionAdvise(LPUNKNOWN pUnkSrc, REFIID iid,
  90.     LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD* pdwCookie);
  91.  
  92. BOOL AFXAPI AfxConnectionUnadvise(LPUNKNOWN pUnkSrc, REFIID iid,
  93.     LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD dwCookie);
  94.  
  95. /////////////////////////////////////////////////////////////////////////////
  96. // Event maps
  97.  
  98. enum AFX_EVENTMAP_FLAGS
  99. {
  100.     afxEventCustom = 0,
  101.     afxEventStock = 1,
  102. };
  103.  
  104. struct AFX_EVENTMAP_ENTRY
  105. {
  106.     AFX_EVENTMAP_FLAGS flags;
  107.     DISPID dispid;
  108.     LPCTSTR pszName;
  109.     LPCSTR lpszParams;
  110. };
  111.  
  112. struct AFX_EVENTMAP
  113. {
  114.     const AFX_EVENTMAP* lpBaseEventMap;
  115.     const AFX_EVENTMAP_ENTRY* lpEntries;
  116. };
  117.  
  118. #define DECLARE_EVENT_MAP() \
  119. private: \
  120.     static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[]; \
  121. protected: \
  122.     static const AFX_DATA AFX_EVENTMAP eventMap; \
  123.     virtual const AFX_EVENTMAP* GetEventMap() const;
  124.  
  125. #define BEGIN_EVENT_MAP(theClass, baseClass) \
  126.     const AFX_EVENTMAP* theClass::GetEventMap() const \
  127.         { return &eventMap; } \
  128.     const AFX_DATADEF AFX_EVENTMAP theClass::eventMap = \
  129.         { &(baseClass::eventMap), theClass::_eventEntries }; \
  130.     const AFX_DATADEF AFX_EVENTMAP_ENTRY theClass::_eventEntries[] = \
  131.     {
  132.  
  133. #define END_EVENT_MAP() \
  134.         { afxEventCustom, DISPID_UNKNOWN, NULL, NULL }, \
  135.     };
  136.  
  137. #define EVENT_CUSTOM(pszName, pfnFire, vtsParams) \
  138.     { afxEventCustom, DISPID_UNKNOWN, _T(pszName), vtsParams },
  139.  
  140. #define EVENT_CUSTOM_ID(pszName, dispid, pfnFire, vtsParams) \
  141.     { afxEventCustom, dispid, _T(pszName), vtsParams },
  142.  
  143. #define EVENT_PARAM(vtsParams) (BYTE*)(vtsParams)
  144.  
  145. /////////////////////////////////////////////////////////////////////////////
  146. // Stock events
  147.  
  148. #define EVENT_STOCK_CLICK() \
  149.     { afxEventStock, DISPID_CLICK, _T("Click"), VTS_NONE },
  150.  
  151. #define EVENT_STOCK_DBLCLICK() \
  152.     { afxEventStock, DISPID_DBLCLICK, _T("DblClick"), VTS_NONE },
  153.  
  154. #define EVENT_STOCK_KEYDOWN() \
  155.     { afxEventStock, DISPID_KEYDOWN, _T("KeyDown"), VTS_PI2 VTS_I2 },
  156.  
  157. #define EVENT_STOCK_KEYPRESS() \
  158.     { afxEventStock, DISPID_KEYPRESS, _T("KeyPress"), VTS_PI2 },
  159.  
  160. #define EVENT_STOCK_KEYUP() \
  161.     { afxEventStock, DISPID_KEYUP, _T("KeyUp"), VTS_PI2 VTS_I2 },
  162.  
  163. #define EVENT_STOCK_MOUSEDOWN() \
  164.     { afxEventStock, DISPID_MOUSEDOWN, _T("MouseDown"), \
  165.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  166.  
  167. #define EVENT_STOCK_MOUSEMOVE() \
  168.     { afxEventStock, DISPID_MOUSEMOVE, _T("MouseMove"), \
  169.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  170.  
  171. #define EVENT_STOCK_MOUSEUP() \
  172.     { afxEventStock, DISPID_MOUSEUP, _T("MouseUp"), \
  173.       VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
  174.  
  175. #define EVENT_STOCK_ERROREVENT() \
  176.     { afxEventStock, DISPID_ERROREVENT, _T("Error"), \
  177.       VTS_I2 VTS_PBSTR VTS_SCODE VTS_BSTR VTS_BSTR VTS_I4 VTS_PBOOL },
  178.  
  179. // Shift state values for mouse and keyboard events
  180. #define SHIFT_MASK      0x01
  181. #define CTRL_MASK       0x02
  182. #define ALT_MASK        0x04
  183.  
  184. // Button values for mouse events
  185. #define LEFT_BUTTON     0x01
  186. #define RIGHT_BUTTON    0x02
  187. #define MIDDLE_BUTTON   0x04
  188.  
  189. /////////////////////////////////////////////////////////////////////////////
  190. // Stock properties
  191.  
  192. #define DISP_PROPERTY_STOCK(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType) \
  193.     { _T(szExternalName), dispid, NULL, vtPropType, \
  194.         (AFX_PMSG)(void (theClass::*)(void))pfnGet, \
  195.         (AFX_PMSG)(void (theClass::*)(void))pfnSet, 0, afxDispStock }, \
  196.  
  197. #define DISP_STOCKPROP_APPEARANCE() \
  198.     DISP_PROPERTY_STOCK(COleControl, "Appearance", DISPID_APPEARANCE, \
  199.         COleControl::GetAppearance, COleControl::SetAppearance, VT_I2)
  200.  
  201. #define DISP_STOCKPROP_BACKCOLOR() \
  202.     DISP_PROPERTY_STOCK(COleControl, "BackColor", DISPID_BACKCOLOR, \
  203.         COleControl::GetBackColor, COleControl::SetBackColor, VT_COLOR)
  204.  
  205. #define DISP_STOCKPROP_BORDERSTYLE() \
  206.     DISP_PROPERTY_STOCK(COleControl, "BorderStyle", DISPID_BORDERSTYLE, \
  207.         COleControl::GetBorderStyle, COleControl::SetBorderStyle, VT_I2)
  208.  
  209. #define DISP_STOCKPROP_CAPTION() \
  210.     DISP_PROPERTY_STOCK(COleControl, "Caption", DISPID_CAPTION, \
  211.         COleControl::GetText, COleControl::SetText, VT_BSTR)
  212.  
  213. #define DISP_STOCKPROP_ENABLED() \
  214.     DISP_PROPERTY_STOCK(COleControl, "Enabled", DISPID_ENABLED, \
  215.         COleControl::GetEnabled, COleControl::SetEnabled, VT_BOOL)
  216.  
  217. #define DISP_STOCKPROP_FONT() \
  218.     DISP_PROPERTY_STOCK(COleControl, "Font", DISPID_FONT, \
  219.         COleControl::GetFont, COleControl::SetFont, VT_FONT)
  220.  
  221. #define DISP_STOCKPROP_FORECOLOR() \
  222.     DISP_PROPERTY_STOCK(COleControl, "ForeColor", DISPID_FORECOLOR, \
  223.         COleControl::GetForeColor, COleControl::SetForeColor, VT_COLOR)
  224.  
  225. #define DISP_STOCKPROP_HWND() \
  226.     DISP_PROPERTY_STOCK(COleControl, "hWnd", DISPID_HWND, \
  227.         COleControl::GetHwnd, SetNotSupported, VT_HANDLE)
  228.  
  229. #define DISP_STOCKPROP_TEXT() \
  230.     DISP_PROPERTY_STOCK(COleControl, "Text", DISPID_TEXT, \
  231.         COleControl::GetText, COleControl::SetText, VT_BSTR)
  232.  
  233. /////////////////////////////////////////////////////////////////////////////
  234. // Stock methods
  235.  
  236. #define DISP_FUNCTION_STOCK(theClass, szExternalName, dispid, pfnMember, vtRetVal, vtsParams) \
  237.     { _T(szExternalName), dispid, vtsParams, vtRetVal, \
  238.         (AFX_PMSG)(void (theClass::*)(void))pfnMember, (AFX_PMSG)0, 0, \
  239.         afxDispStock }, \
  240.  
  241. #define DISP_STOCKFUNC_REFRESH() \
  242.     DISP_FUNCTION_STOCK(COleControl, "Refresh", DISPID_REFRESH, \
  243.             COleControl::Refresh, VT_EMPTY, VTS_NONE)
  244.  
  245. #define DISP_STOCKFUNC_DOCLICK() \
  246.     DISP_FUNCTION_STOCK(COleControl, "DoClick", DISPID_DOCLICK, \
  247.             COleControl::DoClick, VT_EMPTY, VTS_NONE)
  248.  
  249. /////////////////////////////////////////////////////////////////////////////
  250. // Macros for object factory and class ID
  251.  
  252. #define BEGIN_OLEFACTORY(class_name) \
  253. protected: \
  254.     class class_name##Factory : public COleObjectFactoryEx \
  255.     { \
  256.     public: \
  257.         class_name##Factory(REFCLSID clsid, CRuntimeClass* pRuntimeClass, \
  258.             BOOL bMultiInstance, LPCTSTR lpszProgID) : \
  259.                 COleObjectFactoryEx(clsid, pRuntimeClass, bMultiInstance, \
  260.                 lpszProgID) {} \
  261.         virtual BOOL UpdateRegistry(BOOL);
  262.  
  263. #define END_OLEFACTORY(class_name) \
  264.     }; \
  265.     friend class class_name##Factory; \
  266.     static AFX_DATA class_name##Factory factory; \
  267. public: \
  268.     static AFX_DATA const GUID guid; \
  269.     virtual HRESULT GetClassID(LPCLSID pclsid);
  270.  
  271. #define DECLARE_OLECREATE_EX(class_name) \
  272.     BEGIN_OLEFACTORY(class_name) \
  273.     END_OLEFACTORY(class_name)
  274.  
  275. #define IMPLEMENT_OLECREATE_EX(class_name, external_name, \
  276.             l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  277.     static const TCHAR _szProgID_##class_name[] = _T(external_name); \
  278.     AFX_DATADEF class_name::class_name##Factory class_name::factory( \
  279.         class_name::guid, RUNTIME_CLASS(class_name), FALSE, \
  280.         _szProgID_##class_name); \
  281.     const AFX_DATADEF GUID class_name::guid = \
  282.         { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; \
  283.     HRESULT class_name::GetClassID(LPCLSID pclsid) \
  284.         { *pclsid = guid; return NOERROR; }
  285.  
  286. /////////////////////////////////////////////////////////////////////////////
  287. // Macros for type name and misc status
  288.  
  289. #define DECLARE_OLECTLTYPE(class_name) \
  290.     virtual UINT GetUserTypeNameID(); \
  291.     virtual DWORD GetMiscStatus();
  292.  
  293. #define IMPLEMENT_OLECTLTYPE(class_name, idsUserTypeName, dwOleMisc) \
  294.     UINT class_name::GetUserTypeNameID() { return idsUserTypeName; } \
  295.     DWORD class_name::GetMiscStatus() { return dwOleMisc; }
  296.  
  297. /////////////////////////////////////////////////////////////////////////////
  298. // Macros for property page IDs
  299.  
  300. #define DECLARE_PROPPAGEIDS(class_name) \
  301.     protected: \
  302.         virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
  303.  
  304. #define BEGIN_PROPPAGEIDS(class_name, count) \
  305.     static CLSID _rgPropPageIDs_##class_name[count]; \
  306.     static ULONG _cPropPages_##class_name = (ULONG)-1; \
  307.     LPCLSID class_name::GetPropPageIDs(ULONG& cPropPages) { \
  308.         if (_cPropPages_##class_name == (ULONG)-1) { \
  309.             _cPropPages_##class_name = count; \
  310.             LPCLSID pIDs = _rgPropPageIDs_##class_name; \
  311.             ULONG iPageMax = count; \
  312.             ULONG iPage = 0;
  313.  
  314. #define PROPPAGEID(clsid) \
  315.             ASSERT(iPage < iPageMax); \
  316.             if (iPage < iPageMax) \
  317.                 pIDs[iPage++] = clsid;
  318.  
  319. #define END_PROPPAGEIDS(class_name) \
  320.             ASSERT(iPage == iPageMax); \
  321.         } \
  322.         cPropPages = _cPropPages_##class_name; \
  323.         return _rgPropPageIDs_##class_name; }
  324.  
  325. /////////////////////////////////////////////////////////////////////////////
  326. // CFontHolder - helper class for dealing with font objects
  327.  
  328. class CFontHolder
  329. {
  330. // Constructors
  331. public:
  332.     CFontHolder(LPPROPERTYNOTIFYSINK pNotify);
  333.  
  334. // Attributes
  335.     LPFONT m_pFont;
  336.  
  337. // Operations
  338.     void InitializeFont(
  339.             const FONTDESC* pFontDesc = NULL,
  340.             LPDISPATCH pFontDispAmbient = NULL);
  341.     void SetFont(LPFONT pNewFont);
  342.     void ReleaseFont();
  343.     HFONT GetFontHandle();
  344.     HFONT GetFontHandle(long cyLogical, long cyHimetric);
  345.     CFont* Select(CDC* pDC, long cyLogical, long cyHimetric);
  346.     BOOL GetDisplayString(CString& strValue);
  347.     LPFONTDISP GetFontDispatch();
  348.     void QueryTextMetrics(LPTEXTMETRIC lptm);
  349.  
  350. // Implementation
  351. public:
  352.     ~CFontHolder();
  353.  
  354. protected:
  355.     DWORD m_dwConnectCookie;
  356.     LPPROPERTYNOTIFYSINK m_pNotify;
  357. };
  358.  
  359. /////////////////////////////////////////////////////////////////////////////
  360. // CPictureHolder - helper class for dealing with picture objects
  361.  
  362. class CPictureHolder
  363. {
  364. // Constructors
  365. public:
  366.     CPictureHolder();
  367.  
  368. // Attributes
  369.     LPPICTURE m_pPict;
  370.  
  371. // Operations
  372.     BOOL CreateEmpty();
  373.  
  374.     BOOL CreateFromBitmap(UINT idResource);
  375.     BOOL CreateFromBitmap(CBitmap* pBitmap, CPalette* pPal = NULL,
  376.         BOOL bTransferOwnership = TRUE);
  377.     BOOL CreateFromBitmap(HBITMAP hbm, HPALETTE hpal = NULL,
  378.         BOOL bTransferOwnership = FALSE);
  379.  
  380.     BOOL CreateFromMetafile(HMETAFILE hmf, int xExt, int yExt,
  381.         BOOL bTransferOwnership = FALSE);
  382.  
  383.     BOOL CreateFromIcon(UINT idResource);
  384.     BOOL CreateFromIcon(HICON hIcon, BOOL bTransferOwnership = FALSE);
  385.  
  386.     short GetType();
  387.     BOOL GetDisplayString(CString& strValue);
  388.     LPPICTUREDISP GetPictureDispatch();
  389.     void SetPictureDispatch(LPPICTUREDISP pDisp);
  390.     void Render(CDC* pDC, const CRect& rcRender, const CRect& rcWBounds);
  391.  
  392. // Implementation
  393. public:
  394.     ~CPictureHolder();
  395. };
  396.  
  397. /////////////////////////////////////////////////////////////////////////////
  398. // COleControl - base class for a control implemented in C++ with MFC
  399.  
  400. struct _AFXCTL_ADVISE_INFO;     // implementation class
  401. struct _AFXCTL_UIACTIVE_INFO;   // implementation class
  402.  
  403. class COleControl : public CWnd
  404. {
  405.     DECLARE_DYNAMIC(COleControl)
  406.  
  407. // Constructors
  408. public:
  409.     COleControl();
  410.  
  411. // Operations
  412.  
  413.     // Initialization
  414.     void SetInitialSize(int cx, int cy);
  415.     void InitializeIIDs(const IID* piidPrimary, const IID* piidEvents);
  416.  
  417.     // Invalidating
  418.     void InvalidateControl(LPCRECT lpRect = NULL);
  419.  
  420.     // Modified flag
  421.     BOOL IsModified();
  422.     void SetModifiedFlag(BOOL bModified = TRUE);
  423.  
  424.     // Drawing operations
  425.     void DoSuperclassPaint(CDC* pDC, const CRect& rcBounds);
  426.  
  427.     // Property exchange
  428.     BOOL ExchangeExtent(CPropExchange* pPX);
  429.     void ExchangeStockProps(CPropExchange* pPX);
  430.     BOOL ExchangeVersion(CPropExchange* pPX, DWORD dwVersionDefault,
  431.         BOOL bConvert = TRUE);
  432.     BOOL IsConvertingVBX();
  433.  
  434.     // Stock methods
  435.     void Refresh();
  436.     void DoClick();
  437.  
  438.     // Stock properties
  439.     short GetAppearance();
  440.     void SetAppearance(short);
  441.     OLE_COLOR GetBackColor();
  442.     void SetBackColor(OLE_COLOR);
  443.     short GetBorderStyle();
  444.     void SetBorderStyle(short);
  445.     BOOL GetEnabled();
  446.     void SetEnabled(BOOL);
  447.     CFontHolder& InternalGetFont();
  448.     LPFONTDISP GetFont();
  449.     void SetFont(LPFONTDISP);
  450.     OLE_COLOR GetForeColor();
  451.     void SetForeColor(OLE_COLOR);
  452.     OLE_HANDLE GetHwnd();
  453.     const CString& InternalGetText();
  454.     BSTR GetText();
  455.     void SetText(LPCTSTR);
  456.  
  457.     // Using colors
  458.     COLORREF TranslateColor(OLE_COLOR clrColor, HPALETTE hpal = NULL);
  459.  
  460.     // Using fonts
  461.     CFont* SelectStockFont(CDC* pDC);
  462.     CFont* SelectFontObject(CDC* pDC, CFontHolder& fontHolder);
  463.     void GetStockTextMetrics(LPTEXTMETRIC lptm);
  464.     void GetFontTextMetrics(LPTEXTMETRIC lptm, CFontHolder& fontHolder);
  465.  
  466.     // Client site access
  467.     LPOLECLIENTSITE GetClientSite();
  468.  
  469.     // Generic ambient property access
  470.     BOOL GetAmbientProperty(DISPID dispid, VARTYPE vtProp, void* pvProp);
  471.     BOOL WillAmbientsBeValidDuringLoad();
  472.  
  473.     // Specific ambient properties
  474.     short AmbientAppearance();
  475.     OLE_COLOR AmbientBackColor();
  476.     CString AmbientDisplayName();
  477.     LPFONTDISP AmbientFont();
  478.     OLE_COLOR AmbientForeColor();
  479.     LCID AmbientLocaleID();
  480.     CString AmbientScaleUnits();
  481.     short AmbientTextAlign();
  482.     BOOL AmbientUserMode();
  483.     BOOL AmbientUIDead();
  484.     BOOL AmbientShowGrabHandles();
  485.     BOOL AmbientShowHatching();
  486.  
  487.     // Firing events
  488.     void AFX_CDECL FireEvent(DISPID dispid, BYTE* pbParams, ...);
  489.  
  490.     // Firing functions for stock events
  491.     void FireKeyDown(USHORT* pnChar, short nShiftState);
  492.     void FireKeyUp(USHORT* pnChar, short nShiftState);
  493.     void FireKeyPress(USHORT* pnChar);
  494.     void FireMouseDown(short nButton, short nShiftState,
  495.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  496.     void FireMouseUp(short nButton, short nShiftState,
  497.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  498.     void FireMouseMove(short nButton, short nShiftState,
  499.         OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
  500.     void FireClick();
  501.     void FireDblClick();
  502.     void FireError(SCODE scode, LPCTSTR lpszDescription, UINT nHelpID = 0);
  503.  
  504.     // Changing size and/or rectangle
  505.     BOOL GetRectInContainer(LPRECT lpRect);
  506.     BOOL SetRectInContainer(LPCRECT lpRect);
  507.     void GetControlSize(int* pcx, int* pcy);
  508.     BOOL SetControlSize(int cx, int cy);
  509.  
  510.     // Window management
  511.     void RecreateControlWindow();
  512.  
  513.     // Modal dialog operations
  514.     void PreModalDialog(HWND hWndParent = NULL);
  515.     void PostModalDialog(HWND hWndParent = NULL);
  516.  
  517.     // Data binding operations
  518.     void BoundPropertyChanged(DISPID dispid);
  519.     BOOL BoundPropertyRequestEdit(DISPID dispid);
  520.  
  521.     // Dispatch exceptions
  522.     void ThrowError(SCODE sc, UINT nDescriptionID, UINT nHelpID = -1);
  523.     void ThrowError(SCODE sc, LPCTSTR pszDescription = NULL, UINT nHelpID = 0);
  524.     void GetNotSupported();
  525.     void SetNotSupported();
  526.     void SetNotPermitted();
  527.  
  528.     // Communication with the control site
  529.     void ControlInfoChanged();
  530.     BOOL LockInPlaceActive(BOOL bLock);
  531.     LPDISPATCH GetExtendedControl();
  532.     void TransformCoords(POINTL* lpptlHimetric,
  533.         POINTF* lpptfContainer, DWORD flags);
  534.  
  535.     // Simple frame
  536.     void EnableSimpleFrame();
  537.  
  538. // Overridables
  539.     virtual void DoPropExchange(CPropExchange* pPX);
  540.     virtual void OnResetState();
  541.     virtual void OnDraw(
  542.                 CDC* pDC, const CRect& rcBounds, const CRect& rcInvalid);
  543.     virtual void OnDrawMetafile(CDC* pDC, const CRect& rcBounds);
  544.  
  545.     // Class ID (implemented by IMPLEMENT_OLECREATE_EX macro)
  546.     virtual HRESULT GetClassID(LPCLSID pclsid) = 0;
  547.  
  548.     // For customizing the default messages on the status bar
  549.     virtual void GetMessageString(UINT nID, CString& rMessage) const;
  550.  
  551.     // Display of error events to user
  552.     virtual void DisplayError(SCODE scode, LPCTSTR lpszDescription,
  553.         LPCTSTR lpszSource, LPCTSTR lpszHelpFile, UINT nHelpID);
  554.  
  555.     // IOleObject notifications
  556.     virtual void OnSetClientSite();
  557.     virtual BOOL OnSetExtent(LPSIZEL lpSizeL);
  558.     virtual void OnClose(DWORD dwSaveOption);
  559.  
  560.     // IOleInPlaceObject notifications
  561.     virtual BOOL OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);
  562.  
  563.     // Event connection point notifications
  564.     virtual void OnEventAdvise(BOOL bAdvise);
  565.  
  566.     // Override to hook firing of Click event
  567.     virtual void OnClick(USHORT iButton);
  568.  
  569.     // Override to get character after key events have been processed.
  570.     virtual void OnKeyDownEvent(USHORT nChar, USHORT nShiftState);
  571.     virtual void OnKeyUpEvent(USHORT nChar, USHORT nShiftState);
  572.     virtual void OnKeyPressEvent(USHORT nChar);
  573.  
  574.     // Change notifications
  575.     virtual void OnAppearanceChanged();
  576.     virtual void OnBackColorChanged();
  577.     virtual void OnBorderStyleChanged();
  578.     virtual void OnEnabledChanged();
  579.     virtual void OnTextChanged();
  580.     virtual void OnFontChanged();
  581.     virtual void OnForeColorChanged();
  582.  
  583.     // IOleControl notifications
  584.     virtual void OnGetControlInfo(LPCONTROLINFO pControlInfo);
  585.     virtual void OnMnemonic(LPMSG pMsg);
  586.     virtual void OnAmbientPropertyChange(DISPID dispid);
  587.     virtual void OnFreezeEvents(BOOL bFreeze);
  588.  
  589.     // In-place activation
  590.     virtual HMENU OnGetInPlaceMenu();
  591.     virtual void OnShowToolBars();
  592.     virtual void OnHideToolBars();
  593.  
  594.     // IViewObject
  595.     virtual BOOL OnGetColorSet(DVTARGETDEVICE* ptd, HDC hicTargetDev,
  596.                 LPLOGPALETTE* ppColorSet);
  597.  
  598.     // IDataObject - see COleDataSource for a description of these overridables
  599.     virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
  600.     virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
  601.     virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  602.     virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  603.         BOOL bRelease);
  604.  
  605.     // Verbs
  606.     virtual BOOL OnEnumVerbs(LPENUMOLEVERB* ppenumOleVerb);
  607.     virtual BOOL OnDoVerb(LONG iVerb, LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  608.     virtual BOOL OnEdit(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  609.     virtual BOOL OnProperties(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
  610.  
  611.     // IPerPropertyBrowsing overrides
  612.     virtual BOOL OnGetDisplayString(DISPID dispid, CString& strValue);
  613.     virtual BOOL OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid,
  614.         BOOL* pbPageOptional);
  615.     virtual BOOL OnGetPredefinedStrings(DISPID dispid,
  616.         CStringArray* pStringArray, CDWordArray* pCookieArray);
  617.     virtual BOOL OnGetPredefinedValue(DISPID dispid, DWORD dwCookie,
  618.         VARIANT* lpvarOut);
  619.  
  620.     // Subclassing
  621.     virtual BOOL IsSubclassedControl();
  622.  
  623.     // Window reparenting
  624.     virtual void ReparentControlWindow(HWND hWndOuter, HWND hWndParent);
  625.  
  626.     // Window procedure
  627.     virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  628.  
  629. // Implementation
  630.     ~COleControl();
  631.  
  632. #ifdef _DEBUG
  633.     void AssertValid() const;
  634.     void Dump(CDumpContext& dc) const;
  635. #endif // _DEBUG
  636.  
  637. protected:
  638.     // Friend classes
  639.     friend class COleControlInnerUnknown;
  640.     friend class CReflectorWnd;
  641.     friend class CControlFrameWnd;
  642.  
  643.     // Interface hook for primary automation interface
  644.     LPUNKNOWN GetInterfaceHook(const void* piid);
  645.  
  646.     // Shutdown
  647.     virtual void OnFinalRelease();
  648.  
  649.     // Window management
  650.     BOOL CreateControlWindow(HWND hWndParent, const CRect& rcPos,
  651.         LPCRECT prcClipped = NULL);
  652.     void CreateWindowForSubclassedControl();
  653.     BOOL IgnoreWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam,
  654.         LRESULT* plResult);
  655.  
  656.     // Serialization
  657.     HRESULT SaveState(IStream* pStm);
  658.     HRESULT LoadState(IStream* pStm);
  659.     virtual void Serialize(CArchive& ar);
  660.  
  661.     // Drawing
  662.     void DrawContent(CDC* pDC, CRect& rc);
  663.     void DrawMetafile(CDC* pDC, CRect& rc);
  664.     BOOL GetMetafileData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  665.  
  666.     // IDataObject formats
  667.     void SetInitialDataFormats();
  668.     BOOL GetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  669.         REFCLSID fmtid);
  670.     BOOL SetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  671.         REFCLSID fmtid);
  672.  
  673.     // Type library
  674.     BOOL GetDispatchIID(IID* pIID);
  675.  
  676.     // Connection point container
  677.     virtual LPCONNECTIONPOINT GetConnectionHook(REFIID iid);
  678.     virtual BOOL GetExtraConnectionPoints(CPtrArray* pConnPoints);
  679.  
  680.     // Events
  681.     static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[];
  682.     virtual const AFX_EVENTMAP* GetEventMap() const;
  683.     static const AFX_DATA AFX_EVENTMAP eventMap;
  684.     const AFX_EVENTMAP_ENTRY* GetEventMapEntry(LPCTSTR pszName,
  685.         DISPID* pDispid) const;
  686.     void FireEventV(DISPID dispid, BYTE* pbParams, va_list argList);
  687.  
  688.     // Stock events
  689.     void KeyDown(USHORT* pnChar);
  690.     void KeyUp(USHORT* pnChar);
  691.     void ButtonDown(USHORT iButton, UINT nFlags, CPoint point);
  692.     void ButtonUp(USHORT iButton, UINT nFlags, CPoint point);
  693.     void ButtonDblClk(USHORT iButton, UINT nFlags, CPoint point);
  694.  
  695.     // Masks to identify which stock events and properties are used
  696.     void InitStockEventMask();
  697.     void InitStockPropMask();
  698.  
  699.     // Support for subclassing a Windows control
  700.     BOOL ContainerReflectsMessages();
  701.     BOOL ContainerClips();
  702.     CWnd* GetOuterWindow() const;       // m_pReflect if any, otherwise this
  703.     virtual void OnReflectorDestroyed();
  704.  
  705.     // Aggregation of default handler
  706.     virtual BOOL OnCreateAggregates();
  707.     LPVOID QueryDefHandler(REFIID iid);
  708.  
  709.     // State change notifications
  710.     void SendAdvise(UINT uCode);
  711.  
  712.     // Non-in-place activation
  713.     virtual HRESULT OnOpen(BOOL bTryInPlace, LPMSG pMsg);
  714.     void ResizeOpenControl(int cx, int cy);
  715.     virtual CControlFrameWnd* CreateFrameWindow();
  716.     virtual void ResizeFrameWindow(int cx, int cy);
  717.     virtual void OnFrameClose();
  718.     virtual HRESULT OnHide();
  719.  
  720.     // In-place activation
  721.     virtual HRESULT OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg);
  722.     void ForwardActivationMsg(LPMSG pMsg);
  723.     virtual void AddFrameLevelUI();
  724.     virtual void RemoveFrameLevelUI();
  725.     virtual BOOL BuildSharedMenu();
  726.     virtual void DestroySharedMenu();
  727.  
  728.     // Property sheet
  729.     virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
  730.  
  731.     // IOleObject implementation
  732.     void GetUserType(LPTSTR pszUserType);
  733.     virtual UINT GetUserTypeNameID() = 0;
  734.     virtual DWORD GetMiscStatus() = 0;
  735.  
  736.     // Rectangle tracker
  737.     void CreateTracker(BOOL bHandles, BOOL bHatching);
  738.     void DestroyTracker();
  739.  
  740.     // Automation
  741.     BOOL IsInvokeAllowed(DISPID dispid);
  742.  
  743.     // Data members
  744.     const IID* m_piidPrimary;           // IID for control automation
  745.     const IID* m_piidEvents;            // IID for control events
  746.     DWORD m_dwVersionLoaded;            // Version number of loaded state
  747.     COleDispatchDriver m_ambientDispDriver; // Driver for ambient properties
  748.     DWORD m_dwStockEventMask;           // Which stock events are used?
  749.     DWORD m_dwStockPropMask;            // Which stock properties are used?
  750.     ULONG m_cEventsFrozen;              // Event freeze count (>0 means frozen)
  751.     union
  752.     {
  753.         CControlFrameWnd* m_pWndOpenFrame;  // Open frame window.
  754.         CRectTracker* m_pRectTracker;       // Tracker for UI active control
  755.     };
  756.     CRect m_rcPos;                      // Control's position rectangle
  757.     CRect m_rcBounds;                   // Bounding rectangle for drawing
  758.     CPoint m_ptOffset;                  // Child window origin
  759.     long m_cxExtent;                    // Control's width in HIMETRIC units
  760.     long m_cyExtent;                    // Control's height in HIMETRIC units
  761.     class CReflectorWnd* m_pReflect;    // Reflector window
  762.     UINT m_nIDTracking;                 // Tracking command ID or string IDS
  763.     UINT m_nIDLastMessage;              // Last displayed message string IDS
  764.     BYTE m_bAutoMenuEnable;             // Disable menu items without handlers?
  765.     BYTE m_bFinalReleaseCalled;         // Are we handling the final Release?
  766.     BYTE m_bModified;                   // "Dirty" bit.
  767.     BYTE m_bCountOnAmbients;            // Can we count on Ambients during load?
  768.     BYTE m_iButtonState;                // Which buttons are down?
  769.     BYTE m_iDblClkState;                // Which buttons involved in dbl click?
  770.     BYTE m_bInPlaceActive;              // Are we in-place active?
  771.     BYTE m_bUIActive;                   // Are we UI active?
  772.     BYTE m_bPendingUIActivation;        // Are we about to become UI active?
  773.     BYTE m_bOpen;                       // Are we open (non-in-place)?
  774.     BYTE m_bChangingExtent;             // Extent is currently being changed
  775.     BYTE m_bConvertVBX;                 // VBX conversion in progress
  776.     BYTE m_bSimpleFrame;                // Simple frame support
  777.     BYTE m_bUIDead;                     // UIDead ambient property value
  778.     BYTE m_bInitialized;                // Was IPersist*::{InitNew,Load} called?
  779.  
  780.     // Stock properties
  781.     OLE_COLOR m_clrBackColor;           // BackColor
  782.     OLE_COLOR m_clrForeColor;           // ForeColor
  783.     CString m_strText;                  // Text/Caption
  784.     CFontHolder m_font;                 // Font
  785.     HFONT m_hFontPrev;                  // Previously selected font object
  786.     short m_sAppearance;                // Appearance
  787.     short m_sBorderStyle;               // BorderStyle
  788.     BOOL m_bEnabled;                    // Enabled
  789.  
  790.     // UI Active info (shared OLE menu data)
  791.     _AFXCTL_UIACTIVE_INFO* m_pUIActiveInfo;
  792.  
  793.     // Default Handler aggregation
  794.     LPUNKNOWN m_pDefIUnknown;
  795.     _AFXCTL_ADVISE_INFO* m_pAdviseInfo;
  796.     LPPERSISTSTORAGE m_pDefIPersistStorage;
  797.     LPVIEWOBJECT m_pDefIViewObject;
  798.     LPOLECACHE m_pDefIOleCache;
  799.  
  800.     // OLE client site interfaces
  801.     LPOLECLIENTSITE m_pClientSite;          // Client site
  802.     LPOLEINPLACESITE m_pInPlaceSite;        // In-place site
  803.     LPOLECONTROLSITE m_pControlSite;        // Control site
  804.     LPOLEADVISEHOLDER m_pOleAdviseHolder;   // Advise holder
  805.     LPDATAADVISEHOLDER m_pDataAdviseHolder; // Data advise holder
  806.     LPSIMPLEFRAMESITE m_pSimpleFrameSite;   // Simple frame site
  807.  
  808.     // OLE in-place activation info
  809.     LPOLEINPLACEFRAME m_pInPlaceFrame;
  810.     OLEINPLACEFRAMEINFO m_frameInfo;
  811.     LPOLEINPLACEUIWINDOW m_pInPlaceDoc;
  812.  
  813.     // Implementation of IDataObject
  814.     // CControlDataSource implements OnRender reflections to COleControl
  815.     class CControlDataSource : public COleDataSource
  816.     {
  817.     protected:
  818.         virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
  819.         virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
  820.         virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
  821.  
  822.         virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
  823.             BOOL bRelease);
  824.     };
  825.     CControlDataSource m_dataSource;
  826.     friend class CControlDataSource;
  827.  
  828. // Message Maps
  829. protected:
  830.     //{{AFX_MSG(COleControl)
  831.     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  832.     afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  833.     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  834.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  835.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  836.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  837.     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  838.     afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
  839.     afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
  840.     afx_msg void OnMButtonDblClk(UINT nFlags, CPoint point);
  841.     afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  842.     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
  843.     afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
  844.     afx_msg void OnInitMenuPopup(CMenu*, UINT, BOOL);
  845.     afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
  846.     afx_msg LRESULT OnSetMessageString(WPARAM wParam, LPARAM lParam);
  847.     afx_msg void OnEnterIdle(UINT nWhy, CWnd* pWho);
  848.     afx_msg void OnCancelMode();
  849.     afx_msg void OnPaint(CDC* pDC);
  850.     afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  851.     afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  852.     afx_msg int  OnMouseActivate(CWnd *pDesktopWnd, UINT nHitTest, UINT message);
  853.     afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
  854.     afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct);
  855.     afx_msg void OnDestroy();
  856.     afx_msg  void OnKillFocus(CWnd* pNewWnd);
  857.     afx_msg void OnSetFocus(CWnd* pOldWnd);
  858.     afx_msg void OnNcPaint();
  859.     afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
  860.     afx_msg UINT OnNcHitTest(CPoint point);
  861.     afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
  862.     afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  863.     afx_msg UINT OnGetDlgCode();
  864.     //}}AFX_MSG
  865.  
  866.     afx_msg LRESULT OnOcmCtlColorBtn(WPARAM wParam, LPARAM lParam);
  867.     afx_msg LRESULT OnOcmCtlColorDlg(WPARAM wParam, LPARAM lParam);
  868.     afx_msg LRESULT OnOcmCtlColorEdit(WPARAM wParam, LPARAM lParam);
  869.     afx_msg LRESULT OnOcmCtlColorListBox(WPARAM wParam, LPARAM lParam);
  870.     afx_msg LRESULT OnOcmCtlColorMsgBox(WPARAM wParam, LPARAM lParam);
  871.     afx_msg LRESULT OnOcmCtlColorScrollBar(WPARAM wParam, LPARAM lParam);
  872.     afx_msg LRESULT OnOcmCtlColorStatic(WPARAM wParam, LPARAM lParam);
  873.  
  874.     DECLARE_MESSAGE_MAP()
  875.  
  876. // Interface Maps
  877. public:
  878.     // IPersistStorage
  879.     BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
  880.         INIT_INTERFACE_PART(COleControl, PersistStorage)
  881.         STDMETHOD(GetClassID)(LPCLSID);
  882.         STDMETHOD(IsDirty)();
  883.         STDMETHOD(InitNew)(LPSTORAGE);
  884.         STDMETHOD(Load)(LPSTORAGE);
  885.         STDMETHOD(Save)(LPSTORAGE, BOOL);
  886.         STDMETHOD(SaveCompleted)(LPSTORAGE);
  887.         STDMETHOD(HandsOffStorage)();
  888.     END_INTERFACE_PART(PersistStorage)
  889.  
  890.     // IPersistStreamInit
  891.     BEGIN_INTERFACE_PART(PersistStreamInit, IPersistStreamInit)
  892.         INIT_INTERFACE_PART(COleControl, PersistStreamInit)
  893.         STDMETHOD(GetClassID)(LPCLSID);
  894.         STDMETHOD(IsDirty)();
  895.         STDMETHOD(Load)(LPSTREAM);
  896.         STDMETHOD(Save)(LPSTREAM, BOOL);
  897.         STDMETHOD(GetSizeMax)(ULARGE_INTEGER *);
  898.         STDMETHOD(InitNew)();
  899.     END_INTERFACE_PART(PersistStreamInit)
  900.  
  901.     // IPersistMemory
  902.     BEGIN_INTERFACE_PART(PersistMemory, IPersistMemory)
  903.         INIT_INTERFACE_PART(COleControl, PersistMemory)
  904.         STDMETHOD(GetClassID)(LPCLSID);
  905.         STDMETHOD(IsDirty)();
  906.         STDMETHOD(Load)(LPVOID, ULONG);
  907.         STDMETHOD(Save)(LPVOID, BOOL, ULONG);
  908.         STDMETHOD(GetSizeMax)(ULONG*);
  909.         STDMETHOD(InitNew)();
  910.     END_INTERFACE_PART(PersistMemory)
  911.  
  912.     // IPersistPropertyBag
  913.     BEGIN_INTERFACE_PART(PersistPropertyBag, IPersistPropertyBag)
  914.         INIT_INTERFACE_PART(COleControl, PersistPropertyBag)
  915.         STDMETHOD(GetClassID)(LPCLSID);
  916.         STDMETHOD(InitNew)();
  917.         STDMETHOD(Load)(LPPROPERTYBAG, LPERRORLOG);
  918.         STDMETHOD(Save)(LPPROPERTYBAG, BOOL, BOOL);
  919.     END_INTERFACE_PART(PersistPropertyBag)
  920.  
  921.     // IOleObject
  922.     BEGIN_INTERFACE_PART(OleObject, IOleObject)
  923.         INIT_INTERFACE_PART(COleControl, OleObject)
  924.         STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
  925.         STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
  926.         STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
  927.         STDMETHOD(Close)(DWORD);
  928.         STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
  929.         STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  930.         STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
  931.         STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
  932.         STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);
  933.         STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
  934.         STDMETHOD(Update)();
  935.         STDMETHOD(IsUpToDate)();
  936.         STDMETHOD(GetUserClassID)(CLSID*);
  937.         STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
  938.         STDMETHOD(SetExtent)(DWORD, LPSIZEL);
  939.         STDMETHOD(GetExtent)(DWORD, LPSIZEL);
  940.         STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
  941.         STDMETHOD(Unadvise)(DWORD);
  942.         STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
  943.         STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
  944.         STDMETHOD(SetColorScheme)(LPLOGPALETTE);
  945.     END_INTERFACE_PART(OleObject)
  946.  
  947.     // IViewObject2
  948.     BEGIN_INTERFACE_PART(ViewObject, IViewObject2)
  949.         INIT_INTERFACE_PART(COleControl, ViewObject)
  950.         STDMETHOD(Draw)(DWORD, LONG, void*, DVTARGETDEVICE*, HDC, HDC,
  951.             LPCRECTL, LPCRECTL, BOOL (CALLBACK*)(DWORD), DWORD);
  952.         STDMETHOD(GetColorSet)(DWORD, LONG, void*, DVTARGETDEVICE*,
  953.             HDC, LPLOGPALETTE*);
  954.         STDMETHOD(Freeze)(DWORD, LONG, void*, DWORD*);
  955.         STDMETHOD(Unfreeze)(DWORD);
  956.         STDMETHOD(SetAdvise)(DWORD, DWORD, LPADVISESINK);
  957.         STDMETHOD(GetAdvise)(DWORD*, DWORD*, LPADVISESINK*);
  958.         STDMETHOD(GetExtent) (DWORD, LONG, DVTARGETDEVICE*, LPSIZEL);
  959.     END_INTERFACE_PART(ViewObject)
  960.  
  961.     // IDataObject
  962.     BEGIN_INTERFACE_PART(DataObject, IDataObject)
  963.         INIT_INTERFACE_PART(COleControl, DataObject)
  964.         STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
  965.         STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
  966.         STDMETHOD(QueryGetData)(LPFORMATETC);
  967.         STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
  968.         STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
  969.         STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
  970.         STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
  971.         STDMETHOD(DUnadvise)(DWORD);
  972.         STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
  973.     END_INTERFACE_PART(DataObject)
  974.  
  975.     // IOleInPlaceObject
  976.     BEGIN_INTERFACE_PART(OleInPlaceObject, IOleInPlaceObject)
  977.         INIT_INTERFACE_PART(COleControl, OleInPlaceObject)
  978.         STDMETHOD(GetWindow)(HWND*);
  979.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  980.         STDMETHOD(InPlaceDeactivate)();
  981.         STDMETHOD(UIDeactivate)();
  982.         STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT);
  983.         STDMETHOD(ReactivateAndUndo)();
  984.     END_INTERFACE_PART(OleInPlaceObject)
  985.  
  986.     // IOleInPlaceActiveObject
  987.     BEGIN_INTERFACE_PART(OleInPlaceActiveObject, IOleInPlaceActiveObject)
  988.         INIT_INTERFACE_PART(COleControl, OleInPlaceActiveObject)
  989.         STDMETHOD(GetWindow)(HWND*);
  990.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  991.         STDMETHOD(TranslateAccelerator)(LPMSG);
  992.         STDMETHOD(OnFrameWindowActivate)(BOOL);
  993.         STDMETHOD(OnDocWindowActivate)(BOOL);
  994.         STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
  995.         STDMETHOD(EnableModeless)(BOOL);
  996.     END_INTERFACE_PART(OleInPlaceActiveObject)
  997.  
  998.     // IOleCache
  999.     BEGIN_INTERFACE_PART(OleCache, IOleCache)
  1000.         INIT_INTERFACE_PART(COleControl, OleCache)
  1001.         STDMETHOD(Cache)(LPFORMATETC, DWORD, LPDWORD);
  1002.         STDMETHOD(Uncache)(DWORD);
  1003.         STDMETHOD(EnumCache)(LPENUMSTATDATA*);
  1004.         STDMETHOD(InitCache)(LPDATAOBJECT);
  1005.         STDMETHOD(SetData)(LPFORMATETC, STGMEDIUM*, BOOL);
  1006.     END_INTERFACE_PART(OleCache)
  1007.  
  1008.     // IOleControl
  1009.     BEGIN_INTERFACE_PART(OleControl, IOleControl)
  1010.         INIT_INTERFACE_PART(COleControl, OleControl)
  1011.         STDMETHOD(GetControlInfo)(LPCONTROLINFO pCI);
  1012.         STDMETHOD(OnMnemonic)(LPMSG pMsg);
  1013.         STDMETHOD(OnAmbientPropertyChange)(DISPID dispid);
  1014.         STDMETHOD(FreezeEvents)(BOOL bFreeze);
  1015.     END_INTERFACE_PART(OleControl)
  1016.  
  1017.     // IProvideClassInfo2
  1018.     BEGIN_INTERFACE_PART(ProvideClassInfo, IProvideClassInfo2)
  1019.         INIT_INTERFACE_PART(COleControl, ProvideClassInfo)
  1020.         STDMETHOD(GetClassInfo)(LPTYPEINFO* ppTypeInfo);
  1021.         STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID* pGUID);
  1022.     END_INTERFACE_PART(ProvideClassInfo)
  1023.  
  1024.     // ISpecifyPropertyPages
  1025.     BEGIN_INTERFACE_PART(SpecifyPropertyPages, ISpecifyPropertyPages)
  1026.         INIT_INTERFACE_PART(COleControl, SpecifyPropertyPages)
  1027.         STDMETHOD(GetPages)(CAUUID*);
  1028.     END_INTERFACE_PART(SpecifyPropertyPages)
  1029.  
  1030.     // IPerPropertyBrowsing
  1031.     BEGIN_INTERFACE_PART(PerPropertyBrowsing, IPerPropertyBrowsing)
  1032.         INIT_INTERFACE_PART(COleControl, PerPropertyBrowsing)
  1033.         STDMETHOD(GetDisplayString)(DISPID dispid, BSTR* lpbstr);
  1034.         STDMETHOD(MapPropertyToPage)(DISPID dispid, LPCLSID lpclsid);
  1035.         STDMETHOD(GetPredefinedStrings)(DISPID dispid,
  1036.             CALPOLESTR* lpcaStringsOut, CADWORD* lpcaCookiesOut);
  1037.         STDMETHOD(GetPredefinedValue)(DISPID dispid, DWORD dwCookie,
  1038.             VARIANT* lpvarOut);
  1039.     END_INTERFACE_PART(PerPropertyBrowsing)
  1040.  
  1041.     // IPropertyNotifySink for font updates (not exposed via QueryInterface)
  1042.     BEGIN_INTERFACE_PART(FontNotification, IPropertyNotifySink)
  1043.         INIT_INTERFACE_PART(COleControl, FontNotification)
  1044.         STDMETHOD(OnChanged)(DISPID dispid);
  1045.         STDMETHOD(OnRequestEdit)(DISPID dispid);
  1046.     END_INTERFACE_PART(FontNotification)
  1047.  
  1048.     DECLARE_INTERFACE_MAP()
  1049.  
  1050. // Connection maps
  1051. protected:
  1052.     // Connection point for events
  1053.     BEGIN_CONNECTION_PART(COleControl, EventConnPt)
  1054.         virtual void OnAdvise(BOOL bAdvise);
  1055.         virtual REFIID GetIID();
  1056.     END_CONNECTION_PART(EventConnPt)
  1057.  
  1058.     // Connection point for property notifications
  1059.     BEGIN_CONNECTION_PART(COleControl, PropConnPt)
  1060.         CONNECTION_IID(IID_IPropertyNotifySink)
  1061.     END_CONNECTION_PART(PropConnPt)
  1062.  
  1063.     DECLARE_CONNECTION_MAP()
  1064. };
  1065.  
  1066. /////////////////////////////////////////////////////////////////////////////
  1067. // Registry functions
  1068.  
  1069. enum AFX_REG_FLAGS
  1070. {
  1071.     afxRegInsertable            = 0x0001,
  1072.     afxRegApartmentThreading    = 0x0002,
  1073. };
  1074.  
  1075. BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid,
  1076.     LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL);
  1077.  
  1078. BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlid);
  1079.  
  1080. BOOL AFXAPI AfxOleRegisterControlClass(HINSTANCE hInstance, REFCLSID clsid,
  1081.     LPCTSTR pszProgID, UINT idTypeName, UINT idBitmap, int nRegFlags,
  1082.     DWORD dwMiscStatus, REFGUID tlid, WORD wVerMajor, WORD wVerMinor);
  1083.  
  1084. BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsid, LPCTSTR pszProgID);
  1085.  
  1086. BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
  1087.     REFCLSID clsid, UINT idTypeName);
  1088.  
  1089. BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
  1090.     REFCLSID clsid, UINT idTypeName, int nRegFlags);
  1091.  
  1092. /////////////////////////////////////////////////////////////////////////////
  1093. // Licensing functions
  1094.  
  1095. BOOL AFXAPI AfxVerifyLicFile(HINSTANCE hInstance, LPCTSTR pszLicFileName,
  1096.     LPCOLESTR pszLicFileContents, UINT cch=-1);
  1097.  
  1098. /////////////////////////////////////////////////////////////////////////////
  1099. // CPropExchange - Abstract base class for property exchange
  1100.  
  1101. class CPropExchange
  1102. {
  1103. // Operations
  1104. public:
  1105.     BOOL IsLoading();
  1106.     DWORD GetVersion();
  1107.     BOOL ExchangeVersion(DWORD& dwVersionLoaded, DWORD dwVersionDefault,
  1108.         BOOL bConvert);
  1109.  
  1110.     virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  1111.                 void* pvProp, const void* pvDefault = NULL) = 0;
  1112.     virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, HGLOBAL* phBlob,
  1113.                 HGLOBAL hBlobDefault = NULL) = 0;
  1114.     virtual BOOL ExchangeFontProp(LPCTSTR pszPropName, CFontHolder& font,
  1115.                 const FONTDESC* pFontDesc,
  1116.                 LPFONTDISP pFontDispAmbient) = 0;
  1117.     virtual BOOL ExchangePersistentProp(LPCTSTR pszPropName,
  1118.                 LPUNKNOWN* ppUnk, REFIID iid, LPUNKNOWN pUnkDefault) = 0;
  1119.  
  1120. // Implementation
  1121. protected:
  1122.     CPropExchange();
  1123.     BOOL m_bLoading;
  1124.     DWORD m_dwVersion;
  1125. };
  1126.  
  1127. /////////////////////////////////////////////////////////////////////////////
  1128. // Property-exchange (PX_) helper functions
  1129.  
  1130. BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue);
  1131.  
  1132. BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue,
  1133.     short sDefault);
  1134.  
  1135. BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue);
  1136.  
  1137. BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue,
  1138.     USHORT usDefault);
  1139.  
  1140. BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue);
  1141.  
  1142. BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue,
  1143.     long lDefault);
  1144.  
  1145. BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue);
  1146.  
  1147. BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue,
  1148.     ULONG ulDefault);
  1149.  
  1150. BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue);
  1151.  
  1152. BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue,
  1153.     OLE_COLOR clrDefault);
  1154.  
  1155. BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue);
  1156.  
  1157. BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue,
  1158.     BOOL bDefault);
  1159.  
  1160. BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue);
  1161.  
  1162. BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue,
  1163.     const CString& strDefault);
  1164.  
  1165. BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue);
  1166.  
  1167. BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue,
  1168.     CY cyDefault);
  1169.  
  1170. BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue);
  1171.  
  1172. BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue,
  1173.     float floatDefault);
  1174.  
  1175. BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue);
  1176.  
  1177. BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue,
  1178.     double doubleDefault);
  1179.  
  1180. BOOL AFX_CDECL PX_Blob(CPropExchange* pPX, LPCTSTR pszPropName, HGLOBAL& hBlob,
  1181.     HGLOBAL hBlobDefault = NULL);
  1182.  
  1183. BOOL AFX_CDECL PX_Font(CPropExchange* pPX, LPCTSTR pszPropName, CFontHolder& font,
  1184.     const FONTDESC* pFontDesc = NULL,
  1185.     LPFONTDISP pFontDispAmbient = NULL);
  1186.  
  1187. BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
  1188.     CPictureHolder& pict);
  1189.  
  1190. BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
  1191.     CPictureHolder& pict, CPictureHolder& pictDefault);
  1192.  
  1193. BOOL AFX_CDECL PX_IUnknown(CPropExchange* pPX, LPCTSTR pszPropName, LPUNKNOWN& pUnk,
  1194.     REFIID iid, LPUNKNOWN pUnkDefault = NULL);
  1195.  
  1196. BOOL AFX_CDECL PX_VBXFontConvert(CPropExchange* pPX, CFontHolder& font);
  1197.  
  1198. /////////////////////////////////////////////////////////////////////////////
  1199. // Structures used by COlePropertyPage
  1200.  
  1201. typedef struct tagAFX_PPFIELDSTATUS
  1202. {
  1203.     UINT    nID;
  1204.     BOOL    bDirty;
  1205.  
  1206. } AFX_PPFIELDSTATUS;
  1207.  
  1208. /////////////////////////////////////////////////////////////////////////////
  1209. // Property Page Dialog Class
  1210.  
  1211. class COlePropertyPage : public CDialog
  1212. {
  1213.     DECLARE_DYNAMIC(COlePropertyPage)
  1214.  
  1215. // Constructors
  1216. public:
  1217.     COlePropertyPage(UINT idDlg, UINT idCaption);
  1218.  
  1219. // Operations
  1220.     LPDISPATCH* GetObjectArray(ULONG* pnObjects);
  1221.     void SetModifiedFlag(BOOL bModified = TRUE);
  1222.     BOOL IsModified();
  1223.     LPPROPERTYPAGESITE GetPageSite();
  1224.     void SetDialogResource(HGLOBAL hDialog);
  1225.     void SetPageName(LPCTSTR lpszPageName);
  1226.     void SetHelpInfo(LPCTSTR lpszDocString, LPCTSTR lpszHelpFile = NULL,
  1227.         DWORD dwHelpContext = 0);
  1228.  
  1229.     BOOL GetControlStatus(UINT nID);
  1230.     BOOL SetControlStatus(UINT nID, BOOL bDirty);
  1231.     void IgnoreApply(UINT nID);
  1232.  
  1233.     int MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL,
  1234.             UINT nType = MB_OK);
  1235.     // note that this is a non-virtual override of CWnd::MessageBox()
  1236.  
  1237. // Overridables
  1238.     virtual void OnSetPageSite();
  1239.     virtual void OnObjectsChanged();
  1240.     virtual BOOL OnHelp(LPCTSTR lpszHelpDir);
  1241.     virtual BOOL OnInitDialog();
  1242.     virtual BOOL OnEditProperty(DISPID dispid);
  1243.  
  1244. // Implementation
  1245.  
  1246.     // DDP_ property get/set helper routines
  1247.     BOOL SetPropText(LPCTSTR pszPropName, BYTE &Value);
  1248.     BOOL GetPropText(LPCTSTR pszPropName, BYTE* pValue);
  1249.     BOOL SetPropText(LPCTSTR pszPropName, int &Value);
  1250.     BOOL GetPropText(LPCTSTR pszPropName, int* pValue);
  1251.     BOOL SetPropText(LPCTSTR pszPropName, UINT &Value);
  1252.     BOOL GetPropText(LPCTSTR pszPropName, UINT* pValue);
  1253.     BOOL SetPropText(LPCTSTR pszPropName, long &Value);
  1254.     BOOL GetPropText(LPCTSTR pszPropName, long* pValue);
  1255.     BOOL SetPropText(LPCTSTR pszPropName, DWORD &Value);
  1256.     BOOL GetPropText(LPCTSTR pszPropName, DWORD* pValue);
  1257.     BOOL SetPropText(LPCTSTR pszPropName, CString &Value);
  1258.     BOOL GetPropText(LPCTSTR pszPropName, CString* pValue);
  1259.     BOOL SetPropText(LPCTSTR pszPropName, float &Value);
  1260.     BOOL GetPropText(LPCTSTR pszPropName, float* pValue);
  1261.     BOOL SetPropText(LPCTSTR pszPropName, double &Value);
  1262.     BOOL GetPropText(LPCTSTR pszPropName, double* pValue);
  1263.     BOOL SetPropCheck(LPCTSTR pszPropName, int Value);
  1264.     BOOL GetPropCheck(LPCTSTR pszPropName, int* pValue);
  1265.     BOOL SetPropRadio(LPCTSTR pszPropName, int Value);
  1266.     BOOL GetPropRadio(LPCTSTR pszPropName, int* pValue);
  1267.     BOOL SetPropIndex(LPCTSTR pszPropName, int Value);
  1268.     BOOL GetPropIndex(LPCTSTR pszPropName, int* pValue);
  1269.     CPtrArray m_arrayDDP;      // pending DDP data
  1270.  
  1271.     // Destructors
  1272.     ~COlePropertyPage();
  1273.  
  1274. protected:
  1275.     LRESULT WindowProc(UINT msg, WPARAM wParam, LPARAM lParam);
  1276.     BOOL OnCommand(WPARAM wParam, LPARAM lParam);
  1277.     BOOL PreTranslateMessage(LPMSG lpMsg);
  1278.     virtual void OnFinalRelease();
  1279.     void CleanupObjectArray();
  1280.     static BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
  1281.     static BOOL CALLBACK EnumControls(HWND hWnd, LPARAM lParam);
  1282.  
  1283. private:
  1284.     BOOL m_bDirty;
  1285.     UINT m_idDlg;
  1286.     UINT m_idCaption;
  1287.     CString m_strPageName;
  1288.     SIZE m_sizePage;
  1289.     CString m_strDocString;
  1290.     CString m_strHelpFile;
  1291.     DWORD m_dwHelpContext;
  1292.     LPPROPERTYPAGESITE m_pPageSite;
  1293.  
  1294.     LPDISPATCH* m_ppDisp;   // Array of IDispatch pointers, used to
  1295.                                 // access the properties of each control
  1296.  
  1297.     LPDWORD m_pAdvisors;        // Array of connection tokens used by
  1298.                                 // IConnecitonPoint::Advise/UnAdvise.
  1299.  
  1300.     BOOL m_bPropsChanged;       // IPropertyNotifySink::OnChanged has been
  1301.                                 // called, but not acted upon yet.
  1302.  
  1303.     ULONG m_nObjects;           // Objects in m_ppDisp, m_ppDataObj, m_pAdvisors
  1304.  
  1305.     BOOL m_bInitializing;       // TRUE if the contents of the fields of
  1306.                                 // the dialog box are being initialized
  1307.  
  1308.     int m_nControls;            // Number of fields on this property page
  1309.  
  1310.     AFX_PPFIELDSTATUS* m_pStatus;   // Array containing information on
  1311.                                     // which fields are dirty
  1312.  
  1313.     CWordArray m_IDArray;       // Array containing information on which
  1314.                                 // controls to ignore when deciding if
  1315.                                 // the apply button is to be enabled
  1316.  
  1317.     HGLOBAL m_hDialog;          // Handle of the dialog resource
  1318.  
  1319. #ifdef _DEBUG
  1320.     BOOL m_bNonStandardSize;
  1321. #endif
  1322.  
  1323. protected:
  1324.     // Generated message map functions
  1325.     //{{AFX_MSG(COlePropertyPage)
  1326.     afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
  1327.     //}}AFX_MSG
  1328.     DECLARE_MESSAGE_MAP()
  1329.  
  1330. // Interface Maps
  1331. public:
  1332.     BEGIN_INTERFACE_PART(PropertyPage, IPropertyPage2)
  1333.         INIT_INTERFACE_PART(COlePropertyPage, PropertyPage)
  1334.         STDMETHOD(SetPageSite)(LPPROPERTYPAGESITE);
  1335.         STDMETHOD(Activate)(HWND, LPCRECT, BOOL);
  1336.         STDMETHOD(Deactivate)();
  1337.         STDMETHOD(GetPageInfo)(LPPROPPAGEINFO);
  1338.         STDMETHOD(SetObjects)(ULONG, LPUNKNOWN*);
  1339.         STDMETHOD(Show)(UINT);
  1340.         STDMETHOD(Move)(LPCRECT);
  1341.         STDMETHOD(IsPageDirty)();
  1342.         STDMETHOD(Apply)();
  1343.         STDMETHOD(Help)(LPCOLESTR);
  1344.         STDMETHOD(TranslateAccelerator)(LPMSG);
  1345.         STDMETHOD(EditProperty)(DISPID);
  1346.     END_INTERFACE_PART(PropertyPage)
  1347.  
  1348.     BEGIN_INTERFACE_PART(PropNotifySink, IPropertyNotifySink)
  1349.         INIT_INTERFACE_PART(COlePropertyPage, PropNotifySink)
  1350.         STDMETHOD(OnRequestEdit)(DISPID);
  1351.         STDMETHOD(OnChanged)(DISPID);
  1352.     END_INTERFACE_PART(PropNotifySink)
  1353.  
  1354.     DECLARE_INTERFACE_MAP()
  1355. };
  1356.  
  1357. /////////////////////////////////////////////////////////////////////////////
  1358. // Property Page Dialog Data Exchange routines
  1359.  
  1360. // simple text operations
  1361. void AFXAPI DDP_Text(CDataExchange*pDX, int id, BYTE& member, LPCTSTR pszPropName);
  1362. void AFXAPI DDP_Text(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1363. void AFXAPI DDP_Text(CDataExchange*pDX, int id, UINT& member, LPCTSTR pszPropName);
  1364. void AFXAPI DDP_Text(CDataExchange*pDX, int id, long& member, LPCTSTR pszPropName);
  1365. void AFXAPI DDP_Text(CDataExchange*pDX, int id, DWORD& member, LPCTSTR pszPropName);
  1366. void AFXAPI DDP_Text(CDataExchange*pDX, int id, float& member, LPCTSTR pszPropName);
  1367. void AFXAPI DDP_Text(CDataExchange*pDX, int id, double& member, LPCTSTR pszPropName);
  1368. void AFXAPI DDP_Text(CDataExchange*pDX, int id, CString& member, LPCTSTR pszPropName);
  1369. void AFXAPI DDP_Check(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1370. void AFXAPI DDP_Radio(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
  1371. void AFXAPI DDP_LBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1372. void AFXAPI DDP_LBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1373. void AFXAPI DDP_LBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
  1374. void AFXAPI DDP_CBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1375. void AFXAPI DDP_CBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
  1376. void AFXAPI DDP_CBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
  1377. void AFXAPI DDP_PostProcessing(CDataExchange *pDX);
  1378.  
  1379. ////////////////////////////////////////////////////////////////////////////
  1380. // AfxOleTypeMatchGuid - Tests whether a given TYPEDESC matches a type with a
  1381. // given GUID, when all aliases have been expanded.
  1382.  
  1383. BOOL AFXAPI AfxOleTypeMatchGuid(LPTYPEINFO pTypeInfo,
  1384.     TYPEDESC* pTypeDesc, REFGUID guidType, ULONG cIndirectionLevels);
  1385.  
  1386. /////////////////////////////////////////////////////////////////////////////
  1387. // Inline function declarations
  1388.  
  1389. #ifdef _AFX_PACKING
  1390. #pragma pack(pop)
  1391. #endif
  1392.  
  1393. #ifdef _AFX_ENABLE_INLINES
  1394. #define _AFXCTL_INLINE inline
  1395. #include <afxctl.inl>
  1396. #endif
  1397.  
  1398. #undef AFX_DATA
  1399. #define AFX_DATA
  1400.  
  1401. #ifdef _AFX_MINREBUILD
  1402. #pragma component(minrebuild, on)
  1403. #endif
  1404. #ifndef _AFX_FULLTYPEINFO
  1405. #pragma component(mintypeinfo, off)
  1406. #endif
  1407.  
  1408. #endif // __AFXCTL_H__
  1409.  
  1410. /////////////////////////////////////////////////////////////////////////////
  1411.