// LiteControl.h : Declaration of the CLiteControl #ifndef __LITECONTROL_H_ #define __LITECONTROL_H_ #include "resource.h" // main symbols #include ///////////////////////////////////////////////////////////////////////////// // CLiteControl class ATL_NO_VTABLE CLiteControl : public CComObjectRootEx, public IDispatchImpl, public CComControl, public IPersistStreamInitImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public CComCoClass { public: CLiteControl() : m_pTaskFrame(NULL), m_clsidDestPage(GUID_NULL), m_strText(L"") { m_sizePreferred = m_sizeExtent; } ~CLiteControl() { ATOMICRELEASE(m_pTaskFrame); } HRESULT SetFrame(ITaskFrame* pFrame) { ATOMICRELEASE(m_pTaskFrame); m_pTaskFrame = pFrame; if (m_pTaskFrame) m_pTaskFrame->AddRef(); return S_OK; } HRESULT SetDestinationPage(REFCLSID rclsidPage) { m_clsidDestPage = rclsidPage; return S_OK; } HRESULT SetText(LPCWSTR pszText) { m_strText = pszText; return S_OK; } HRESULT SetMaxExtent(LONG cxWidth, LONG cxHeight) { if (0 == cxWidth) cxWidth = 2540; // 1 inch if (0 == cxHeight) cxHeight = 2540; // 1 inch m_sizePreferred.cx = cxWidth; m_sizePreferred.cy = cxHeight; return S_OK; } STDMETHOD(GetExtent)(DWORD /*dwDrawAspect*/, SIZEL *psizel) { if (psizel == NULL) return E_POINTER; *psizel = m_sizePreferred; return S_OK; } DECLARE_NOT_AGGREGATABLE(CLiteControl) //DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CLiteControl) COM_INTERFACE_ENTRY(ILiteControl) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IViewObjectEx) COM_INTERFACE_ENTRY(IViewObject2) COM_INTERFACE_ENTRY(IViewObject) COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY(IOleInPlaceObject) COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY(IOleControl) COM_INTERFACE_ENTRY(IOleObject) COM_INTERFACE_ENTRY(IPersistStreamInit) COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) END_COM_MAP() BEGIN_PROP_MAP(CLiteControl) PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4) PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4) // Example entries // PROP_ENTRY("Property Description", dispid, clsid) // PROP_PAGE(CLSID_StockColorPage) END_PROP_MAP() BEGIN_MSG_MAP(CLiteControl) CHAIN_MSG_MAP(CComControl) DEFAULT_REFLECTION_HANDLER() MESSAGE_HANDLER(WM_LBUTTONUP, OnButtonUP) MESSAGE_HANDLER(WM_RBUTTONUP, OnButtonUP) END_MSG_MAP() // Handler prototypes: // LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); // LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); // LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); // IViewObjectEx DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE) // ILiteControl public: HRESULT OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); LPCWSTR pszText = m_strText ? m_strText : L""; SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE); TextOutW(di.hdcDraw, (rc.left + rc.right) / 2, (rc.top + rc.bottom) / 2, pszText, lstrlen(pszText)); return S_OK; } private: ITaskFrame* m_pTaskFrame; CLSID m_clsidDestPage; CComBSTR m_strText; SIZEL m_sizePreferred; LRESULT OnButtonUP(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { if (NULL != m_pTaskFrame) m_pTaskFrame->ShowPage(m_clsidDestPage, WM_RBUTTONUP == uMsg); return 0; } }; #endif //__LITECONTROL_H_