|
|
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 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__
// make sure afxole.h is included first
#ifndef __AFXOLE_H__
#include <afxole.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
#if _MFC_VER >= 0x0600
class CStockPropPage; class CColorPropPage; class CFontPropPage; class CPicturePropPage; #endif
class CPropExchange; // Abstract base for property exchange
//CAsyncMonikerFile
class CDataPathProperty; // Asynchronous properties for OLE Controls
class CCachedDataPathProperty; // Cached asynchronous properties for OLE Controls
/////////////////////////////////////////////////////////////////////////////
// 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; DWORD* lpStockEventMask; };
#define DECLARE_EVENT_MAP() \
private: \ static const AFX_DATA AFX_EVENTMAP_ENTRY _eventEntries[]; \ static DWORD _dwStockEventMask; \ 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, \ &theClass::_dwStockEventMask }; \ AFX_COMDAT DWORD theClass::_dwStockEventMask = (DWORD)-1; \ AFX_COMDAT 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 },
#define EVENT_STOCK_READYSTATECHANGE() \
{ afxEventStock, DISPID_READYSTATECHANGE, _T("ReadyStateChange"), \ VTS_I4 },
// 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)
#define DISP_STOCKPROP_READYSTATE() \
DISP_PROPERTY_STOCK(COleControl, "ReadyState", DISPID_READYSTATE, \ COleControl::GetReadyState, SetNotSupported, VT_I4)
/////////////////////////////////////////////////////////////////////////////
// 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)
#if _MFC_VER >= 0x0600
#define IMPLEMENT_OLECREATE_EX(class_name, external_name, \
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ 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; }
#else
#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; }
#endif
/////////////////////////////////////////////////////////////////////////////
// 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);
#if _MFC_VER >= 0x0600
#define BEGIN_PROPPAGEIDS(class_name, count) \
static CLSID _rgPropPageIDs_##class_name[count]; \ AFX_COMDAT 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; #else
#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; #endif
#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(); #if _MFC_VER >= 0x0600
void SetFontNotifySink(LPPROPERTYNOTIFYSINK pNotify); #endif
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(); };
/////////////////////////////////////////////////////////////////////////////
// CDataPathProperty - Asynchonous properties for OLE Controls
class CDataPathProperty: public CAsyncMonikerFile { DECLARE_DYNAMIC(CDataPathProperty) // Constructors
public: CDataPathProperty(COleControl* pControl = NULL); CDataPathProperty(LPCTSTR lpszPath, COleControl* pControl = NULL); // Calls SetPath(pControl) and SetPath(lpszPath) as appropriate.
// Attributes
public: void SetPath(LPCTSTR lpszPath); // Sets the path to be opened by Open(COleControl*) and Open()
// lpszPath may be NULL.
CString GetPath() const; // Returns the current path setting. Result may be empty.
COleControl* GetControl(); // Returns a Pointer to the control. Result may be NULL.
void SetControl(COleControl* pControl); // Sets the control which will be used with Open. pControl may be NULL.
// Operations
public: // Overloads of Open takings some or all of: a path, a control,
// and a CFileException
// Overloads taking a COleControl call SetControl(pControl)
// Overloads taking an LPCTSTR cal SetPath(lpszPath)
virtual BOOL Open(COleControl* pControl, CFileException* pError = NULL); virtual BOOL Open(LPCTSTR lpszPath, COleControl* pControl, CFileException* pError = NULL); virtual BOOL Open(LPCTSTR lpszPath, CFileException* pError = NULL); virtual BOOL Open(CFileException* pError = NULL); // Attempts to obtain an IBindHost* from the control returned by
// GetControl(). Calls CAsyncMonikerFile::Open with the path returned by
// GetPath() and, if it was obtained, the IBindHost*.
// Returns TRUE if successful.
// Overridables
public: virtual void ResetData(); // Derived classes should overide this.
// Implementation
public: #ifdef _DEBUG
virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif
private: COleControl* m_pControl; CString m_strPath; };
/////////////////////////////////////////////////////////////////////////////
// CCachedDataPathProperty - Cached asynchonous properties for OLE Controls
class CCachedDataPathProperty : public CDataPathProperty { DECLARE_DYNAMIC(CCachedDataPathProperty) //Constructors
public: CCachedDataPathProperty(COleControl* pControl = NULL); CCachedDataPathProperty(LPCTSTR lpszPath, COleControl* pControl = NULL);
// Attributes
public: CMemFile m_Cache;
// Implementation
public: virtual void OnDataAvailable(DWORD dwSize, DWORD bscfFlag); virtual void Close(); virtual void ResetData(); #ifdef _DEBUG
virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif
};
/////////////////////////////////////////////////////////////////////////////
// COleControl - base class for a control implemented in C++ with MFC
struct _AFXCTL_ADVISE_INFO; // implementation class
struct _AFXCTL_UIACTIVE_INFO; // implementation class
#if _MFC_VER >= 0x0600
class CControlRectTracker : public CRectTracker { // Implementation
public: CControlRectTracker(LPCRECT lpSrcRect, UINT nStyle) : CRectTracker(lpSrcRect, nStyle) { } CRect m_rectClip; // saves the original clipping rectangle
}; #endif
#ifdef _AFXDLL
class COleControl : public CWnd #else
class AFX_NOVTABLE COleControl : public CWnd #endif
{ 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, BOOL bErase = TRUE);
// Modified flag
BOOL IsModified(); void SetModifiedFlag(BOOL bModified = TRUE);
// Drawing operations
void DoSuperclassPaint(CDC* pDC, const CRect& rcBounds); BOOL IsOptimizedDraw();
// Property exchange
BOOL ExchangeVersion(CPropExchange* pPX, DWORD dwVersionDefault, BOOL bConvert = TRUE); BOOL ExchangeExtent(CPropExchange* pPX); void ExchangeStockProps(CPropExchange* pPX); BOOL IsConvertingVBX();
DWORD SerializeVersion(CArchive& ar, DWORD dwVersionDefault, BOOL bConvert = TRUE); void SerializeExtent(CArchive& ar); void SerializeStockProps(CArchive& ar);
void ResetVersion(DWORD dwVersionDefault); void ResetStockProps();
// 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); long GetReadyState(); void InternalSetReadyState(long lNewReadyState);
// 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); void FireReadyStateChange();
// 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();
// Windowless operations
CWnd* SetCapture(); BOOL ReleaseCapture(); CWnd* GetCapture(); CWnd* SetFocus(); CWnd* GetFocus(); CDC* GetDC(LPCRECT lprcRect = NULL, DWORD dwFlags = OLEDC_PAINTBKGND); int ReleaseDC(CDC* pDC); void InvalidateRgn(CRgn* pRgn, BOOL bErase = TRUE); void ScrollWindow(int xAmount, int yAmount, LPCRECT lpRect = NULL, LPCRECT lpClipRect = NULL); BOOL ClipCaretRect(LPRECT lpRect); virtual void GetClientRect(LPRECT lpRect) const;
// 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); virtual BOOL OnGetViewExtent(DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE* ptd, LPSIZEL lpsizel); virtual BOOL OnGetViewRect(DWORD dwAspect, LPRECTL pRect); virtual DWORD OnGetViewStatus(); virtual BOOL OnQueryHitPoint(DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD* pHitResult); virtual BOOL OnQueryHitRect(DWORD dwAspect, LPCRECT pRectBounds, LPCRECT prcLoc, LONG lCloseHint, DWORD* pHitResult); virtual BOOL OnGetNaturalExtent(DWORD dwAspect, LONG lindex, DVTARGETDEVICE* ptd, HDC hicTargetDev, DVEXTENTINFO* pExtentInfo, LPSIZEL psizel);
// 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);
// General-purpose flags
enum ControlFlags { fastBeginPaint = 0x0001, clipPaintDC = 0x0002, pointerInactive = 0x0004, noFlickerActivate = 0x0008, windowlessActivate = 0x0010, canOptimizeDraw = 0x0020, }; virtual DWORD GetControlFlags();
// Inactive pointer handling
virtual DWORD GetActivationPolicy(); virtual BOOL OnInactiveSetCursor(LPCRECT lprcBounds, long x, long y, DWORD dwMouseMsg, BOOL bSetAlways); virtual void OnInactiveMouseMove(LPCRECT lprcBounds, long x, long y, DWORD dwKeyState);
// Windowless activation handling
virtual BOOL OnWindowlessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult); virtual IDropTarget* GetWindowlessDropTarget();
// Inactive/windowless helper functions
virtual void GetClientOffset(long* pdxOffset, long* pdyOffset) const; virtual UINT ParentToClient(LPCRECT lprcBounds, LPPOINT pPoint, BOOL bHitTest = FALSE) const; virtual void ClientToParent(LPCRECT lprcBounds, LPPOINT pPoint) const;
// Asynchronous properties
void Load(LPCTSTR strNewPath, CDataPathProperty& prop);
// Implementation
public: ~COleControl(); void RequestAsynchronousExchange(DWORD dwVersion);
#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(); #if _MFC_VER >= 0x0600
void ReleaseCaches(); #endif
// Window management
virtual BOOL CreateControlWindow(HWND hWndParent, const CRect& rcPos, LPCRECT prcClipped = NULL); void CreateWindowForSubclassedControl(); BOOL IgnoreWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult); virtual LRESULT DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
// 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);
// Implementation of IDataObject
// CControlDataSource implements OnRender reflections to COleControl
class CControlDataSource : public COleDataSource { public: CControlDataSource(COleControl* pCtrl); 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); COleControl* m_pCtrl; }; friend class CControlDataSource;
// IDataObject formats
CControlDataSource* GetDataSource(); virtual 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(); DWORD GetStockEventMask() const; DWORD GetStockPropMask() const;
// Support for subclassing a Windows control
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); #if defined(_AFXDLL) || _MFC_VER < 0x0600
void ResizeOpenControl(int cx, int cy); virtual CControlFrameWnd* CreateFrameWindow(); virtual void ResizeFrameWindow(int cx, int cy); virtual void OnFrameClose(); #endif
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); #if _MFC_VER >= 0x0600
void CreateTracker(BOOL bHandles, BOOL bHatching, LPCRECT prcClip); #endif
void DestroyTracker();
// Automation
BOOL IsInvokeAllowed(DISPID dispid);
// Ambient property interface initialization
COleDispatchDriver* GetAmbientDispatchDriver();
// 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
ULONG m_cEventsFrozen; // Event freeze count (>0 means frozen)
union { #if _MFC_VER >= 0x0600
#ifdef _AFXDLL
CControlFrameWnd* m_pWndOpenFrame; // Open frame window.
#endif
CControlRectTracker* m_pRectTracker; // Tracker for UI active control
#else
CControlFrameWnd* m_pWndOpenFrame; // Open frame window.
CRectTracker* m_pRectTracker; // Tracker for UI active control
#endif
}; 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
unsigned m_bAutoMenuEnable : 1; // Disable menu items without handlers?
unsigned m_bFinalReleaseCalled : 1; // Are we handling the final Release?
unsigned m_bModified : 1; // "Dirty" bit.
unsigned m_bCountOnAmbients : 1; // Can we count on Ambients during load?
unsigned m_iButtonState : 3; // Which buttons are down?
unsigned m_iDblClkState : 3; // Which buttons involved in dbl click?
unsigned m_bInPlaceActive : 1; // Are we in-place active?
unsigned m_bUIActive : 1; // Are we UI active?
unsigned m_bPendingUIActivation : 1; // Are we about to become UI active?
#if defined(_AFXDLL) || _MFC_VER < 0x0600
unsigned m_bOpen : 1; // Are we open (non-in-place)?
#endif
unsigned m_bChangingExtent : 1; // Extent is currently being changed
unsigned m_bConvertVBX : 1; // VBX conversion in progress
unsigned m_bSimpleFrame : 1; // Simple frame support
unsigned m_bUIDead : 1; // UIDead ambient property value
unsigned m_bInitialized : 1; // Was IPersist*::{InitNew,Load} called?
unsigned m_bAutoClip : 1; // Does container automatically clip?
unsigned m_bMsgReflect : 1; // Does container reflect messages?
unsigned m_bInPlaceSiteEx : 1; // Extended in-place site?
unsigned m_bInPlaceSiteWndless : 1; // Windowless in-place site?
unsigned m_bNoRedraw : 1; // Should we skip OnPaint this time?
unsigned m_bOptimizedDraw : 1; // Is optimized drawing possible?
// 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
long m_lReadyState; // ReadyState
// 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
union { LPOLEINPLACESITE m_pInPlaceSite; // In-place site
LPOLEINPLACESITEEX m_pInPlaceSiteEx; LPOLEINPLACESITEWINDOWLESS m_pInPlaceSiteWndless; }; 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;
// OLE data source
CControlDataSource* m_pDataSource;
// OLE data path load data
BOOL m_bDataPathPropertiesLoaded; DWORD m_dwDataPathVersionToReport;
// 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); #if _MFC_VER >= 0x0600
afx_msg BOOL OnEraseBkgnd(CDC* pDC); #endif
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 int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnMove(int x, int y); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); //}}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()
#if _MFC_VER >= 0x0600
// button handler helpers
void OnButtonUp(USHORT nButton, UINT nFlags, CPoint point); void OnButtonDown(USHORT nButton, UINT nFlags, CPoint point); void OnButtonDblClk(USHORT nButton, UINT nFlags, CPoint point); #endif
// 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)(); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PersistStorage) #else
END_INTERFACE_PART(PersistStorage) #endif
// 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)(); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PersistStreamInit) #else
END_INTERFACE_PART(PersistStreamInit) #endif
// 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)(); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PersistMemory) #else
END_INTERFACE_PART(PersistMemory) #endif
// 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); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PersistPropertyBag) #else
END_INTERFACE_PART(PersistPropertyBag) #endif
// 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)
// IViewObjectEx
BEGIN_INTERFACE_PART(ViewObject, IViewObjectEx) INIT_INTERFACE_PART(COleControl, ViewObject) STDMETHOD(Draw)(DWORD, LONG, void*, DVTARGETDEVICE*, HDC, HDC, LPCRECTL, LPCRECTL, BOOL (CALLBACK*)(DWORD_PTR), DWORD_PTR); 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); STDMETHOD(GetRect)(DWORD, LPRECTL); STDMETHOD(GetViewStatus)(DWORD*); STDMETHOD(QueryHitPoint)(DWORD, LPCRECT, POINT, LONG, DWORD*); STDMETHOD(QueryHitRect)(DWORD, LPCRECT, LPCRECT, LONG, DWORD*); STDMETHOD(GetNaturalExtent)(DWORD, LONG, DVTARGETDEVICE*, HDC, DVEXTENTINFO*, 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*); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(DataObject) #else
END_INTERFACE_PART(DataObject) #endif
// IOleInPlaceObject
BEGIN_INTERFACE_PART(OleInPlaceObject, IOleInPlaceObjectWindowless) INIT_INTERFACE_PART(COleControl, OleInPlaceObject) STDMETHOD(GetWindow)(HWND*); STDMETHOD(ContextSensitiveHelp)(BOOL); STDMETHOD(InPlaceDeactivate)(); STDMETHOD(UIDeactivate)(); STDMETHOD(SetObjectRects)(LPCRECT, LPCRECT); STDMETHOD(ReactivateAndUndo)(); STDMETHOD(OnWindowMessage)(UINT msg, WPARAM wParam, LPARAM lparam, LRESULT* plResult); STDMETHOD(GetDropTarget)(IDropTarget **ppDropTarget); 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); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(OleCache) #else
END_INTERFACE_PART(OleCache) #endif
// 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); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(ProvideClassInfo) #else
END_INTERFACE_PART(ProvideClassInfo) #endif
// ISpecifyPropertyPages
BEGIN_INTERFACE_PART(SpecifyPropertyPages, ISpecifyPropertyPages) INIT_INTERFACE_PART(COleControl, SpecifyPropertyPages) STDMETHOD(GetPages)(CAUUID*); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(SpecifyPropertyPages) #else
END_INTERFACE_PART(SpecifyPropertyPages) #endif
// 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); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PerPropertyBrowsing) #else
END_INTERFACE_PART(PerPropertyBrowsing) #endif
// 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); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(FontNotification) #else
END_INTERFACE_PART(FontNotification) #endif
// IQuickActivate
BEGIN_INTERFACE_PART(QuickActivate, IQuickActivate) STDMETHOD(QuickActivate)(QACONTAINER *pQAContainer, QACONTROL *pqacontrol); STDMETHOD(SetContentExtent)(LPSIZEL lpsizel); STDMETHOD(GetContentExtent)(LPSIZEL lpsizel); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(QuickActivate) #else
END_INTERFACE_PART(QuickActivate) #endif
// IPointerInactive
BEGIN_INTERFACE_PART(PointerInactive, IPointerInactive) STDMETHOD(GetActivationPolicy)(DWORD* pdwPolicy); STDMETHOD(OnInactiveSetCursor)(LPCRECT lprcBounds, long x, long y, DWORD dwMouseMsg, BOOL bSetAlways); STDMETHOD(OnInactiveMouseMove)(LPCRECT lprcBounds, long x, long y, DWORD dwKeyState); #if _MFC_VER >= 0x0600
END_INTERFACE_PART_STATIC(PointerInactive) #else
END_INTERFACE_PART(PointerInactive) #endif
DECLARE_INTERFACE_MAP()
// Connection maps
protected: // Connection point for events
BEGIN_CONNECTION_PART(COleControl, EventConnPt) virtual void OnAdvise(BOOL bAdvise); virtual REFIID GetIID(); virtual LPUNKNOWN QuerySinkInterface(LPUNKNOWN pUnkSink); 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 { afxRegDefault = 0x0000, afxRegInsertable = 0x0001, afxRegApartmentThreading = 0x0002, };
BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid, LPCTSTR pszFileName = NULL, LPCTSTR pszHelpDir = NULL);
BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlid, WORD wVerMajor = 0, WORD wVerMinor = 0, LCID lcid = 0);
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
#ifdef _AFXDLL
class CPropExchange #else
class AFX_NOVTABLE CPropExchange #endif
{ // Operations
public: BOOL IsLoading(); DWORD GetVersion();
BOOL IsAsynchronous(); // FALSE -> Do Sync stuff, and start async stuff if possible
// TRUE -> Do not do Sync stuff. Always start Async stuff
virtual 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; BOOL m_bAsync; 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_String(CPropExchange* pPX, LPCTSTR pszPropName, CString& strValue, LPCTSTR lpszDefault);
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);
BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName, CDataPathProperty& dataPathProp, LPCTSTR pszDefault = NULL);
BOOL AFX_CDECL PX_DataPath(CPropExchange* pPX, LPCTSTR pszPropName, CDataPathProperty& dataPathProp, const CString& strDefault);
/////////////////////////////////////////////////////////////////////////////
// Structures used by COlePropertyPage
typedef struct tagAFX_PPFIELDSTATUS { UINT nID; BOOL bDirty;
} AFX_PPFIELDSTATUS;
/////////////////////////////////////////////////////////////////////////////
// Property Page Dialog Class
#ifdef _AFXDLL
class COlePropertyPage : public CDialog #else
class AFX_NOVTABLE COlePropertyPage : public CDialog #endif
{ 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, short &Value); BOOL GetPropText(LPCTSTR pszPropName, short* 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
CDWordArray 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
protected: 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() };
#if _MFC_VER >= 0x0600
/////////////////////////////////////////////////////////////////////////////
// CStockPropPage
#ifdef _AFXDLL
class CStockPropPage : public COlePropertyPage #else
class AFX_NOVTABLE CStockPropPage : public COlePropertyPage #endif
{ DECLARE_DYNAMIC(CStockPropPage)
// Constructor
public: CStockPropPage(UINT idDlg, UINT idCaption);
// Implementation
protected: void FillPropnameList(REFGUID guid, int nIndirect, CComboBox& combo); void OnSelchangePropname(CComboBox& combo); BOOL OnEditProperty(DISPID dispid, CComboBox& combo);
LCID m_lcid; CString m_strPropName; int m_iPropName;
DECLARE_MESSAGE_MAP() };
///////////////////////////////////////////////////////////////////////////////
// CColorButton: used by CColorPropPage
class CColorButton : public CButton { public: CColorButton(void); void SetFaceColor(COLORREF colFace); COLORREF colGetFaceColor(void); void SetState(BOOL fSelected); static UINT idClicked; protected: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); private: BOOL m_fSelected; COLORREF m_colFace; };
/////////////////////////////////////////////////////////////////////////////
// CColorPropPage
class CColorPropPage : public CStockPropPage { DECLARE_DYNCREATE(CColorPropPage) #ifdef _AFXDLL
DECLARE_OLECREATE_EX(CColorPropPage) #endif
// Construction
public: CColorPropPage(); // Constructor
// Dialog Data
//{{AFX_DATA(CColorPropPage)
enum { IDD = AFX_IDD_PROPPAGE_COLOR }; CComboBox m_SysColors; CComboBox m_ColorProp; //}}AFX_DATA
// Implementation
public: enum { NBUTTONS = 16 };
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog(void); virtual BOOL OnEditProperty(DISPID dispid); virtual void OnObjectsChanged(); void FillSysColors(); BOOL SetColorProp(CDataExchange* pDX, COLORREF color, LPCTSTR pszPropName); BOOL GetColorProp(CDataExchange* pDX, COLORREF* pcolor, LPCTSTR pszPropName);
private: CColorButton m_Buttons[NBUTTONS]; CColorButton *m_pSelectedButton;
void SetButton(CColorButton *Button);
// Generated message map functions
//{{AFX_MSG(CColorPropPage)
afx_msg void OnSelchangeColorprop(); afx_msg void OnSelect(void); afx_msg void OnSelchangeSystemcolors(); //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
// Stores all the information about a font
typedef struct tagFONTOBJECT { CString strName; CY cySize; BOOL bBold; BOOL bItalic; BOOL bUnderline; BOOL bStrikethrough; short sWeight; } FONTOBJECT;
// Merge objects are used when trying to consolidate multiple font properties.
// If the characteristics of these multiple properties differ then this is
// represented in the merge object.
typedef struct tagMERGEOBJECT { BOOL bNameOK; BOOL bSizeOK; BOOL bStyleOK; BOOL bUnderlineOK; BOOL bStrikethroughOK; } MERGEOBJECT;
/////////////////////////////////////////////////////////////////////////////
// CSizeComboBox window
class CSizeComboBox : public CComboBox { // Operations
public: int AddSize(int PointSize, LONG lfHeight);
void GetPointSize(CY& cy); LONG GetHeight(int sel=-1); void UpdateLogFont( LPLOGFONT lpLF, int sel=-1 ); };
/////////////////////////////////////////////////////////////////////////////
// CFontComboBox window
struct FONTITEM_PPG { DWORD dwFontType; LOGFONT lf; };
class CFontComboBox : public CComboBox { // Construction
public: CFontComboBox(); virtual ~CFontComboBox();
// Operations
public: int AddFont(LOGFONT *, DWORD); CString GetCurrentName();
FONTITEM_PPG* GetFontItem(int sel=-1); LPLOGFONT GetLogFont(int sel=-1); DWORD GetFontType(int sel=-1);
// Implementation
public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); virtual void DeleteItem(LPDELETEITEMSTRUCT lpDIS);
protected: CBitmap m_bmpTrueType; CBitmap m_bmpMask; };
///////////////////////////////////////////////////////////////////////////
// CFontPropPage class
class CFontPropPage : public CStockPropPage { DECLARE_DYNCREATE(CFontPropPage) #ifdef _AFXDLL
DECLARE_OLECREATE_EX(CFontPropPage) #endif
public: CFontPropPage();
// Dialog Data
//{{AFX_DATA(CFontPropPage)
enum { IDD = AFX_IDD_PROPPAGE_FONT }; CComboBox m_FontProp; CStatic m_SampleBox; CComboBox m_FontStyles; CSizeComboBox m_FontSizes; CFontComboBox m_FontNames; //}}AFX_DATA
// Attributes
protected: int nPixelsY; CFont SampleFont; DWORD m_nCurrentStyle; DWORD m_nActualStyle; DWORD m_nStyles; BOOL m_bStrikeOut; BOOL m_bUnderline; CString m_strFontSize;
// Implementation
protected:
void FillFacenameList(); void FillSizeList(); virtual void DoDataExchange(CDataExchange* pDX); virtual void OnPaint(); virtual BOOL OnEditProperty(DISPID dispid); virtual void OnObjectsChanged(); void UpdateSampleFont(); void SelectFontFromList(CString strFaceName, MERGEOBJECT* pmobj);
//{{AFX_MSG(CFontPropPage)
virtual BOOL OnInitDialog(); afx_msg void OnEditupdateFontnames(); afx_msg void OnEditupdateFontsizes(); afx_msg void OnSelchangeFontnames(); afx_msg void OnSelchangeFontsizes(); afx_msg void OnSelchangeFontstyles(); afx_msg void OnEditchangeFontstyles(); afx_msg void OnStrikeout(); afx_msg void OnUnderline(); afx_msg void OnSelchangeFontprop(); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
static int CALLBACK EnumFontFamiliesCallBack(ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int FontType, LPARAM lParam); static int CALLBACK EnumFontFamiliesCallBack2(ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int FontType, LPARAM lParam);
BOOL SetFontProps(CDataExchange* pDX, FONTOBJECT fobj, LPCTSTR pszPropName); BOOL GetFontProps(CDataExchange* pDX, FONTOBJECT* pfobj, LPCTSTR pszPropName, MERGEOBJECT* pmobj); };
////////////////////////////////////////////////////////////////////////////
// CPicturePropPage
class CPicturePropPage : public CStockPropPage { DECLARE_DYNCREATE(CPicturePropPage) #ifdef _AFXDLL
DECLARE_OLECREATE_EX(CPicturePropPage) #endif
// Construction
public: CPicturePropPage(); // standard constructor
~CPicturePropPage();
// Dialog Data
//{{AFX_DATA(CPicturePropPage)
enum { IDD = AFX_IDD_PROPPAGE_PICTURE }; CComboBox m_PropName; CStatic m_Static; //}}AFX_DATA
// Implementation
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog(void); virtual BOOL OnEditProperty(DISPID dispid); virtual void OnObjectsChanged();
BOOL SetPictureProp(CDataExchange* pDX, LPPICTUREDISP pPictDisp, LPCTSTR pszPropName); BOOL GetPictureProp(CDataExchange* pDX, LPPICTUREDISP* ppPictDisp, LPCTSTR pszPropName); void ChangePicture(LPPICTURE pPict);
LPPICTUREDISP m_pPictDisp;
// Generated message map functions
protected: //{{AFX_MSG(CPicturePropPage)
afx_msg void OnPaint(); afx_msg void OnBrowse(); afx_msg void OnClear(); afx_msg void OnSelchangePictProp(); //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
#endif // _MFC_VER >= 0x0600
/////////////////////////////////////////////////////////////////////////////
// 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, short& 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 AFX_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__
/////////////////////////////////////////////////////////////////////////////
|