149 lines
4.1 KiB
C
149 lines
4.1 KiB
C
|
// LiteControl.h : Declaration of the CLiteControl
|
||
|
|
||
|
#ifndef __LITECONTROL_H_
|
||
|
#define __LITECONTROL_H_
|
||
|
|
||
|
#include "resource.h" // main symbols
|
||
|
#include <atlctl.h>
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CLiteControl
|
||
|
class ATL_NO_VTABLE CLiteControl :
|
||
|
public CComObjectRootEx<CComSingleThreadModel>,
|
||
|
public IDispatchImpl<ILiteControl, &IID_ILiteControl, &LIBID_TaskAppLib>,
|
||
|
public CComControl<CLiteControl>,
|
||
|
public IPersistStreamInitImpl<CLiteControl>,
|
||
|
public IOleControlImpl<CLiteControl>,
|
||
|
public IOleObjectImpl<CLiteControl>,
|
||
|
public IOleInPlaceActiveObjectImpl<CLiteControl>,
|
||
|
public IViewObjectExImpl<CLiteControl>,
|
||
|
public IOleInPlaceObjectWindowlessImpl<CLiteControl>,
|
||
|
public CComCoClass<CLiteControl, &CLSID_LiteControl>
|
||
|
{
|
||
|
public:
|
||
|
CLiteControl() : m_pTaskFrame(NULL), m_clsidDestPage(GUID_NULL), m_strText(L"<empty>")
|
||
|
{
|
||
|
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<CLiteControl>)
|
||
|
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"<empty>";
|
||
|
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_
|