The Initial BullsEye Source Files

The Initial CBullsEye Class Declaration

Listing 11.5 shows the initial wizard-generated class declaration for the CBullsEye control class. We have to make a number of changes to the class before it meets all the requirements described at the beginning of the chapter. For example, we need to add a few more base classes to obtain all the required control functionality. Also, presently the control supports no properties except the stock properties I selected via the wizard dialog boxes. Plus, there is quite of bit of implementation code to write to make the control draw and behave as a bull's eye. I'll get to all that, but first let's look at the initial source code.

I've reformatted the source code slightly from the original wizard-generated source code to group related functionality and to add a few comments (see Listing 11.5).

Listing 11.5. The Initial Wizard-Generated CBullsEye Class

// CBullsEye class ATL_NO_VTABLE CBullsEye :     // COM object support     public CComObjectRootEx<CComSingleThreadModel>,     // Class object support     public CComCoClass<CBullsEye, &CLSID_BullsEye>,     // Default dual interface for control.     // Requests for properties preprocessed by     // stock property base class     public CStockPropImpl<CBullsEye, IBullsEye>,     // Error info support for default dual interface     public ISupportErrorInfo,     // Basic "lite" control implementation     public CComControl<CBullsEye>     public IOleControlImpl<CBullsEye>,     public IOleObjectImpl<CBullsEye>,     public IOleInPlaceActiveObjectImpl<CBullsEye>,     public IOleInPlaceObjectWindowlessImpl<CBullsEye>,     public IViewObjectExImpl<CBullsEye>,     // "Lite" control persistence implementation     public IPersistStreamInitImpl<CBullsEye>,     // Full control additional implementation #ifndef _WIN32_WCE     // Support for OLE Embedding     public IDataObjectImpl<CBullsEye>, #endif     public IPersistStorageImpl<CBullsEye>,     // Support for property pages     public ISpecifyPropertyPagesImpl<CBullsEye>,     // Support for fast activation     public IQuickActivateImpl<CBullsEye>,     // Connection point implementation     public IConnectionPointContainerImpl<CBullsEye>,     public CProxy_IBullsEyeEvents<CBullsEye>,     public IProvideClassInfo2Impl<&CLSID_BullsEye,         &__uuidof(_IBullsEyeEvents), &LIBID_BullsEyeControlLib>,     // Selection of IPropertyNotifySink adds additional     // connection point for property change notifications     public IPropertyNotifySinkCP<CBullsEye>, #ifdef _WIN32_WCE     // IObjectSafety is required on Windows CE for the     // control to be loaded correctly     public IObjectSafetyImpl<CBullsEye,         INTERFACESAFE_FOR_UNTRUSTED_CALLER>, #endif { public:     CBullsEye() { } DECLARE_REGISTRY_RESOURCEID(IDR_BULLSEYE) DECLARE_PROTECT_FINAL_CONSTRUCT()     HRESULT FinalConstruct() { return S_OK; }     void FinalRelease() { } DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |     OLEMISC_CANTLINKINSIDE |     OLEMISC_INSIDEOUT |     OLEMISC_ACTIVATEWHENVISIBLE |     OLEMISC_SETCLIENTSITEFIRST ) BEGIN_COM_MAP(CBullsEye)     // Default dual interface to control     COM_INTERFACE_ENTRY(IBullsEye)     COM_INTERFACE_ENTRY(IDispatch)     // Error info support for default dual interface     COM_INTERFACE_ENTRY(ISupportErrorInfo)     // Basic "lite" control implementation     COM_INTERFACE_ENTRY(IOleControl)     COM_INTERFACE_ENTRY(IOleObject)     COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)     COM_INTERFACE_ENTRY(IOleInPlaceObject)     COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)     COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)     COM_INTERFACE_ENTRY(IViewObjectEx)     COM_INTERFACE_ENTRY(IViewObject2)     COM_INTERFACE_ENTRY(IViewObject)     // "Lite" control persistence implementation     COM_INTERFACE_ENTRY(IPersistStreamInit)     COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)     // Full control additional implementation     // Support for OLE Embedding #ifndef _WIN32_WCE     COM_INTERFACE_ENTRY(IDataObject) #endif     COM_INTERFACE_ENTRY(IPersistStorage)     // Support for property pages     COM_INTERFACE_ENTRY(ISpecifyPropertyPages)     // Support for fast activation     COM_INTERFACE_ENTRY(IQuickActivate)     // Support for connection points     COM_INTERFACE_ENTRY(IConnectionPointContainer)     COM_INTERFACE_ENTRY(IProvideClassInfo)     COM_INTERFACE_ENTRY(IProvideClassInfo2) #ifdef _WIN32_WCE     // IObjectSafety is required on Windows CE for the     // control to be loaded correctly     COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety) #endif END_COM_MAP() // Initially, the control's stock properties are the only // properties supported via persistence and property pages. BEGIN_PROP_MAP(CBullsEye)     PROP_DATA_ENTRY("_cx",, VT_UI4)     PROP_DATA_ENTRY("_cy",, VT_UI4) #ifndef _WIN32_WCE     PROP_ENTRY("BackColor", DISPID_BACKCOLOR,         CLSID_StockColorPage) #endif     PROP_ENTRY("BackStyle", DISPID_BACKSTYLE, CLSID_NULL)     PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL) #ifndef _WIN32_WCE     PROP_ENTRY("ForeColor", DISPID_FORECOLOR,         CLSID_StockColorPage) #endif END_PROP_MAP() BEGIN_CONNECTION_POINT_MAP(CBullsEye)     // Property change notifications     CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)     // Our default connection point     CONNECTION_POINT_ENTRY(__uuidof(_IBullsEyeEvents)) END_CONNECTION_POINT_MAP() // Initially the control passes all Windows messages // to the base class BEGIN_MSG_MAP(CBullsEye)     CHAIN_MSG_MAP(CComControl<CBullsEye>)     DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() // ISupportsErrorInfo     STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid) {         // Implementation deleted for clarity...     }     // IViewObjectEx     DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND |         VIEWSTATUS_OPAQUE) // IBullsEye public:     HRESULT OnDraw(ATL_DRAWINFO& di) {         // Sample drawing code omitted for clarity     }     // Storage for values of stock properties     OLE_COLOR m_clrBackColor;     LONG m_nBackStyle;     BOOL m_bEnabled;     OLE_COLOR m_clrForeColor;     // Stock property change notification functions     void OnBackColorChanged() {         ATLTRACE(_T("OnBackColorChanged\n"));     }     void OnBackStyleChanged() {         ATLTRACE(_T("OnBackStyleChanged\n"));     }     void OnEnabledChanged() {         ATLTRACE(_T("OnEnabledChanged\n"));     }     void OnForeColorChanged() {         ATLTRACE(_T("OnForeColorChanged\n"));     } }; 

