#pragma once #include template class CDebugDialog : public CDialogImpl < T > { protected: CDebuggerUI * m_Debugger; HANDLE m_CreatedEvent; HANDLE m_DialogThread; UISettingID m_UISettingID; bool m_bInitialized; static DWORD CreateDebuggerWindow(CDebugDialog * pThis) { pThis->DoModal(nullptr); pThis->WindowCreated(); return 0; } void WindowCreated(void) { SetEvent(m_CreatedEvent); } void DlgSavePos_Init(UISettingID uiSettingID) { m_UISettingID = uiSettingID; m_bInitialized = true; } void LoadWindowPos() { if (!m_bInitialized) { return; } T* pT = static_cast(this); std::string str = UISettingsLoadStringVal(m_UISettingID); int left, top, width, height; int nParams = sscanf(str.c_str(), "%d,%d,%d,%d", &left, &top, &width, &height); if (nParams == 4) { pT->SetWindowPos(nullptr, left, top, width, height, 0); pT->RedrawWindow(); } if (nParams == 2) { pT->SetWindowPos(nullptr, left, top, width, height, 1); pT->RedrawWindow(); } } void SaveWindowPos(bool bSaveSize) { if (!m_bInitialized) { return; } T* pT = static_cast(this); CRect rect; pT->GetWindowRect(&rect); if (!bSaveSize) { UISettingsSaveString(m_UISettingID, stdstr_f("%d,%d", rect.left, rect.top).c_str()); } else { UISettingsSaveString(m_UISettingID, stdstr_f("%d,%d,%d,%d", rect.left, rect.top, rect.Width(), rect.Height()).c_str()); } } public: CDebugDialog(CDebuggerUI * debugger) : m_Debugger(debugger), m_CreatedEvent(CreateEvent(nullptr, true, false, nullptr)), m_DialogThread(nullptr) { } virtual ~CDebugDialog(void) { HideWindow(); CloseHandle(m_CreatedEvent); if (m_DialogThread) { CloseHandle(m_DialogThread); m_DialogThread = nullptr; } } 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 = nullptr; } } void ShowWindow(void) { if (m_hWnd == nullptr) { DWORD ThreadID; ResetEvent(m_CreatedEvent); m_DialogThread = CreateThread(nullptr, 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; };