|
|
//
// contwnd.h: TS client Shell Container window
// hosts TS ActiveX control
// Copyright Microsoft Corporation 1999-2000
//
#ifndef _CONTWND_H_
#define _CONTWND_H_
#include "sh.h"
#include "evsink.h" //Event sink
#include "connectingdlg.h"
#include "auierr.h"
#include "axhostwnd.h"
#include "framewnd.h"
#include "shlobj.h"
#define MAIN_CLASS_NAME TEXT("TSSHELLWND")
typedef enum logonDlgState { dlgUnexpanded = 0, dlgTabGeneral = 1, dlgTabLocalResources= 2 } LOGONDLGSTATE; typedef struct tagLOGONDLGSTARTUPINFO { LOGONDLGSTATE state; int xPos; int yPos; } LOGONDLGSTARTUPINFO, *PLOGONDLGSTARTUPINFO;
class CMainDlg;
class CRGN { public: CRGN (void) { mRgn = CreateRectRgn(0, 0, 0, 0);} CRGN (const RECT& rc) { mRgn = CreateRectRgnIndirect(&rc);} ~CRGN (void) { DeleteObject(mRgn);}
operator HRGN (void) const { return(mRgn);} void SetRegion (const RECT& rc) { SetRectRgn(mRgn, rc.left, rc.top, rc.right, rc.bottom);} private: HRGN mRgn; };
#define SET_CONTWND_STATE(x) \
TRC_NRM((TB,_T("Set contwnd state from %d to %d"), _state, x)); \ _state = x; \
class CContainerWnd : public CTscFrameWnd { public: CContainerWnd(); ~CContainerWnd();
//
// API Methods
//
DCBOOL Init(HINSTANCE hInstance, CTscSettings* pTscSet, CSH* pSh); BOOL StartConnection(); DCBOOL Disconnect(); DCBOOL FinishDisconnect(BOOL fExit = FALSE);
//
// Window proc
//
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam);
//
// Property accessers
//
DCVOID SetConnectDialogHandle(HWND hwnd) { _hwndMainDialog = hwnd; }
HWND GetConnectDialogHandle() { return _hwndMainDialog; } DCVOID SetStatusDialogHandle(HWND hwnd) { _hwndStatusDialog = hwnd; } BOOL GetHaveConnected() {return _fHaveConnected;} HWND GetWndHandle() {return _hWnd;}
VOID ResetConnectionSuccessFlag() {_fConnectionSuccess = FALSE;} VOID SetConnectionSuccessFlag() {_fConnectionSuccess = TRUE;} BOOL GetConnectionSuccessFlag() {return _fConnectionSuccess;} BOOL IsConnected();
//
// Message handlers
//
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnDestroy(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnMove(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnInitMenu(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnNCDestroy(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnHelp(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnPaletteChange(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnExitMenuLoop(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnEnterSizeMove(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnExitSizeMove(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam);
VOID ExitAndQuit();
//
// Event notification handlers (called by _eventSink)
//
LONG EnterEventHandler(); LONG LeaveEventHandler();
VOID OnConnected(); VOID OnLoginComplete(); VOID OnDisconnected(DCUINT discReason); VOID OnEnterFullScreen(); VOID OnLeaveFullScreen(); VOID OnFatalError(LONG errorCode); VOID OnWarning(LONG WarnCode); VOID OnRemoteDesktopSizeNotify(long width, long height); VOID OnRequestMinimize(); HRESULT OnConfirmClose(BOOL* pfConfirmClose); BOOL _fPreventClose; BOOL _fBeenThroughDestroy; BOOL _fBeenThroughNCDestroy; DCINT _PostedQuit; private:
HRESULT CreateTsControl(); BOOL SetupSystemMenu(); void SetMinMaxPlacement(WINDOWPLACEMENT& windowPlacement); void RecalcMaxWindowSize(DCVOID); DCSIZE GetMaximizedWindowSize(DCSIZE& maximizedSize); LPTSTR GetFatalString(DCINT errorID); void DisplayFatalError(PDCTCHAR errorString, DCINT error); BOOL InControlEventHandler(); BOOL StartConnectDialog(BOOL fStartExpanded = FALSE, INT nStartTabIndex = 0); void CalcTrackingMaxWindowSize(UINT cliWidth, UINT cliHeight, UINT* pMaxX, UINT* pMaxY);
ULONG GetCurrentDesktopWidth() {return _curDesktopWidth;} ULONG GetCurrentDesktopHeight() {return _curDesktopHeight;} void SetCurrentDesktopWidth(LONG w) {_curDesktopWidth = w;} void SetCurrentDesktopHeight(LONG h) {_curDesktopHeight = h;}
BOOL IsUsingDialogUI(); BOOL IsRemoteResMatchMonitorSize(); #ifndef OS_WINCE
void EnsureWindowIsCompletelyOnScreen(RECT *prc); #endif
BOOL IsOkToToggleFocus();
private: HMENU _hSystemMenu; HMENU _hHelpMenu;
// The activeX view window (child of the container)
#ifdef USE_ATL_CONTAINER
CAxWindow* _pWndView; #else
CAxHostWnd* _pWndView; #endif
CSH* _pSh; HINSTANCE _hInst; DCBOOL _bContainerIsFullScreen; #ifdef DC_DEBUG
HMENU _hDebugMenu; #endif
// ActiveX control instance pointer
IMsRdpClient* _pTsClient; HWND _hwndMainDialog; HWND _hwndStatusDialog;
DCSIZE _maxMainWindowSize;
//
// Current desktop width and height
// these can change in response to an
// event from the control (e.g on shadow)
//
ULONG _curDesktopWidth, _curDesktopHeight;
//Active tab on the connect dialog
//used to return to that tab when the dialog
//is relaunched.
DCBOOL _fFirstTimeToLogonDlg; LOGONDLGSTARTUPINFO _logonDlgStartupInfo;
//
// Flag signals that the login phase has completed for this
// connection
//
DCBOOL _fLoginComplete; DCTCHAR _errorString[UI_ERR_MAX_STRLEN];
//
// Count of how many times we entered
// an event handler.
// This is used to protect entry into non-rentrant
// code paths.
//
LONG _cInEventHandlerCount; BOOL _fInOnCloseHandler;
CMainDlg* _pMainDlg; CTscSettings* _pTscSet;
BOOL _fClientWindowIsUp; TCHAR _szAppName[MAX_PATH]; BOOL _fHaveConnected; TCHAR _szPathToDefaultFile[MAX_PATH]; INT _successConnectCount; BOOL _fConnectionSuccess; BOOL _fClosePending;
#ifndef OS_WINCE
//Cached interface pointer to shell task bar
ITaskbarList2* _pTaskBarList2; //Flag indicaticating we already tried to get the TaskBarList2
//so we shouldn't bother trying again
BOOL _fQueriedForTaskBarList2; #endif
//
// Are we in the modal size/move loop
//
BOOL _fInSizeMove;
BOOL _fRunningOnWin9x;
typedef enum { stateNotInitialized = 0x0, stateNotConnected = 0x1, stateConnecting = 0x2, stateConnected = 0x3, } contWndState;
contWndState _state; };
#endif // _CONTWND_H_
|