The Initial IBullsEye Interface

Listing 11.6 is the initial wizard-generated IDL description for the IBullsEye interface. The wizard generates the interface containing any stock properties you've specified. We need to add all the custom properties for the control, as well as any stock and custom methods that the control supports.

Listing 11.6. The Initial Wizard-Generated IDL for the IBullsEye Interface

[     object,     uuid(B4FBD008-B03D-4F48-9C5B-4A981EB6A515),     dual,     nonextensible,     helpstring("IBullsEye Interface"),     pointer_default(unique) ] interface IBullsEye : IDispatch{     [propput, bindable, requestedit, id(DISPID_BACKCOLOR)]     HRESULT BackColor([in]OLE_COLOR clr);     [propget, bindable, requestedit, id(DISPID_BACKCOLOR)]     HRESULT BackColor([out,retval]OLE_COLOR* pclr);     [propput, bindable, requestedit, id(DISPID_BACKSTYLE)]     HRESULT BackStyle([in]long style);     [propget, bindable, requestedit, id(DISPID_BACKSTYLE)]     HRESULT BackStyle([out,retval]long* pstyle);     [propput, bindable, requestedit, id(DISPID_FORECOLOR)]     HRESULT ForeColor([in]OLE_COLOR clr);     [propget, bindable, requestedit, id(DISPID_FORECOLOR)]     HRESULT ForeColor([out,retval]OLE_COLOR* pclr);     [propput, bindable, requestedit, id(DISPID_ENABLED)]     HRESULT Enabled([in]VARIANT_BOOL vbool);     [propget, bindable, requestedit, id(DISPID_ENABLED)]     HRESULT Enabled([out,retval]VARIANT_BOOL* pbool); }; 

The Initial _IBullsEyeEvents Dispatch Interface

The initial _IBullsEyeEvents dispatch interface is empty (see Listing 11.7). We need to add the BullsEye custom events to the dispinterface. When a control supports any of the stock events, you add them to the event interface as well.

Listing 11.7. The Initial Wizard-Generated IDL for the _IBullsEyeEvent Dispatch Interface

[  uuid(58D6D8CB-765D-4C59-A41F-BBA8C40F7A14),    helpstring("_IBullsEyeEvents Interface") ] dispinterface _IBullsEyeEvents {    properties:    methods: }; 

ATL Internals. Working with ATL 8
ATL Internals: Working with ATL 8 (2nd Edition)
ISBN: 0321159624
EAN: 2147483647
Year: 2004
Pages: 172

Similar book on Amazon © 2008-2017.
If you may any questions please contact us: