/*++ Copyright (c) 1999-2000 Microsoft Corporation Module Name: RemoteDesktopClientHost Abstract: Author: Tad Brockway 02/00 Revision History: --*/ #ifndef __REMOTEDESKTOPCLIENTHOST_H_ #define __REMOTEDESKTOPCLIENTHOST_H_ #include #include "resource.h" #include #include "RemoteDesktopClient.h" /////////////////////////////////////////////////////// // // CRemoteDesktopClientHost // class ATL_NO_VTABLE CRemoteDesktopClientHost : public CRemoteDesktopTopLevelObject, public CComObjectRootEx, public IDispatchImpl, public CComControl, public IPersistStreamInitImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl, public IConnectionPointContainerImpl, public IPersistStorageImpl, public ISpecifyPropertyPagesImpl, public IQuickActivateImpl, public IDataObjectImpl, public IProvideClassInfo2Impl<&CLSID_SAFRemoteDesktopClientHost, NULL, &LIBID_RDCCLIENTHOSTLib>, public IPropertyNotifySinkCP, public CComCoClass { private: ISAFRemoteDesktopClient *m_Client; HWND m_ClientWnd; CAxWindow m_ClientAxView; BOOL m_Initialized; // // Final Initialization // HRESULT Initialize(LPCREATESTRUCT pCreateStruct); public: // // Constructor/Destructor // CRemoteDesktopClientHost() { // // We are window'd, even if our parent supports Windowless // controls. // m_bWindowOnly = TRUE; m_Client = NULL; m_ClientWnd = NULL; m_Initialized = FALSE; } ~CRemoteDesktopClientHost() { DC_BEGIN_FN("CRemoteDesktopClientHost::~CRemoteDesktopClientHost"); if (m_Client != NULL) { m_Client->Release(); } DC_END_FN(); } HRESULT FinalConstruct(); STDMETHOD(OnFrameWindowActivate)(BOOL fActivate) { DC_BEGIN_FN("CRemoteDesktopClientHost::OnFrameWindowActivate"); // // Set focus back to the client window, if it exists. // if (m_ClientWnd != NULL) { ::SetFocus(m_ClientWnd); } DC_END_FN(); return S_OK; } DECLARE_REGISTRY_RESOURCEID(IDR_REMOTEDESKTOPCLIENTHOST) DECLARE_NOT_AGGREGATABLE(CRemoteDesktopClientHost) DECLARE_PROTECT_FINAL_CONSTRUCT() // // COM Interface Map // BEGIN_COM_MAP(CRemoteDesktopClientHost) COM_INTERFACE_ENTRY(ISAFRemoteDesktopClientHost) 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) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY(ISpecifyPropertyPages) COM_INTERFACE_ENTRY(IQuickActivate) COM_INTERFACE_ENTRY(IPersistStorage) COM_INTERFACE_ENTRY(IDataObject) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) END_COM_MAP() BEGIN_PROP_MAP(CRemoteDesktopClientHost) 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() // // Connection Point Map // BEGIN_CONNECTION_POINT_MAP(CRemoteDesktopClientHost) CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink) END_CONNECTION_POINT_MAP() // // Message Map // BEGIN_MSG_MAP(CRemoteDesktopClientHost) CHAIN_MSG_MAP(CComControl) DEFAULT_REFLECTION_HANDLER() MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_SIZE, OnSize) 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) public: // // OnDraw // HRESULT OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); HRESULT hr; if (!m_Initialized) { hr = S_OK; SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE); LPCTSTR pszText = _T("Remote Desktop Client Host"); TextOut(di.hdcDraw, (rc.left + rc.right) / 2, (rc.top + rc.bottom) / 2, pszText, lstrlen(pszText)); } return hr; } // // OnCreate // LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // // We are hidden by default. // //ShowWindow(SW_HIDE); DC_BEGIN_FN("CRemoteDesktopClientHost::OnCreate"); if (!m_Initialized) { //ASSERT(FALSE); LPCREATESTRUCT pCreateStruct = (LPCREATESTRUCT)lParam; Initialize(pCreateStruct); } DC_END_FN(); return 0; } // // OnSetFocus // LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { DC_BEGIN_FN("CRemoteDesktopClientHost::OnSetFocus"); // // Set focus back to the client window, if it exists. // if (m_ClientWnd != NULL) { ::PostMessage(m_ClientWnd, uMsg, wParam, lParam); } DC_END_FN(); return 0; } // // OnSize // LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { DC_BEGIN_FN("CRemoteDesktopClientHost::OnSize"); if (m_ClientWnd != NULL) { RECT rect; GetClientRect(&rect); ASSERT(rect.left == 0); ASSERT(rect.top == 0); ASSERT(rect.bottom == HIWORD(lParam)); ASSERT(rect.right == LOWORD(lParam)); ::MoveWindow(m_ClientWnd, rect.left, rect.top, rect.right, rect.bottom, TRUE); } DC_END_FN(); return 0; } // // ISAFRemoteDesktopClientHost Methods // STDMETHOD(GetRemoteDesktopClient)(ISAFRemoteDesktopClient **client); // // Return the name of this class. // virtual const LPTSTR ClassName() { return TEXT("CRemoteDesktopClientHost"); } }; #endif //__REMOTEDESKTOPCLIENTHOST_H_