271 lines
8.1 KiB
C++
271 lines
8.1 KiB
C++
//
|
|
// 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_
|