Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

275 lines
7.1 KiB

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
RemoteDesktopClientHost
Abstract:
Author:
Tad Brockway 02/00
Revision History:
--*/
#ifndef __REMOTEDESKTOPCLIENTHOST_H_
#define __REMOTEDESKTOPCLIENTHOST_H_
#include <RemoteDesktopTopLevelObject.h>
#include "resource.h"
#include <atlctl.h>
#include "RemoteDesktopClient.h"
///////////////////////////////////////////////////////
//
// CRemoteDesktopClientHost
//
class ATL_NO_VTABLE CRemoteDesktopClientHost :
public CRemoteDesktopTopLevelObject,
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<ISAFRemoteDesktopClientHost, &IID_ISAFRemoteDesktopClientHost, &LIBID_RDCCLIENTHOSTLib>,
public CComControl<CRemoteDesktopClientHost>,
public IPersistStreamInitImpl<CRemoteDesktopClientHost>,
public IOleControlImpl<CRemoteDesktopClientHost>,
public IOleObjectImpl<CRemoteDesktopClientHost>,
public IOleInPlaceActiveObjectImpl<CRemoteDesktopClientHost>,
public IViewObjectExImpl<CRemoteDesktopClientHost>,
public IOleInPlaceObjectWindowlessImpl<CRemoteDesktopClientHost>,
public IConnectionPointContainerImpl<CRemoteDesktopClientHost>,
public IPersistStorageImpl<CRemoteDesktopClientHost>,
public ISpecifyPropertyPagesImpl<CRemoteDesktopClientHost>,
public IQuickActivateImpl<CRemoteDesktopClientHost>,
public IDataObjectImpl<CRemoteDesktopClientHost>,
public IProvideClassInfo2Impl<&CLSID_SAFRemoteDesktopClientHost, NULL, &LIBID_RDCCLIENTHOSTLib>,
public IPropertyNotifySinkCP<CRemoteDesktopClientHost>,
public CComCoClass<CRemoteDesktopClientHost, &CLSID_SAFRemoteDesktopClientHost>
{
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<CRemoteDesktopClientHost>)
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_