//------------------------------------------------------------------------ // // File: shell\themes\test\ctlperf\CtlPerfView.cpp // // Contents: Implementation of the CCtlPerfView class. // // Classes: CCtlPerfView // //------------------------------------------------------------------------ #include "stdafx.h" #include "resource.h" #include "CtlPerfView.h" #include "Samples.h" #include #include //** Local constants // Default log file name const TCHAR kszLogFileName[] = _T("CtlPerf.log"); // Default number of loops const UINT kcLoops = 100; // Default numbers of controls in X const UINT kcxCtrl = 10; // Default numbers of controls in Y const UINT kcyCtrl = 10; // Default name for pass 1 const TCHAR kszPass1[] = _T("Pass1"); // Default name for pass 2 const TCHAR kszPass2[] = _T("Pass2"); // Default value for NumberOnly const TCHAR kszNumberOnly[] = _T("false"); //+----------------------------------------------------------------------- // // Member: CCtlPerfView::CCtlPerfView // // Synopsis: Constructor // //------------------------------------------------------------------------ CCtlPerfView::CCtlPerfView() { m_hWndStatusBar = NULL; m_rgWnds = NULL; m_rgzClasses = NULL; m_cClasses = 0; m_cxCtrl = kcxCtrl; m_cyCtrl = kcyCtrl; m_cX = 0; m_cY = 0; m_cLoops = kcLoops; m_bTwoPasses = false; m_bBatch = false; m_bSilent = false; _tcscpy(m_szLogFileName, kszLogFileName); _tcscpy(m_szPass1, kszPass1); _tcscpy(m_szPass2, kszPass2); _tcscpy(m_szNumberOnly, kszNumberOnly); ParseIniFile(); } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::~CCtlPerfView // // Synopsis: Destructor // //------------------------------------------------------------------------ CCtlPerfView::~CCtlPerfView() { if (m_rgWnds) { free(m_rgWnds); } if (m_rgzClasses) { for(UINT i = 0; i < m_cClasses; i++) { if (m_rgzClasses[i]) { free(m_rgzClasses[i]); } } free(m_rgzClasses); } } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::SetStatusBar // // Synopsis: Receive status bar from parent // // Arguments: hWndStatusBar Status bar window handle // //------------------------------------------------------------------------ void CCtlPerfView::SetStatusBar(HWND hWndStatusBar) { m_hWndStatusBar = hWndStatusBar; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::ParseIniFile // // Synopsis: Process INI file // //------------------------------------------------------------------------ void CCtlPerfView::ParseIniFile() { FILE* flIniFile; flIniFile = ::_wfopen(_T("CtlPerf.ini"), _T("r")); if (flIniFile) { TCHAR szLine[1024]; szLine[0] = _T('\0'); #define STRIP_TRAILING_RETURN(s) \ { \ LPTSTR p = _tcschr(s, _T('\n')); \ \ if(p) \ { \ *p = _T('\0'); \ } \ } while (!feof(flIniFile)) { // Read the [Classes] section ::fgetws(szLine, _countof(szLine), flIniFile); STRIP_TRAILING_RETURN(szLine); if (!_tcsicmp(szLine, _T("[Classes]"))) { szLine[0] = _T('\0'); ::fgetws(szLine, _countof(szLine), flIniFile); STRIP_TRAILING_RETURN(szLine); // Read each class while (szLine[0] != _T('\0') && szLine[0] != _T('[')) { if (szLine[0] != _T(';')) { m_cClasses++; m_rgzClasses = (LPTSTR*) realloc(m_rgzClasses, m_cClasses * sizeof(LPTSTR)); if (m_rgzClasses) { m_rgzClasses[m_cClasses - 1] = _tcsdup(szLine); } } szLine[0] = _T('\0'); ::fgetws(szLine, _countof(szLine), flIniFile); STRIP_TRAILING_RETURN(szLine); } } // Read the Options section if (!_tcsicmp(szLine, _T("[Options]"))) { UINT n; UINT n1; UINT n2; szLine[0] = _T('\0'); ::fgetws(szLine, _countof(szLine), flIniFile); STRIP_TRAILING_RETURN(szLine); // Try each token, to time to do better while (szLine[0] != _T('\0') && szLine[0] != _T('[')) { n = 0; swscanf(szLine, _T("XControls=%d"), &n); if (n) { m_cxCtrl = n; } else { swscanf(szLine, _T("YControls=%d"), &n); if (n) { m_cyCtrl = n; } else { swscanf(szLine, _T("NumLoops=%d"), &n); if (n) { m_cLoops = n; } else { n1 = n2 = 0; swscanf(szLine, _T("Resolution=%dx%d"), &n1, &n2); if (n1 && n2) { m_cX = n1; m_cY = n2; } else { LPTSTR p = _tcschr(szLine, _T('=')); if(p && !_tcsnicmp(szLine, _T("Pass1"), _countof(_T("Pass1")) - 1)) { _tcscpy(m_szPass1, p + 1); } else if(p && !_tcsnicmp(szLine, _T("Pass2"), _countof(_T("Pass2")) - 1)) { _tcscpy(m_szPass2, p + 1); } else if(p && !_tcsnicmp(szLine, _T("LogFile"), _countof(_T("LogFile")) - 1)) { _tcscpy(m_szLogFileName, p + 1); } else if(p && !_tcsnicmp(szLine, _T("Viewer"), _countof(_T("Viewer")) - 1)) { _tcscpy(m_szViewer, p + 1); } else if(p && !_tcsnicmp(szLine, _T("NumberOnly"), _countof(_T("NumberOnly")) - 1)) { _tcscpy(m_szNumberOnly, p + 1); } } } } } szLine[0] = _T('\0'); ::fgetws(szLine, _countof(szLine), flIniFile); STRIP_TRAILING_RETURN(szLine); } } } fclose(flIniFile); } m_rgWnds = (HWND*) calloc(m_cxCtrl * m_cyCtrl, sizeof(HWND)); } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::TestControl // // Synopsis: Test a single control class // // Arguments: szClassName Name of window class to create // //------------------------------------------------------------------------ void CCtlPerfView::TestControl(LPTSTR szClassName) { UINT nWidth; UINT nHeight; DWORD dwStyle = WS_BORDER; CRect rcWindow; ClearChildren(); GetWindowRect(rcWindow); nWidth = rcWindow.Width() / (m_cxCtrl + 1); nHeight = rcWindow.Height() / (m_cyCtrl + 1); // Some controls need specials styles if (!_tcsicmp(szClassName, _T("ToolbarWindow32")) || !_tcsicmp(szClassName, _T("ReBarWindow32")) || !_tcsicmp(szClassName, _T("msctls_statusbar32"))) { dwStyle |= CCS_NOPARENTALIGN | CCS_NORESIZE; } if (!_tcsicmp(szClassName, _T("SysTreeView32"))) { dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS | TVS_CHECKBOXES; } // Some controls need an initialization routine to create data // See samples.* PFNINIT pf = NULL; // Routine to call after creation if (!_tcsicmp(szClassName, _T("SysTabControl32"))) { pf = Pickers_Init; } if (!_tcsicmp(szClassName, _T("msctls_progress32"))) { pf = Movers_Init; } if (!_tcsicmp(szClassName, _T("ListBox"))) { pf = Lists_Init; } if (!_tcsicmp(szClassName, _T("ComboBox"))) { pf = Combo_Init; } if (!_tcsicmp(szClassName, _T("ComboBoxEx32"))) { pf = ComboEx_Init; } if (!_tcsicmp(szClassName, _T("SysListView32"))) { pf = ListView_Init; } if (!_tcsicmp(szClassName, _T("SysTreeView32"))) { pf = TreeView_Init; } if (!_tcsicmp(szClassName, _T("msctls_statusbar32"))) { pf = Status_Init; } if (!_tcsicmp(szClassName, _T("SysTabControl32"))) { pf = Pickers_Init; } if (!_tcsicmp(szClassName, _T("ToolbarWindow32"))) { pf = Toolbar_Init; } if (!_tcsicmp(szClassName, _T("ReBarWindow32"))) { pf = Rebar_Init; } m_perfLog.OpenLoggingClass(szClassName); m_perfLog.StartCreate(m_cxCtrl * m_cyCtrl); // Create m_cLoops instances // They're initially visible for better perf realism, but set to non-visible while adding data (if any) for (UINT i = 0; i < m_cxCtrl; i++) { for (UINT j = 0; j < m_cyCtrl; j++) { m_rgWnds[i + m_cxCtrl * j] = ::CreateWindow(szClassName, szClassName, WS_CHILD | WS_VISIBLE | dwStyle, i * nWidth * (m_cxCtrl + 1) / m_cxCtrl, j * nHeight * (m_cyCtrl + 1) / m_cyCtrl, nWidth, nHeight, m_hWnd, NULL, _Module.GetModuleInstance(), NULL); ATLASSERT(m_rgWnds[i + m_cxCtrl * j]); if (!m_rgWnds[i + m_cxCtrl * j]) { if (!m_bBatch) { TCHAR szMessage[1024]; wsprintf(szMessage, _T("Failed to create class %s, test aborted."), szClassName); MessageBox(szMessage, _T("CtlPerf"), MB_OK | MB_ICONERROR); } return; } if(pf != NULL) { DWORD dwOldStyle = ::GetWindowLong(m_rgWnds[i + m_cxCtrl * j], GWL_STYLE); ::SetWindowLong(m_rgWnds[i + m_cxCtrl * j], GWL_STYLE, dwOldStyle & ~WS_VISIBLE); pf(m_rgWnds[i + m_cxCtrl * j]); ::SetWindowLong(m_rgWnds[i + m_cxCtrl * j], GWL_STYLE, dwOldStyle); } // Handle escape key to abort if(::GetAsyncKeyState(VK_ESCAPE)) { m_perfLog.StopLogging(); return; } } } m_perfLog.StopCreate(); m_perfLog.StartPaint(m_cLoops); for (i = 0; i < m_cLoops; i++) { RedrawWindow(NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW | RDW_ALLCHILDREN); // Handle escape key to abort if(::GetAsyncKeyState(VK_ESCAPE)) { m_perfLog.StopLogging(); return; } } m_perfLog.StopPaint(); TimeResize(); m_perfLog.CloseLoggingClass(); } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnFinalMessage // // Synopsis: Called after window destruction, do window cleanup // //------------------------------------------------------------------------ void CCtlPerfView::OnFinalMessage(HWND /*hWnd*/) { m_perfLog.StopLogging(); ClearChildren(); } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::ClearChildren // // Synopsis: Destroy all child windows // //------------------------------------------------------------------------ void CCtlPerfView::ClearChildren() { for (UINT i = 0; i < m_cxCtrl; i++) { for (UINT j = 0; j < m_cyCtrl; j++) { if (::IsWindow(m_rgWnds[i + m_cxCtrl * j])) { ::DestroyWindow(m_rgWnds[i + m_cxCtrl * j]); } m_rgWnds[i + m_cxCtrl * j] = NULL; } } } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::ResizeChildren // // Synopsis: Resize the controls inside the client area // //------------------------------------------------------------------------ void CCtlPerfView::ResizeChildren() { CRect rcWindow; GetWindowRect(rcWindow); UINT nWidth = rcWindow.Width() / (m_cxCtrl + 1); UINT nHeight = rcWindow.Height() / (m_cyCtrl + 1); for (UINT i = 0; i < m_cxCtrl; i++) { for (UINT j = 0; j < m_cyCtrl; j++) { if (!::IsWindow(m_rgWnds[i + m_cxCtrl * j])) { continue; } ::SetWindowPos(m_rgWnds[i + m_cxCtrl * j], NULL, i * nWidth * (m_cxCtrl + 1) / m_cxCtrl, j * nHeight * (m_cyCtrl + 1) / m_cyCtrl, nWidth, nHeight, SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE); } } } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::TimeResize // // Synopsis: Does the whole resizing timing // //------------------------------------------------------------------------ void CCtlPerfView::TimeResize() { m_perfLog.StartResize(m_cLoops); CRect rcWindow; CWindow wnd(GetTopLevelParent()); wnd.GetWindowRect(rcWindow); UINT nWidth = rcWindow.Width(); UINT nHeight = rcWindow.Height(); MSG msg; // First resize without repainting for (UINT i = 0; i < m_cLoops; i++) { nWidth -= 4; nHeight -= 3; wnd.SetWindowPos(NULL, 0, 0, nWidth, nHeight, SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); // Leave the message loop breathe a little (else it locks) while (!::PeekMessage(&msg, wnd, NULL, NULL, PM_NOREMOVE)); // Handle escape key to abort if(::GetAsyncKeyState(VK_ESCAPE)) { m_perfLog.StopLogging(); return; } } m_perfLog.StopResize(); // Repaint once (not timed) wnd.SetWindowPos(NULL, 0, 0, rcWindow.Width(), rcWindow.Height(), SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); m_perfLog.StartResizeAndPaint(m_cLoops); nWidth = rcWindow.Width(); nHeight = rcWindow.Height(); for (i = 0; i < m_cLoops; i++) { nWidth -= 4; nHeight -= 3; wnd.SetWindowPos(NULL, 0, 0, nWidth, nHeight, SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); // This time we update each time UpdateWindow(); // Leave the message loop breathe a little while (!::PeekMessage(&msg, wnd, NULL, NULL, PM_NOREMOVE)); // Handle escape key to abort if(::GetAsyncKeyState(VK_ESCAPE)) { m_perfLog.StopLogging(); return; } } m_perfLog.StopResizeAndPaint(); // Repaint once wnd.SetWindowPos(NULL, 0, 0, rcWindow.Width(), rcWindow.Height(), SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnCreate // // Synopsis: WM_CREATE handler // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { // Create a menu with all the classes if (m_cClasses > 0) { CMenu menu(::GetMenu(GetParent())); if(menu != NULL) { CMenuItemInfo mii; mii.fMask = MIIM_SUBMENU; menu.GetSubMenu(0).GetMenuItemInfo(2, TRUE, &mii); // Hard-coded position!! for (UINT i = 0; i < m_cClasses; i++) ::AppendMenu(mii.hSubMenu, MF_STRING, IDM_CONTROL + i, m_rgzClasses[i]); } } bHandled = FALSE; return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnSize // // Synopsis: WM_SIZE handler // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { bHandled = FALSE; ResizeChildren(); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnGetMinMaxInfo // // Synopsis: WM_GETMINMAXINFO handler, forwarded by the parent // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) { if(m_cX == 0 || m_cY == 0) { bHandled = FALSE; return 1; } LPMINMAXINFO pMMI = (LPMINMAXINFO) lParam; if(pMMI) { pMMI->ptMaxSize = CPoint(m_cX, m_cY); } return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnControl // // Synopsis: IDM_CONTROL handler // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnControl(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled) { if (wID < IDM_CONTROL || wID > IDM_CONTROL + 99) { bHandled = 0; return 0; } LPTSTR pszClassName = m_rgzClasses[wID - IDM_CONTROL]; // Time a single control class m_perfLog.StartLoggingOnePass(m_szLogFileName, m_hWndStatusBar, m_szPass1); TestControl(pszClassName); m_perfLog.CloseLoggingClass(); m_perfLog.StopLogging(); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnFrame // // Synopsis: IDM_FRAME handler // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnFrame(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { ClearChildren(); m_perfLog.StartLoggingOnePass(m_szLogFileName, m_hWndStatusBar, m_szPass1); // Time the frame window m_perfLog.OpenLoggingClass(kszFrameWnd); m_perfLog.StartPaint(m_cLoops); for (UINT i = 0; i < m_cLoops; i++) RedrawWindow(NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW | RDW_ALLCHILDREN); m_perfLog.StopPaint(); TimeResize(); m_perfLog.CloseLoggingClass(); m_perfLog.StopLogging(); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::RunSuite // // Synopsis: Call TestControl() for every control class // //------------------------------------------------------------------------ void CCtlPerfView::RunSuite() { // determine output type and set value in perflog m_perfLog.SetOutputType(m_szNumberOnly); // First do the frame m_perfLog.OpenLoggingClass(kszFrameWnd); m_perfLog.StartPaint(m_cLoops); for (UINT i = 0; i < m_cLoops; i++) RedrawWindow(NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW | RDW_ALLCHILDREN); m_perfLog.StopPaint(); TimeResize(); m_perfLog.CloseLoggingClass(); // Then each control for (i = 0; i < m_cClasses; i++) { if (m_rgzClasses[i]) { TestControl(m_rgzClasses[i]); // Handle escape key to abort if(::GetAsyncKeyState(VK_ESCAPE)) { m_perfLog.StopLogging(); break; } } } } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnSuite1 // // Synopsis: IDM_SUITE1 handler: create and run one pass // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnSuite1(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { m_bTwoPasses = false; if (!m_bBatch) { COptionsDialog dlg(this); INT_PTR nRes = dlg.DoModal(); if (nRes == IDCANCEL) return 0; // Reset the WS_MAXIMIZE style to set the parent to the new size, via WM_GETMINMAXINFO ::SetWindowLong(GetParent(), GWL_STYLE, ::GetWindowLong(GetParent(), GWL_STYLE) & ~WS_MAXIMIZE); ::ShowWindow(GetParent(), SW_MAXIMIZE); } m_perfLog.StartLoggingOnePass(m_szLogFileName, m_hWndStatusBar, m_szPass1); RunSuite(); m_perfLog.StopLogging(); // Run the viewer app with the results TCHAR szCurDir[_MAX_PATH + 1]; ::GetCurrentDirectory(_countof(szCurDir), szCurDir); ::ShellExecute(GetDesktopWindow(), NULL, m_szViewer, m_szLogFileName, szCurDir, SW_SHOWMAXIMIZED); ClearChildren(); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnSuite2 // // Synopsis: IDM_SUITE2 handler: create and run two passes // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnSuite2(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { m_bTwoPasses = true; if (!m_bBatch) { COptionsDialog dlg(this); INT_PTR nRes = dlg.DoModal(); if (nRes == IDCANCEL) return 0; // Reset the WS_MAXIMIZE style to set the parent to the new size, via WM_GETMINMAXINFO ::SetWindowLong(GetParent(), GWL_STYLE, ::GetWindowLong(GetParent(), GWL_STYLE) & ~WS_MAXIMIZE); ::ShowWindow(GetParent(), SW_MAXIMIZE); } m_perfLog.StartLoggingTwoPasses(m_szLogFileName, m_hWndStatusBar, m_szPass1, m_szPass2); RunSuite(); m_perfLog.StopLoggingPass1(); ClearChildren(); if (m_bSilent || (IDOK == ::MessageBox(GetParent(), _T("Ready to run pass 2, press OK after changing Theme settings."), _T("CtlPerf"), MB_OKCANCEL))) { m_perfLog.StartLoggingPass2(); RunSuite(); m_perfLog.StopLoggingPass2(); if (m_bSilent) { ::PostMessage(GetParent(), WM_CLOSE, 0, 0); } } m_perfLog.StopLogging(); // Run the viewer app with the results TCHAR szCurDir[_MAX_PATH + 1]; ::GetCurrentDirectory(_countof(szCurDir), szCurDir); ::ShellExecute(GetDesktopWindow(), NULL, m_szViewer, m_szLogFileName, szCurDir, SW_SHOWMAXIMIZED); ClearChildren(); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnBatch1 // // Synopsis: IDM_BATCH1 handler: create and run one pass in non-interactive mode // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnBatch1(WORD /*wNotifyCode*/, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/) { m_bBatch = true; // Override the log file name if((LPTSTR) hWndCtl) _tcscpy(m_szLogFileName, (LPTSTR) hWndCtl); // Simulate a menu selection, but with m_bBatch to true, and exit PostMessage(WM_COMMAND, IDM_SUITE1, 0); ::PostMessage(GetParent(), WM_CLOSE, 0, 0); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnBatch2 // // Synopsis: IDM_BATCH2 handler: create and run two passes in non-interactive mode // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnBatch2(WORD /*wNotifyCode*/, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/) { m_bBatch = true; m_bSilent = false; // Override the log file name if((LPTSTR) hWndCtl) _tcscpy(m_szLogFileName, (LPTSTR) hWndCtl); PostMessage(WM_COMMAND, IDM_SUITE2, 0); // We'll let the pause message box post the WM_CLOSE return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::OnBatch3 // // Synopsis: IDM_BATCH3 handler: create and run two passes in non-interactive mode, // without pause // //------------------------------------------------------------------------ LRESULT CCtlPerfView::OnBatch3(WORD /*wNotifyCode*/, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/) { m_bBatch = true; m_bSilent = true; // Override the log file name if((LPTSTR) hWndCtl) _tcscpy(m_szLogFileName, (LPTSTR) hWndCtl); PostMessage(WM_COMMAND, IDM_SUITE2, 0); ::PostMessage(GetParent(), WM_CLOSE, 0, 0); return 0; } //////////////////////////////////////////////////////////////////////////// // CCtlPerfView::COptionsDialog //+----------------------------------------------------------------------- // // Member: CCtlPerfView::COptionsDialog::COptionsDialog // // Synopsis: Constructor // //------------------------------------------------------------------------ CCtlPerfView::COptionsDialog::COptionsDialog(CCtlPerfView *pView) { m_pView = pView; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::COptionsDialog::OnInitDialog // // Synopsis: Pre-dialog // //------------------------------------------------------------------------ LRESULT CCtlPerfView::COptionsDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { DoDataExchange(); // Call the base class to center thisClass::OnInitDialog(uMsg, wParam, lParam, bHandled); if(!m_pView->m_bTwoPasses) ::EnableWindow(GetDlgItem(IDC_EDIT_PASS2), FALSE); else ::EnableWindow(GetDlgItem(IDC_EDIT_PASS2), TRUE); ::SetFocus(GetDlgItem(IDC_EDIT_PASS1)); return 0; } //+----------------------------------------------------------------------- // // Member: CCtlPerfView::COptionsDialog::OnInitDialog // // Synopsis: Post-dialog // //------------------------------------------------------------------------ LRESULT CCtlPerfView::COptionsDialog::OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled) { if(wID == IDOK) DoDataExchange(DDX_SAVE); bHandled = FALSE; return 0; }