#pragma once #include template class CDebugDialog : public CDialogImpl < T > { protected: CDebuggerUI * m_Debugger; HANDLE m_CreatedEvent; HANDLE m_DialogThread; static DWORD CreateDebuggerWindow(CDebugDialog * pThis) { pThis->DoModal(NULL); pThis->WindowCreated(); return 0; } void WindowCreated(void) { SetEvent(m_CreatedEvent); } public: CDebugDialog(CDebuggerUI * debugger) : m_Debugger(debugger), m_CreatedEvent(CreateEvent(NULL, true, false, NULL)), m_DialogThread(NULL) { } virtual ~CDebugDialog(void) { HideWindow(); CloseHandle(m_CreatedEvent); if (m_DialogThread) { CloseHandle(m_DialogThread); m_DialogThread = NULL; } } enum { Timer_SetWindowPos = 1 }; //Get Information about the window int GetHeight(void) { if (!m_hWnd) { return 0; } RECT rect; GetWindowRect(m_hWnd, &rect); return rect.bottom - rect.top; } int GetWidth(void) { if (!m_hWnd) { return 0; } RECT rect; GetWindowRect(m_hWnd, &rect); return rect.right - rect.left; } int GetX(CRect WinRect) { return (GetSystemMetrics(SM_CXSCREEN) - (WinRect.right - WinRect.left)) / 2; } int GetY(CRect WinRect) { return (GetSystemMetrics(SM_CYSCREEN) - (WinRect.bottom - WinRect.top)) / 2; } //Manipulate the state of the window void SetPos(int X, int Y) { //Move the window to this screen location ::SetWindowPos(m_hWnd, NULL, X, Y, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } void SaveWindowLoc(UISettingID SettingID_Top, UISettingID SettingID_Left) { RECT WinRect; ::GetWindowRect(m_hWnd, &WinRect); //save the location of the window if (m_hWnd) { m_SaveWnd = true; m_SaveWndTop = WinRect.top; m_SaveWndLeft = WinRect.left; } ::KillTimer(m_hWnd, Timer_SetWindowPos); ::SetTimer(m_hWnd, Timer_SetWindowPos, 1000, NULL); bool flush = false; if (m_SaveWnd) { m_SaveWnd = false; UISettingsSaveDword(SettingID_Top, m_SaveWndTop); UISettingsSaveDword(SettingID_Left, m_SaveWndLeft); flush = true; } if (flush) { CSettingTypeApplication::Flush(); } } void SetSize(int Width, int Height) { //Set window Height and Width RECT rcClient; rcClient.top = 0; rcClient.bottom = Height; rcClient.left = 0; rcClient.right = Width; ::AdjustWindowRect(&rcClient, ::GetWindowLong(m_hWnd, GWL_STYLE), true); int32_t WindowHeight = rcClient.bottom - rcClient.top; int32_t WindowWidth = rcClient.right - rcClient.left; ::SetWindowPos(m_hWnd, NULL, 0, 0, WindowWidth, WindowHeight, SWP_NOMOVE | SWP_NOZORDER); } void SaveSize(UISettingID SettingID_X, UISettingID SettingID_Y) { //Get the current window size RECT rect; GetWindowRect(m_hWnd, &rect); int32_t WindowHeight = rect.bottom - rect.top; int32_t WindowWidth = rect.right - rect.left; if (UISettingsLoadDword(SettingID_X) != WindowWidth) { UISettingsSaveDword(SettingID_X, WindowWidth); } if (UISettingsLoadDword(SettingID_Y) != WindowHeight) { UISettingsSaveDword(SettingID_Y, WindowHeight); } } void HideWindow(void) { if (m_hWnd && ::IsWindow(m_hWnd)) { ::EndDialog(m_hWnd, 0); } if (m_DialogThread) { if (WaitForSingleObject(m_DialogThread, 5000) == WAIT_TIMEOUT) { WriteTrace(TraceUserInterface, TraceError, "CDebugDialog - time out on close"); TerminateThread(m_DialogThread, 1); } CloseHandle(m_DialogThread); m_DialogThread = NULL; } } void ShowWindow(void) { if (m_hWnd == NULL) { DWORD ThreadID; ResetEvent(m_CreatedEvent); m_DialogThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CreateDebuggerWindow, (LPVOID)this, 0, &ThreadID); if (WaitForSingleObject(m_CreatedEvent, 20000) == WAIT_TIMEOUT) { WriteTrace(TraceUserInterface, TraceError, "Failed to get window create notification"); } } if (m_hWnd) { if (::IsIconic((HWND)m_hWnd)) { SendMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, NULL); } SetForegroundWindow((HWND)m_hWnd); } } private: bool m_SaveWnd; LONG m_SaveWndTop; LONG m_SaveWndLeft; };