NT4/public/sdk/inc/mfc40/afxctl.h
2020-09-30 17:12:29 +02:00

1411 lines
48 KiB
C++

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
/////////////////////////////////////////////////////////////////////////////
// AFXCTL.H - MFC OLE Control support
#ifndef __AFXCTL_H__
#define __AFXCTL_H__
#ifndef _AFXDLL
#error Please define _AFXDLL when including afxctl.h
#endif
// make sure afxole.h is included first
#ifndef __AFXOLE_H_
#include <afxole.h>
#endif
// include OLE Control header
#ifndef _OLECTL_H_
#include <olectl.h>
#endif
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, off)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, on)
#endif
/////////////////////////////////////////////////////////////////////////////
// Classes declared in this file
//CWinApp
class COleControlModule; // Module housekeeping for an .OCX
class CFontHolder; // For manipulating font objects
class CPictureHolder; // For manipulating picture objects
//CWnd
class COleControl; // OLE Control
//CDialog
class COlePropertyPage; // OLE Property page
class CPropExchange; // Abstract base for property exchange
/////////////////////////////////////////////////////////////////////////////
// Set structure packing
#ifdef _AFX_PACKING
#pragma pack(push, _AFX_PACKING)
#endif
/////////////////////////////////////////////////////////////////////////////
// MFC data definition for data exported from the runtime DLL
#undef AFX_DATA
#define AFX_DATA AFX_OLE_DATA
/////////////////////////////////////////////////////////////////////////////
// COleControlModule - base class for .OCX module
// This object is statically linked into the control.
class COleControlModule : public CWinApp
{
DECLARE_DYNAMIC(COleControlModule)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
};
/////////////////////////////////////////////////////////////////////////////
// Module state macro
#define AfxGetControlModuleContext AfxGetStaticModuleState
#define _afxModuleAddrThis AfxGetStaticModuleState()
/////////////////////////////////////////////////////////////////////////////
// Connection helper functions
BOOL AFXAPI AfxConnectionAdvise(LPUNKNOWN pUnkSrc, REFIID iid,
LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD* pdwCookie);
BOOL AFXAPI AfxConnectionUnadvise(LPUNKNOWN pUnkSrc, REFIID iid,
LPUNKNOWN pUnkSink, BOOL bRefCount, DWORD dwCookie);
/////////////////////////////////////////////////////////////////////////////
// Event maps
enum AFX_EVENTMAP_FLAGS
{
afxEventCustom = 0,
afxEventStock = 1,
};
struct AFX_EVENTMAP_ENTRY
{
AFX_EVENTMAP_FLAGS flags;
DISPID dispid;
LPCTSTR pszName;
LPCSTR lpszParams;
};
struct AFX_EVENTMAP
{
const AFX_EVENTMAP* lpBaseEventMap;
const AFX_EVENTMAP_ENTRY* lpEntries;
};
#define DECLARE_EVENT_MAP() \
private: \
static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[]; \
protected: \
static const AFX_DATA AFX_EVENTMAP eventMap; \
virtual const AFX_EVENTMAP* GetEventMap() const;
#define BEGIN_EVENT_MAP(theClass, baseClass) \
const AFX_EVENTMAP* theClass::GetEventMap() const \
{ return &eventMap; } \
const AFX_DATADEF AFX_EVENTMAP theClass::eventMap = \
{ &(baseClass::eventMap), theClass::_eventEntries }; \
const AFX_DATADEF AFX_EVENTMAP_ENTRY theClass::_eventEntries[] = \
{
#define END_EVENT_MAP() \
{ afxEventCustom, DISPID_UNKNOWN, NULL, NULL }, \
};
#define EVENT_CUSTOM(pszName, pfnFire, vtsParams) \
{ afxEventCustom, DISPID_UNKNOWN, _T(pszName), vtsParams },
#define EVENT_CUSTOM_ID(pszName, dispid, pfnFire, vtsParams) \
{ afxEventCustom, dispid, _T(pszName), vtsParams },
#define EVENT_PARAM(vtsParams) (BYTE*)(vtsParams)
/////////////////////////////////////////////////////////////////////////////
// Stock events
#define EVENT_STOCK_CLICK() \
{ afxEventStock, DISPID_CLICK, _T("Click"), VTS_NONE },
#define EVENT_STOCK_DBLCLICK() \
{ afxEventStock, DISPID_DBLCLICK, _T("DblClick"), VTS_NONE },
#define EVENT_STOCK_KEYDOWN() \
{ afxEventStock, DISPID_KEYDOWN, _T("KeyDown"), VTS_PI2 VTS_I2 },
#define EVENT_STOCK_KEYPRESS() \
{ afxEventStock, DISPID_KEYPRESS, _T("KeyPress"), VTS_PI2 },
#define EVENT_STOCK_KEYUP() \
{ afxEventStock, DISPID_KEYUP, _T("KeyUp"), VTS_PI2 VTS_I2 },
#define EVENT_STOCK_MOUSEDOWN() \
{ afxEventStock, DISPID_MOUSEDOWN, _T("MouseDown"), \
VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
#define EVENT_STOCK_MOUSEMOVE() \
{ afxEventStock, DISPID_MOUSEMOVE, _T("MouseMove"), \
VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
#define EVENT_STOCK_MOUSEUP() \
{ afxEventStock, DISPID_MOUSEUP, _T("MouseUp"), \
VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS },
#define EVENT_STOCK_ERROREVENT() \
{ afxEventStock, DISPID_ERROREVENT, _T("Error"), \
VTS_I2 VTS_PBSTR VTS_SCODE VTS_BSTR VTS_BSTR VTS_I4 VTS_PBOOL },
// Shift state values for mouse and keyboard events
#define SHIFT_MASK 0x01
#define CTRL_MASK 0x02
#define ALT_MASK 0x04
// Button values for mouse events
#define LEFT_BUTTON 0x01
#define RIGHT_BUTTON 0x02
#define MIDDLE_BUTTON 0x04
/////////////////////////////////////////////////////////////////////////////
// Stock properties
#define DISP_PROPERTY_STOCK(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType) \
{ _T(szExternalName), dispid, NULL, vtPropType, \
(AFX_PMSG)(void (theClass::*)(void))pfnGet, \
(AFX_PMSG)(void (theClass::*)(void))pfnSet, 0, afxDispStock }, \
#define DISP_STOCKPROP_APPEARANCE() \
DISP_PROPERTY_STOCK(COleControl, "Appearance", DISPID_APPEARANCE, \
COleControl::GetAppearance, COleControl::SetAppearance, VT_I2)
#define DISP_STOCKPROP_BACKCOLOR() \
DISP_PROPERTY_STOCK(COleControl, "BackColor", DISPID_BACKCOLOR, \
COleControl::GetBackColor, COleControl::SetBackColor, VT_COLOR)
#define DISP_STOCKPROP_BORDERSTYLE() \
DISP_PROPERTY_STOCK(COleControl, "BorderStyle", DISPID_BORDERSTYLE, \
COleControl::GetBorderStyle, COleControl::SetBorderStyle, VT_I2)
#define DISP_STOCKPROP_CAPTION() \
DISP_PROPERTY_STOCK(COleControl, "Caption", DISPID_CAPTION, \
COleControl::GetText, COleControl::SetText, VT_BSTR)
#define DISP_STOCKPROP_ENABLED() \
DISP_PROPERTY_STOCK(COleControl, "Enabled", DISPID_ENABLED, \
COleControl::GetEnabled, COleControl::SetEnabled, VT_BOOL)
#define DISP_STOCKPROP_FONT() \
DISP_PROPERTY_STOCK(COleControl, "Font", DISPID_FONT, \
COleControl::GetFont, COleControl::SetFont, VT_FONT)
#define DISP_STOCKPROP_FORECOLOR() \
DISP_PROPERTY_STOCK(COleControl, "ForeColor", DISPID_FORECOLOR, \
COleControl::GetForeColor, COleControl::SetForeColor, VT_COLOR)
#define DISP_STOCKPROP_HWND() \
DISP_PROPERTY_STOCK(COleControl, "hWnd", DISPID_HWND, \
COleControl::GetHwnd, SetNotSupported, VT_HANDLE)
#define DISP_STOCKPROP_TEXT() \
DISP_PROPERTY_STOCK(COleControl, "Text", DISPID_TEXT, \
COleControl::GetText, COleControl::SetText, VT_BSTR)
/////////////////////////////////////////////////////////////////////////////
// Stock methods
#define DISP_FUNCTION_STOCK(theClass, szExternalName, dispid, pfnMember, vtRetVal, vtsParams) \
{ _T(szExternalName), dispid, vtsParams, vtRetVal, \
(AFX_PMSG)(void (theClass::*)(void))pfnMember, (AFX_PMSG)0, 0, \
afxDispStock }, \
#define DISP_STOCKFUNC_REFRESH() \
DISP_FUNCTION_STOCK(COleControl, "Refresh", DISPID_REFRESH, \
COleControl::Refresh, VT_EMPTY, VTS_NONE)
#define DISP_STOCKFUNC_DOCLICK() \
DISP_FUNCTION_STOCK(COleControl, "DoClick", DISPID_DOCLICK, \
COleControl::DoClick, VT_EMPTY, VTS_NONE)
/////////////////////////////////////////////////////////////////////////////
// Macros for object factory and class ID
#define BEGIN_OLEFACTORY(class_name) \
protected: \
class class_name##Factory : public COleObjectFactoryEx \
{ \
public: \
class_name##Factory(REFCLSID clsid, CRuntimeClass* pRuntimeClass, \
BOOL bMultiInstance, LPCTSTR lpszProgID) : \
COleObjectFactoryEx(clsid, pRuntimeClass, bMultiInstance, \
lpszProgID) {} \
virtual BOOL UpdateRegistry(BOOL);
#define END_OLEFACTORY(class_name) \
}; \
friend class class_name##Factory; \
static AFX_DATA class_name##Factory factory; \
public: \
static AFX_DATA const GUID guid; \
virtual HRESULT GetClassID(LPCLSID pclsid);
#define DECLARE_OLECREATE_EX(class_name) \
BEGIN_OLEFACTORY(class_name) \
END_OLEFACTORY(class_name)
#define IMPLEMENT_OLECREATE_EX(class_name, external_name, \
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
static const TCHAR _szProgID_##class_name[] = _T(external_name); \
AFX_DATADEF class_name::class_name##Factory class_name::factory( \
class_name::guid, RUNTIME_CLASS(class_name), FALSE, \
_szProgID_##class_name); \
const AFX_DATADEF GUID class_name::guid = \
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; \
HRESULT class_name::GetClassID(LPCLSID pclsid) \
{ *pclsid = guid; return NOERROR; }
/////////////////////////////////////////////////////////////////////////////
// Macros for type name and misc status
#define DECLARE_OLECTLTYPE(class_name) \
virtual UINT GetUserTypeNameID(); \
virtual DWORD GetMiscStatus();
#define IMPLEMENT_OLECTLTYPE(class_name, idsUserTypeName, dwOleMisc) \
UINT class_name::GetUserTypeNameID() { return idsUserTypeName; } \
DWORD class_name::GetMiscStatus() { return dwOleMisc; }
/////////////////////////////////////////////////////////////////////////////
// Macros for property page IDs
#define DECLARE_PROPPAGEIDS(class_name) \
protected: \
virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
#define BEGIN_PROPPAGEIDS(class_name, count) \
static CLSID _rgPropPageIDs_##class_name[count]; \
static ULONG _cPropPages_##class_name = (ULONG)-1; \
LPCLSID class_name::GetPropPageIDs(ULONG& cPropPages) { \
if (_cPropPages_##class_name == (ULONG)-1) { \
_cPropPages_##class_name = count; \
LPCLSID pIDs = _rgPropPageIDs_##class_name; \
ULONG iPageMax = count; \
ULONG iPage = 0;
#define PROPPAGEID(clsid) \
ASSERT(iPage < iPageMax); \
if (iPage < iPageMax) \
pIDs[iPage++] = clsid;
#define END_PROPPAGEIDS(class_name) \
ASSERT(iPage == iPageMax); \
} \
cPropPages = _cPropPages_##class_name; \
return _rgPropPageIDs_##class_name; }
/////////////////////////////////////////////////////////////////////////////
// CFontHolder - helper class for dealing with font objects
class CFontHolder
{
// Constructors
public:
CFontHolder(LPPROPERTYNOTIFYSINK pNotify);
// Attributes
LPFONT m_pFont;
// Operations
void InitializeFont(
const FONTDESC* pFontDesc = NULL,
LPDISPATCH pFontDispAmbient = NULL);
void SetFont(LPFONT pNewFont);
void ReleaseFont();
HFONT GetFontHandle();
HFONT GetFontHandle(long cyLogical, long cyHimetric);
CFont* Select(CDC* pDC, long cyLogical, long cyHimetric);
BOOL GetDisplayString(CString& strValue);
LPFONTDISP GetFontDispatch();
void QueryTextMetrics(LPTEXTMETRIC lptm);
// Implementation
public:
~CFontHolder();
protected:
DWORD m_dwConnectCookie;
LPPROPERTYNOTIFYSINK m_pNotify;
};
/////////////////////////////////////////////////////////////////////////////
// CPictureHolder - helper class for dealing with picture objects
class CPictureHolder
{
// Constructors
public:
CPictureHolder();
// Attributes
LPPICTURE m_pPict;
// Operations
BOOL CreateEmpty();
BOOL CreateFromBitmap(UINT idResource);
BOOL CreateFromBitmap(CBitmap* pBitmap, CPalette* pPal = NULL,
BOOL bTransferOwnership = TRUE);
BOOL CreateFromBitmap(HBITMAP hbm, HPALETTE hpal = NULL,
BOOL bTransferOwnership = FALSE);
BOOL CreateFromMetafile(HMETAFILE hmf, int xExt, int yExt,
BOOL bTransferOwnership = FALSE);
BOOL CreateFromIcon(UINT idResource);
BOOL CreateFromIcon(HICON hIcon, BOOL bTransferOwnership = FALSE);
short GetType();
BOOL GetDisplayString(CString& strValue);
LPPICTUREDISP GetPictureDispatch();
void SetPictureDispatch(LPPICTUREDISP pDisp);
void Render(CDC* pDC, const CRect& rcRender, const CRect& rcWBounds);
// Implementation
public:
~CPictureHolder();
};
/////////////////////////////////////////////////////////////////////////////
// COleControl - base class for a control implemented in C++ with MFC
struct _AFXCTL_ADVISE_INFO; // implementation class
struct _AFXCTL_UIACTIVE_INFO; // implementation class
class COleControl : public CWnd
{
DECLARE_DYNAMIC(COleControl)
// Constructors
public:
COleControl();
// Operations
// Initialization
void SetInitialSize(int cx, int cy);
void InitializeIIDs(const IID* piidPrimary, const IID* piidEvents);
// Invalidating
void InvalidateControl(LPCRECT lpRect = NULL);
// Modified flag
BOOL IsModified();
void SetModifiedFlag(BOOL bModified = TRUE);
// Drawing operations
void DoSuperclassPaint(CDC* pDC, const CRect& rcBounds);
// Property exchange
BOOL ExchangeExtent(CPropExchange* pPX);
void ExchangeStockProps(CPropExchange* pPX);
BOOL ExchangeVersion(CPropExchange* pPX, DWORD dwVersionDefault,
BOOL bConvert = TRUE);
BOOL IsConvertingVBX();
// Stock methods
void Refresh();
void DoClick();
// Stock properties
short GetAppearance();
void SetAppearance(short);
OLE_COLOR GetBackColor();
void SetBackColor(OLE_COLOR);
short GetBorderStyle();
void SetBorderStyle(short);
BOOL GetEnabled();
void SetEnabled(BOOL);
CFontHolder& InternalGetFont();
LPFONTDISP GetFont();
void SetFont(LPFONTDISP);
OLE_COLOR GetForeColor();
void SetForeColor(OLE_COLOR);
OLE_HANDLE GetHwnd();
const CString& InternalGetText();
BSTR GetText();
void SetText(LPCTSTR);
// Using colors
COLORREF TranslateColor(OLE_COLOR clrColor, HPALETTE hpal = NULL);
// Using fonts
CFont* SelectStockFont(CDC* pDC);
CFont* SelectFontObject(CDC* pDC, CFontHolder& fontHolder);
void GetStockTextMetrics(LPTEXTMETRIC lptm);
void GetFontTextMetrics(LPTEXTMETRIC lptm, CFontHolder& fontHolder);
// Client site access
LPOLECLIENTSITE GetClientSite();
// Generic ambient property access
BOOL GetAmbientProperty(DISPID dispid, VARTYPE vtProp, void* pvProp);
BOOL WillAmbientsBeValidDuringLoad();
// Specific ambient properties
short AmbientAppearance();
OLE_COLOR AmbientBackColor();
CString AmbientDisplayName();
LPFONTDISP AmbientFont();
OLE_COLOR AmbientForeColor();
LCID AmbientLocaleID();
CString AmbientScaleUnits();
short AmbientTextAlign();
BOOL AmbientUserMode();
BOOL AmbientUIDead();
BOOL AmbientShowGrabHandles();
BOOL AmbientShowHatching();
// Firing events
void AFX_CDECL FireEvent(DISPID dispid, BYTE* pbParams, ...);
// Firing functions for stock events
void FireKeyDown(USHORT* pnChar, short nShiftState);
void FireKeyUp(USHORT* pnChar, short nShiftState);
void FireKeyPress(USHORT* pnChar);
void FireMouseDown(short nButton, short nShiftState,
OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
void FireMouseUp(short nButton, short nShiftState,
OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
void FireMouseMove(short nButton, short nShiftState,
OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
void FireClick();
void FireDblClick();
void FireError(SCODE scode, LPCTSTR lpszDescription, UINT nHelpID = 0);
// Changing size and/or rectangle
BOOL GetRectInContainer(LPRECT lpRect);
BOOL SetRectInContainer(LPCRECT lpRect);
void GetControlSize(int* pcx, int* pcy);
BOOL SetControlSize(int cx, int cy);
// Window management
void RecreateControlWindow();
// Modal dialog operations
void PreModalDialog(HWND hWndParent = NULL);
void PostModalDialog(HWND hWndParent = NULL);
// Data binding operations
void BoundPropertyChanged(DISPID dispid);
BOOL BoundPropertyRequestEdit(DISPID dispid);
// Dispatch exceptions
void ThrowError(SCODE sc, UINT nDescriptionID, UINT nHelpID = -1);
void ThrowError(SCODE sc, LPCTSTR pszDescription = NULL, UINT nHelpID = 0);
void GetNotSupported();
void SetNotSupported();
void SetNotPermitted();
// Communication with the control site
void ControlInfoChanged();
BOOL LockInPlaceActive(BOOL bLock);
LPDISPATCH GetExtendedControl();
void TransformCoords(POINTL* lpptlHimetric,
POINTF* lpptfContainer, DWORD flags);
// Simple frame
void EnableSimpleFrame();
// Overridables
virtual void DoPropExchange(CPropExchange* pPX);
virtual void OnResetState();
virtual void OnDraw(
CDC* pDC, const CRect& rcBounds, const CRect& rcInvalid);
virtual void OnDrawMetafile(CDC* pDC, const CRect& rcBounds);
// Class ID (implemented by IMPLEMENT_OLECREATE_EX macro)
virtual HRESULT GetClassID(LPCLSID pclsid) = 0;
// For customizing the default messages on the status bar
virtual void GetMessageString(UINT nID, CString& rMessage) const;
// Display of error events to user
virtual void DisplayError(SCODE scode, LPCTSTR lpszDescription,
LPCTSTR lpszSource, LPCTSTR lpszHelpFile, UINT nHelpID);
// IOleObject notifications
virtual void OnSetClientSite();
virtual BOOL OnSetExtent(LPSIZEL lpSizeL);
virtual void OnClose(DWORD dwSaveOption);
// IOleInPlaceObject notifications
virtual BOOL OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);
// Event connection point notifications
virtual void OnEventAdvise(BOOL bAdvise);
// Override to hook firing of Click event
virtual void OnClick(USHORT iButton);
// Override to get character after key events have been processed.
virtual void OnKeyDownEvent(USHORT nChar, USHORT nShiftState);
virtual void OnKeyUpEvent(USHORT nChar, USHORT nShiftState);
virtual void OnKeyPressEvent(USHORT nChar);
// Change notifications
virtual void OnAppearanceChanged();
virtual void OnBackColorChanged();
virtual void OnBorderStyleChanged();
virtual void OnEnabledChanged();
virtual void OnTextChanged();
virtual void OnFontChanged();
virtual void OnForeColorChanged();
// IOleControl notifications
virtual void OnGetControlInfo(LPCONTROLINFO pControlInfo);
virtual void OnMnemonic(LPMSG pMsg);
virtual void OnAmbientPropertyChange(DISPID dispid);
virtual void OnFreezeEvents(BOOL bFreeze);
// In-place activation
virtual HMENU OnGetInPlaceMenu();
virtual void OnShowToolBars();
virtual void OnHideToolBars();
// IViewObject
virtual BOOL OnGetColorSet(DVTARGETDEVICE* ptd, HDC hicTargetDev,
LPLOGPALETTE* ppColorSet);
// IDataObject - see COleDataSource for a description of these overridables
virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
BOOL bRelease);
// Verbs
virtual BOOL OnEnumVerbs(LPENUMOLEVERB* ppenumOleVerb);
virtual BOOL OnDoVerb(LONG iVerb, LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
virtual BOOL OnEdit(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
virtual BOOL OnProperties(LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect);
// IPerPropertyBrowsing overrides
virtual BOOL OnGetDisplayString(DISPID dispid, CString& strValue);
virtual BOOL OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid,
BOOL* pbPageOptional);
virtual BOOL OnGetPredefinedStrings(DISPID dispid,
CStringArray* pStringArray, CDWordArray* pCookieArray);
virtual BOOL OnGetPredefinedValue(DISPID dispid, DWORD dwCookie,
VARIANT* lpvarOut);
// Subclassing
virtual BOOL IsSubclassedControl();
// Window reparenting
virtual void ReparentControlWindow(HWND hWndOuter, HWND hWndParent);
// Window procedure
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
// Implementation
~COleControl();
#ifdef _DEBUG
void AssertValid() const;
void Dump(CDumpContext& dc) const;
#endif // _DEBUG
protected:
// Friend classes
friend class COleControlInnerUnknown;
friend class CReflectorWnd;
friend class CControlFrameWnd;
// Interface hook for primary automation interface
LPUNKNOWN GetInterfaceHook(const void* piid);
// Shutdown
virtual void OnFinalRelease();
// Window management
BOOL CreateControlWindow(HWND hWndParent, const CRect& rcPos,
LPCRECT prcClipped = NULL);
void CreateWindowForSubclassedControl();
BOOL IgnoreWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam,
LRESULT* plResult);
// Serialization
HRESULT SaveState(IStream* pStm);
HRESULT LoadState(IStream* pStm);
virtual void Serialize(CArchive& ar);
// Drawing
void DrawContent(CDC* pDC, CRect& rc);
void DrawMetafile(CDC* pDC, CRect& rc);
BOOL GetMetafileData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
// IDataObject formats
void SetInitialDataFormats();
BOOL GetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
REFCLSID fmtid);
BOOL SetPropsetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
REFCLSID fmtid);
// Type library
BOOL GetDispatchIID(IID* pIID);
// Connection point container
virtual LPCONNECTIONPOINT GetConnectionHook(REFIID iid);
virtual BOOL GetExtraConnectionPoints(CPtrArray* pConnPoints);
// Events
static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[];
virtual const AFX_EVENTMAP* GetEventMap() const;
static const AFX_DATA AFX_EVENTMAP eventMap;
const AFX_EVENTMAP_ENTRY* GetEventMapEntry(LPCTSTR pszName,
DISPID* pDispid) const;
void FireEventV(DISPID dispid, BYTE* pbParams, va_list argList);
// Stock events
void KeyDown(USHORT* pnChar);
void KeyUp(USHORT* pnChar);
void ButtonDown(USHORT iButton, UINT nFlags, CPoint point);
void ButtonUp(USHORT iButton, UINT nFlags, CPoint point);
void ButtonDblClk(USHORT iButton, UINT nFlags, CPoint point);
// Masks to identify which stock events and properties are used
void InitStockEventMask();
void InitStockPropMask();
// Support for subclassing a Windows control
BOOL ContainerReflectsMessages();
BOOL ContainerClips();
CWnd* GetOuterWindow() const; // m_pReflect if any, otherwise this
virtual void OnReflectorDestroyed();
// Aggregation of default handler
virtual BOOL OnCreateAggregates();
LPVOID QueryDefHandler(REFIID iid);
// State change notifications
void SendAdvise(UINT uCode);
// Non-in-place activation
virtual HRESULT OnOpen(BOOL bTryInPlace, LPMSG pMsg);
void ResizeOpenControl(int cx, int cy);
virtual CControlFrameWnd* CreateFrameWindow();
virtual void ResizeFrameWindow(int cx, int cy);
virtual void OnFrameClose();
virtual HRESULT OnHide();
// In-place activation
virtual HRESULT OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg);
void ForwardActivationMsg(LPMSG pMsg);
virtual void AddFrameLevelUI();
virtual void RemoveFrameLevelUI();
virtual BOOL BuildSharedMenu();
virtual void DestroySharedMenu();
// Property sheet
virtual LPCLSID GetPropPageIDs(ULONG& cPropPages);
// IOleObject implementation
void GetUserType(LPTSTR pszUserType);
virtual UINT GetUserTypeNameID() = 0;
virtual DWORD GetMiscStatus() = 0;
// Rectangle tracker
void CreateTracker(BOOL bHandles, BOOL bHatching);
void DestroyTracker();
// Automation
BOOL IsInvokeAllowed(DISPID dispid);
// Data members
const IID* m_piidPrimary; // IID for control automation
const IID* m_piidEvents; // IID for control events
DWORD m_dwVersionLoaded; // Version number of loaded state
COleDispatchDriver m_ambientDispDriver; // Driver for ambient properties
DWORD m_dwStockEventMask; // Which stock events are used?
DWORD m_dwStockPropMask; // Which stock properties are used?
ULONG m_cEventsFrozen; // Event freeze count (>0 means frozen)
union
{
CControlFrameWnd* m_pWndOpenFrame; // Open frame window.
CRectTracker* m_pRectTracker; // Tracker for UI active control
};
CRect m_rcPos; // Control's position rectangle
CRect m_rcBounds; // Bounding rectangle for drawing
CPoint m_ptOffset; // Child window origin
long m_cxExtent; // Control's width in HIMETRIC units
long m_cyExtent; // Control's height in HIMETRIC units
class CReflectorWnd* m_pReflect; // Reflector window
UINT m_nIDTracking; // Tracking command ID or string IDS
UINT m_nIDLastMessage; // Last displayed message string IDS
BYTE m_bAutoMenuEnable; // Disable menu items without handlers?
BYTE m_bFinalReleaseCalled; // Are we handling the final Release?
BYTE m_bModified; // "Dirty" bit.
BYTE m_bCountOnAmbients; // Can we count on Ambients during load?
BYTE m_iButtonState; // Which buttons are down?
BYTE m_iDblClkState; // Which buttons involved in dbl click?
BYTE m_bInPlaceActive; // Are we in-place active?
BYTE m_bUIActive; // Are we UI active?
BYTE m_bPendingUIActivation; // Are we about to become UI active?
BYTE m_bOpen; // Are we open (non-in-place)?
BYTE m_bChangingExtent; // Extent is currently being changed
BYTE m_bConvertVBX; // VBX conversion in progress
BYTE m_bSimpleFrame; // Simple frame support
BYTE m_bUIDead; // UIDead ambient property value
BYTE m_bInitialized; // Was IPersist*::{InitNew,Load} called?
// Stock properties
OLE_COLOR m_clrBackColor; // BackColor
OLE_COLOR m_clrForeColor; // ForeColor
CString m_strText; // Text/Caption
CFontHolder m_font; // Font
HFONT m_hFontPrev; // Previously selected font object
short m_sAppearance; // Appearance
short m_sBorderStyle; // BorderStyle
BOOL m_bEnabled; // Enabled
// UI Active info (shared OLE menu data)
_AFXCTL_UIACTIVE_INFO* m_pUIActiveInfo;
// Default Handler aggregation
LPUNKNOWN m_pDefIUnknown;
_AFXCTL_ADVISE_INFO* m_pAdviseInfo;
LPPERSISTSTORAGE m_pDefIPersistStorage;
LPVIEWOBJECT m_pDefIViewObject;
LPOLECACHE m_pDefIOleCache;
// OLE client site interfaces
LPOLECLIENTSITE m_pClientSite; // Client site
LPOLEINPLACESITE m_pInPlaceSite; // In-place site
LPOLECONTROLSITE m_pControlSite; // Control site
LPOLEADVISEHOLDER m_pOleAdviseHolder; // Advise holder
LPDATAADVISEHOLDER m_pDataAdviseHolder; // Data advise holder
LPSIMPLEFRAMESITE m_pSimpleFrameSite; // Simple frame site
// OLE in-place activation info
LPOLEINPLACEFRAME m_pInPlaceFrame;
OLEINPLACEFRAMEINFO m_frameInfo;
LPOLEINPLACEUIWINDOW m_pInPlaceDoc;
// Implementation of IDataObject
// CControlDataSource implements OnRender reflections to COleControl
class CControlDataSource : public COleDataSource
{
protected:
virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
virtual BOOL OnRenderFileData(LPFORMATETC lpFormatEtc, CFile* pFile);
virtual BOOL OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium);
virtual BOOL OnSetData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium,
BOOL bRelease);
};
CControlDataSource m_dataSource;
friend class CControlDataSource;
// Message Maps
protected:
//{{AFX_MSG(COleControl)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnInitMenuPopup(CMenu*, UINT, BOOL);
afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
afx_msg LRESULT OnSetMessageString(WPARAM wParam, LPARAM lParam);
afx_msg void OnEnterIdle(UINT nWhy, CWnd* pWho);
afx_msg void OnCancelMode();
afx_msg void OnPaint(CDC* pDC);
afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg int OnMouseActivate(CWnd *pDesktopWnd, UINT nHitTest, UINT message);
afx_msg LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnNcPaint();
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
afx_msg UINT OnNcHitTest(CPoint point);
afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
afx_msg LRESULT OnOcmCtlColorBtn(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorDlg(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorEdit(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorListBox(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorMsgBox(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorScrollBar(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnOcmCtlColorStatic(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
// Interface Maps
public:
// IPersistStorage
BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
INIT_INTERFACE_PART(COleControl, PersistStorage)
STDMETHOD(GetClassID)(LPCLSID);
STDMETHOD(IsDirty)();
STDMETHOD(InitNew)(LPSTORAGE);
STDMETHOD(Load)(LPSTORAGE);
STDMETHOD(Save)(LPSTORAGE, BOOL);
STDMETHOD(SaveCompleted)(LPSTORAGE);
STDMETHOD(HandsOffStorage)();
END_INTERFACE_PART(PersistStorage)
// IPersistStreamInit
BEGIN_INTERFACE_PART(PersistStreamInit, IPersistStreamInit)
INIT_INTERFACE_PART(COleControl, PersistStreamInit)
STDMETHOD(GetClassID)(LPCLSID);
STDMETHOD(IsDirty)();
STDMETHOD(Load)(LPSTREAM);
STDMETHOD(Save)(LPSTREAM, BOOL);
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *);
STDMETHOD(InitNew)();
END_INTERFACE_PART(PersistStreamInit)
// IPersistMemory
BEGIN_INTERFACE_PART(PersistMemory, IPersistMemory)
INIT_INTERFACE_PART(COleControl, PersistMemory)
STDMETHOD(GetClassID)(LPCLSID);
STDMETHOD(IsDirty)();
STDMETHOD(Load)(LPVOID, ULONG);
STDMETHOD(Save)(LPVOID, BOOL, ULONG);
STDMETHOD(GetSizeMax)(ULONG*);
STDMETHOD(InitNew)();
END_INTERFACE_PART(PersistMemory)
// IPersistPropertyBag
BEGIN_INTERFACE_PART(PersistPropertyBag, IPersistPropertyBag)
INIT_INTERFACE_PART(COleControl, PersistPropertyBag)
STDMETHOD(GetClassID)(LPCLSID);
STDMETHOD(InitNew)();
STDMETHOD(Load)(LPPROPERTYBAG, LPERRORLOG);
STDMETHOD(Save)(LPPROPERTYBAG, BOOL, BOOL);
END_INTERFACE_PART(PersistPropertyBag)
// IOleObject
BEGIN_INTERFACE_PART(OleObject, IOleObject)
INIT_INTERFACE_PART(COleControl, OleObject)
STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
STDMETHOD(Close)(DWORD);
STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);
STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
STDMETHOD(Update)();
STDMETHOD(IsUpToDate)();
STDMETHOD(GetUserClassID)(CLSID*);
STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
STDMETHOD(SetExtent)(DWORD, LPSIZEL);
STDMETHOD(GetExtent)(DWORD, LPSIZEL);
STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
STDMETHOD(Unadvise)(DWORD);
STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
STDMETHOD(SetColorScheme)(LPLOGPALETTE);
END_INTERFACE_PART(OleObject)
// IViewObject2
BEGIN_INTERFACE_PART(ViewObject, IViewObject2)
INIT_INTERFACE_PART(COleControl, ViewObject)
STDMETHOD(Draw)(DWORD, LONG, void*, DVTARGETDEVICE*, HDC, HDC,
LPCRECTL, LPCRECTL, BOOL (CALLBACK*)(DWORD), DWORD);
STDMETHOD(GetColorSet)(DWORD, LONG, void*, DVTARGETDEVICE*,
HDC, LPLOGPALETTE*);
STDMETHOD(Freeze)(DWORD, LONG, void*, DWORD*);
STDMETHOD(Unfreeze)(DWORD);
STDMETHOD(SetAdvise)(DWORD, DWORD, LPADVISESINK);
STDMETHOD(GetAdvise)(DWORD*, DWORD*, LPADVISESINK*);
STDMETHOD(GetExtent) (DWORD, LONG, DVTARGETDEVICE*, LPSIZEL);
END_INTERFACE_PART(ViewObject)
// IDataObject
BEGIN_INTERFACE_PART(DataObject, IDataObject)
INIT_INTERFACE_PART(COleControl, DataObject)
STDMETHOD(GetData)(LPFORMATETC, LPSTGMEDIUM);
STDMETHOD(GetDataHere)(LPFORMATETC, LPSTGMEDIUM);
STDMETHOD(QueryGetData)(LPFORMATETC);
STDMETHOD(GetCanonicalFormatEtc)(LPFORMATETC, LPFORMATETC);
STDMETHOD(SetData)(LPFORMATETC, LPSTGMEDIUM, BOOL);
STDMETHOD(EnumFormatEtc)(DWORD, LPENUMFORMATETC*);
STDMETHOD(DAdvise)(LPFORMATETC, DWORD, LPADVISESINK, LPDWORD);
STDMETHOD(DUnadvise)(DWORD);
STDMETHOD(EnumDAdvise)(LPENUMSTATDATA*);
END_INTERFACE_PART(DataObject)
// IOleInPlaceObject
BEGIN_INTERFACE_PART(OleInPlaceObject, IOleInPlaceObject)
INIT_INTERFACE_PART(COleControl, OleInPlaceObject)
STDMETHOD(GetWindow)(HWND*);
STDMETHOD(ContextSensitiveHelp)(BOOL);
STDMETHOD(InPlaceDeactivate)();
STDMETHOD(UIDeactivate)();
STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT);
STDMETHOD(ReactivateAndUndo)();
END_INTERFACE_PART(OleInPlaceObject)
// IOleInPlaceActiveObject
BEGIN_INTERFACE_PART(OleInPlaceActiveObject, IOleInPlaceActiveObject)
INIT_INTERFACE_PART(COleControl, OleInPlaceActiveObject)
STDMETHOD(GetWindow)(HWND*);
STDMETHOD(ContextSensitiveHelp)(BOOL);
STDMETHOD(TranslateAccelerator)(LPMSG);
STDMETHOD(OnFrameWindowActivate)(BOOL);
STDMETHOD(OnDocWindowActivate)(BOOL);
STDMETHOD(ResizeBorder)(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);
STDMETHOD(EnableModeless)(BOOL);
END_INTERFACE_PART(OleInPlaceActiveObject)
// IOleCache
BEGIN_INTERFACE_PART(OleCache, IOleCache)
INIT_INTERFACE_PART(COleControl, OleCache)
STDMETHOD(Cache)(LPFORMATETC, DWORD, LPDWORD);
STDMETHOD(Uncache)(DWORD);
STDMETHOD(EnumCache)(LPENUMSTATDATA*);
STDMETHOD(InitCache)(LPDATAOBJECT);
STDMETHOD(SetData)(LPFORMATETC, STGMEDIUM*, BOOL);
END_INTERFACE_PART(OleCache)
// IOleControl
BEGIN_INTERFACE_PART(OleControl, IOleControl)
INIT_INTERFACE_PART(COleControl, OleControl)
STDMETHOD(GetControlInfo)(LPCONTROLINFO pCI);
STDMETHOD(OnMnemonic)(LPMSG pMsg);
STDMETHOD(OnAmbientPropertyChange)(DISPID dispid);
STDMETHOD(FreezeEvents)(BOOL bFreeze);
END_INTERFACE_PART(OleControl)
// IProvideClassInfo2
BEGIN_INTERFACE_PART(ProvideClassInfo, IProvideClassInfo2)
INIT_INTERFACE_PART(COleControl, ProvideClassInfo)
STDMETHOD(GetClassInfo)(LPTYPEINFO* ppTypeInfo);
STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID* pGUID);
END_INTERFACE_PART(ProvideClassInfo)
// ISpecifyPropertyPages
BEGIN_INTERFACE_PART(SpecifyPropertyPages, ISpecifyPropertyPages)
INIT_INTERFACE_PART(COleControl, SpecifyPropertyPages)
STDMETHOD(GetPages)(CAUUID*);
END_INTERFACE_PART(SpecifyPropertyPages)
// IPerPropertyBrowsing
BEGIN_INTERFACE_PART(PerPropertyBrowsing, IPerPropertyBrowsing)
INIT_INTERFACE_PART(COleControl, PerPropertyBrowsing)
STDMETHOD(GetDisplayString)(DISPID dispid, BSTR* lpbstr);
STDMETHOD(MapPropertyToPage)(DISPID dispid, LPCLSID lpclsid);
STDMETHOD(GetPredefinedStrings)(DISPID dispid,
CALPOLESTR* lpcaStringsOut, CADWORD* lpcaCookiesOut);
STDMETHOD(GetPredefinedValue)(DISPID dispid, DWORD dwCookie,
VARIANT* lpvarOut);
END_INTERFACE_PART(PerPropertyBrowsing)
// IPropertyNotifySink for font updates (not exposed via QueryInterface)
BEGIN_INTERFACE_PART(FontNotification, IPropertyNotifySink)
INIT_INTERFACE_PART(COleControl, FontNotification)
STDMETHOD(OnChanged)(DISPID dispid);
STDMETHOD(OnRequestEdit)(DISPID dispid);
END_INTERFACE_PART(FontNotification)
DECLARE_INTERFACE_MAP()
// Connection maps
protected:
// Connection point for events
BEGIN_CONNECTION_PART(COleControl, EventConnPt)
virtual void OnAdvise(BOOL bAdvise);
virtual REFIID GetIID();
END_CONNECTION_PART(EventConnPt)
// Connection point for property notifications
BEGIN_CONNECTION_PART(COleControl, PropConnPt)
CONNECTION_IID(IID_IPropertyNotifySink)
END_CONNECTION_PART(PropConnPt)
DECLARE_CONNECTION_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// Registry functions
enum AFX_REG_FLAGS
{
afxRegInsertable = 0x0001,
afxRegApartmentThreading = 0x0002,
};
BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid,
LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL);
BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlid);
BOOL AFXAPI AfxOleRegisterControlClass(HINSTANCE hInstance, REFCLSID clsid,
LPCTSTR pszProgID, UINT idTypeName, UINT idBitmap, int nRegFlags,
DWORD dwMiscStatus, REFGUID tlid, WORD wVerMajor, WORD wVerMinor);
BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsid, LPCTSTR pszProgID);
BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
REFCLSID clsid, UINT idTypeName);
BOOL AFXAPI AfxOleRegisterPropertyPageClass(HINSTANCE hInstance,
REFCLSID clsid, UINT idTypeName, int nRegFlags);
/////////////////////////////////////////////////////////////////////////////
// Licensing functions
BOOL AFXAPI AfxVerifyLicFile(HINSTANCE hInstance, LPCTSTR pszLicFileName,
LPCOLESTR pszLicFileContents, UINT cch=-1);
/////////////////////////////////////////////////////////////////////////////
// CPropExchange - Abstract base class for property exchange
class CPropExchange
{
// Operations
public:
BOOL IsLoading();
DWORD GetVersion();
BOOL ExchangeVersion(DWORD& dwVersionLoaded, DWORD dwVersionDefault,
BOOL bConvert);
virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
void* pvProp, const void* pvDefault = NULL) = 0;
virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, HGLOBAL* phBlob,
HGLOBAL hBlobDefault = NULL) = 0;
virtual BOOL ExchangeFontProp(LPCTSTR pszPropName, CFontHolder& font,
const FONTDESC* pFontDesc,
LPFONTDISP pFontDispAmbient) = 0;
virtual BOOL ExchangePersistentProp(LPCTSTR pszPropName,
LPUNKNOWN* ppUnk, REFIID iid, LPUNKNOWN pUnkDefault) = 0;
// Implementation
protected:
CPropExchange();
BOOL m_bLoading;
DWORD m_dwVersion;
};
/////////////////////////////////////////////////////////////////////////////
// Property-exchange (PX_) helper functions
BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue);
BOOL AFX_CDECL PX_Short(CPropExchange* pPX, LPCTSTR pszPropName, short& sValue,
short sDefault);
BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue);
BOOL AFX_CDECL PX_UShort(CPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue,
USHORT usDefault);
BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue);
BOOL AFX_CDECL PX_Long(CPropExchange* pPX, LPCTSTR pszPropName, long& lValue,
long lDefault);
BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue);
BOOL AFX_CDECL PX_ULong(CPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue,
ULONG ulDefault);
BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue);
BOOL AFX_CDECL PX_Color(CPropExchange* pPX, LPCTSTR pszPropName, OLE_COLOR& clrValue,
OLE_COLOR clrDefault);
BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue);
BOOL AFX_CDECL PX_Bool(CPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue,
BOOL bDefault);
BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue);
BOOL AFX_CDECL PX_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue,
const CString& strDefault);
BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue);
BOOL AFX_CDECL PX_Currency(CPropExchange* pPX, LPCTSTR pszPropName, CY& cyValue,
CY cyDefault);
BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue);
BOOL AFX_CDECL PX_Float(CPropExchange* pPX, LPCTSTR pszPropName, float& floatValue,
float floatDefault);
BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue);
BOOL AFX_CDECL PX_Double(CPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue,
double doubleDefault);
BOOL AFX_CDECL PX_Blob(CPropExchange* pPX, LPCTSTR pszPropName, HGLOBAL& hBlob,
HGLOBAL hBlobDefault = NULL);
BOOL AFX_CDECL PX_Font(CPropExchange* pPX, LPCTSTR pszPropName, CFontHolder& font,
const FONTDESC* pFontDesc = NULL,
LPFONTDISP pFontDispAmbient = NULL);
BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
CPictureHolder& pict);
BOOL AFX_CDECL PX_Picture(CPropExchange* pPX, LPCTSTR pszPropName,
CPictureHolder& pict, CPictureHolder& pictDefault);
BOOL AFX_CDECL PX_IUnknown(CPropExchange* pPX, LPCTSTR pszPropName, LPUNKNOWN& pUnk,
REFIID iid, LPUNKNOWN pUnkDefault = NULL);
BOOL AFX_CDECL PX_VBXFontConvert(CPropExchange* pPX, CFontHolder& font);
/////////////////////////////////////////////////////////////////////////////
// Structures used by COlePropertyPage
typedef struct tagAFX_PPFIELDSTATUS
{
UINT nID;
BOOL bDirty;
} AFX_PPFIELDSTATUS;
/////////////////////////////////////////////////////////////////////////////
// Property Page Dialog Class
class COlePropertyPage : public CDialog
{
DECLARE_DYNAMIC(COlePropertyPage)
// Constructors
public:
COlePropertyPage(UINT idDlg, UINT idCaption);
// Operations
LPDISPATCH* GetObjectArray(ULONG* pnObjects);
void SetModifiedFlag(BOOL bModified = TRUE);
BOOL IsModified();
LPPROPERTYPAGESITE GetPageSite();
void SetDialogResource(HGLOBAL hDialog);
void SetPageName(LPCTSTR lpszPageName);
void SetHelpInfo(LPCTSTR lpszDocString, LPCTSTR lpszHelpFile = NULL,
DWORD dwHelpContext = 0);
BOOL GetControlStatus(UINT nID);
BOOL SetControlStatus(UINT nID, BOOL bDirty);
void IgnoreApply(UINT nID);
int MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK);
// note that this is a non-virtual override of CWnd::MessageBox()
// Overridables
virtual void OnSetPageSite();
virtual void OnObjectsChanged();
virtual BOOL OnHelp(LPCTSTR lpszHelpDir);
virtual BOOL OnInitDialog();
virtual BOOL OnEditProperty(DISPID dispid);
// Implementation
// DDP_ property get/set helper routines
BOOL SetPropText(LPCTSTR pszPropName, BYTE &Value);
BOOL GetPropText(LPCTSTR pszPropName, BYTE* pValue);
BOOL SetPropText(LPCTSTR pszPropName, int &Value);
BOOL GetPropText(LPCTSTR pszPropName, int* pValue);
BOOL SetPropText(LPCTSTR pszPropName, UINT &Value);
BOOL GetPropText(LPCTSTR pszPropName, UINT* pValue);
BOOL SetPropText(LPCTSTR pszPropName, long &Value);
BOOL GetPropText(LPCTSTR pszPropName, long* pValue);
BOOL SetPropText(LPCTSTR pszPropName, DWORD &Value);
BOOL GetPropText(LPCTSTR pszPropName, DWORD* pValue);
BOOL SetPropText(LPCTSTR pszPropName, CString &Value);
BOOL GetPropText(LPCTSTR pszPropName, CString* pValue);
BOOL SetPropText(LPCTSTR pszPropName, float &Value);
BOOL GetPropText(LPCTSTR pszPropName, float* pValue);
BOOL SetPropText(LPCTSTR pszPropName, double &Value);
BOOL GetPropText(LPCTSTR pszPropName, double* pValue);
BOOL SetPropCheck(LPCTSTR pszPropName, int Value);
BOOL GetPropCheck(LPCTSTR pszPropName, int* pValue);
BOOL SetPropRadio(LPCTSTR pszPropName, int Value);
BOOL GetPropRadio(LPCTSTR pszPropName, int* pValue);
BOOL SetPropIndex(LPCTSTR pszPropName, int Value);
BOOL GetPropIndex(LPCTSTR pszPropName, int* pValue);
CPtrArray m_arrayDDP; // pending DDP data
// Destructors
~COlePropertyPage();
protected:
LRESULT WindowProc(UINT msg, WPARAM wParam, LPARAM lParam);
BOOL OnCommand(WPARAM wParam, LPARAM lParam);
BOOL PreTranslateMessage(LPMSG lpMsg);
virtual void OnFinalRelease();
void CleanupObjectArray();
static BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam);
static BOOL CALLBACK EnumControls(HWND hWnd, LPARAM lParam);
private:
BOOL m_bDirty;
UINT m_idDlg;
UINT m_idCaption;
CString m_strPageName;
SIZE m_sizePage;
CString m_strDocString;
CString m_strHelpFile;
DWORD m_dwHelpContext;
LPPROPERTYPAGESITE m_pPageSite;
LPDISPATCH* m_ppDisp; // Array of IDispatch pointers, used to
// access the properties of each control
LPDWORD m_pAdvisors; // Array of connection tokens used by
// IConnecitonPoint::Advise/UnAdvise.
BOOL m_bPropsChanged; // IPropertyNotifySink::OnChanged has been
// called, but not acted upon yet.
ULONG m_nObjects; // Objects in m_ppDisp, m_ppDataObj, m_pAdvisors
BOOL m_bInitializing; // TRUE if the contents of the fields of
// the dialog box are being initialized
int m_nControls; // Number of fields on this property page
AFX_PPFIELDSTATUS* m_pStatus; // Array containing information on
// which fields are dirty
CWordArray m_IDArray; // Array containing information on which
// controls to ignore when deciding if
// the apply button is to be enabled
HGLOBAL m_hDialog; // Handle of the dialog resource
#ifdef _DEBUG
BOOL m_bNonStandardSize;
#endif
protected:
// Generated message map functions
//{{AFX_MSG(COlePropertyPage)
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
// Interface Maps
public:
BEGIN_INTERFACE_PART(PropertyPage, IPropertyPage2)
INIT_INTERFACE_PART(COlePropertyPage, PropertyPage)
STDMETHOD(SetPageSite)(LPPROPERTYPAGESITE);
STDMETHOD(Activate)(HWND, LPCRECT, BOOL);
STDMETHOD(Deactivate)();
STDMETHOD(GetPageInfo)(LPPROPPAGEINFO);
STDMETHOD(SetObjects)(ULONG, LPUNKNOWN*);
STDMETHOD(Show)(UINT);
STDMETHOD(Move)(LPCRECT);
STDMETHOD(IsPageDirty)();
STDMETHOD(Apply)();
STDMETHOD(Help)(LPCOLESTR);
STDMETHOD(TranslateAccelerator)(LPMSG);
STDMETHOD(EditProperty)(DISPID);
END_INTERFACE_PART(PropertyPage)
BEGIN_INTERFACE_PART(PropNotifySink, IPropertyNotifySink)
INIT_INTERFACE_PART(COlePropertyPage, PropNotifySink)
STDMETHOD(OnRequestEdit)(DISPID);
STDMETHOD(OnChanged)(DISPID);
END_INTERFACE_PART(PropNotifySink)
DECLARE_INTERFACE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// Property Page Dialog Data Exchange routines
// simple text operations
void AFXAPI DDP_Text(CDataExchange*pDX, int id, BYTE& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, UINT& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, long& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, DWORD& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, float& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, double& member, LPCTSTR pszPropName);
void AFXAPI DDP_Text(CDataExchange*pDX, int id, CString& member, LPCTSTR pszPropName);
void AFXAPI DDP_Check(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
void AFXAPI DDP_Radio(CDataExchange*pDX, int id, int& member, LPCTSTR pszPropName);
void AFXAPI DDP_LBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
void AFXAPI DDP_LBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
void AFXAPI DDP_LBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
void AFXAPI DDP_CBString(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
void AFXAPI DDP_CBStringExact(CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName);
void AFXAPI DDP_CBIndex(CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName);
void AFXAPI DDP_PostProcessing(CDataExchange *pDX);
////////////////////////////////////////////////////////////////////////////
// AfxOleTypeMatchGuid - Tests whether a given TYPEDESC matches a type with a
// given GUID, when all aliases have been expanded.
BOOL AFXAPI AfxOleTypeMatchGuid(LPTYPEINFO pTypeInfo,
TYPEDESC* pTypeDesc, REFGUID guidType, ULONG cIndirectionLevels);
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
#ifdef _AFX_ENABLE_INLINES
#define _AFXCTL_INLINE inline
#include <afxctl.inl>
#endif
#undef AFX_DATA
#define AFX_DATA
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif
#endif // __AFXCTL_H__
/////////////////////////////////////////////////////////////////////////////