【发布时间】:2011-08-26 19:31:23
【问题描述】:
作为序言,我们有一个奇怪的要求,即所有对话框对于 MFC 应用程序都必须是无模式的。有一个特定的对话框使用区域绘图和一些自定义控件来选择日期和时间,以查看每个视图的过去和未来数据。当它失去焦点、主应用程序获取系统命令等时,我需要能够关闭此窗口。
我认为最简单的方法是像这样注册类:
// for CWnd::FindWindow
WNDCLASS wndcls;
SecureZeroMemory(&wndcls, sizeof(WNDCLASS));
wndcls.lpszClassName = L"CTransactionDialog";
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = AfxWndProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = NULL;
#ifndef _WIN32_WCE_NO_CURSOR
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
#else
wndcls.hCursor = 0;
#endif
wndcls.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1);
wndcls.lpszMenuName = NULL;
BOOL retVal = AfxRegisterClass(&wndcls);
if (!retVal)
AfxMessageBox(L"AfxRegisterClass(CTransactionDialog) Failed");
然后在响应各种事件处理程序和消息时,我希望关闭这些无模式窗口或窗口以执行类似这样的简单操作:
CWnd* pFound = NULL;
while ((pFound = CWnd::FindWindow(L"CTransactionDialog", NULL)) != NULL)
pFound->DestroyWindow();
然而,尽管类注册成功并在调试中查看相关对话框的 GetRuntimeClass 并看到它与预期的匹配,FindWindow 似乎永远不会按预期找到或关闭这些无模式对话框。
我做错了什么还是有更好的方法来解决这个问题?
更新:这是通过对话框类上的静态方法创建对话框的方式。 create 中指定的 id 的对话框资源具有 Popup 属性集,该属性集应解析为 MFC 覆盖下的WS_POPUP 样式。据我所知,该对话框不应该也没有父级。
CTransactionDialog* CTransactionDialog::ShowTransactionDialog(const CRect& crCtrlToFloatAbove, UINT dialogID, Itime defaultTime, Itime initialTime)
{
CTransactionDialog* pCTDialog = new CTransactionDialog(crCtrlToFloatAbove, dialogID, defaultTime, initialTime);
pCTDialog->Create(CTransactionDialog::IDD);
pCTDialog->ShowWindow(SW_SHOW);
return pCTDialog;
}
更新: 哇! FindWindowEx 也没有找到任何东西。
CWnd::FindWindowEx(AfxGetMainWnd()->GetSafeHwnd(), NULL, L"CTransactionDialog", NULL);
但是我有一个新计划。我只是要制作自己的窗口消息并在主框架上处理它。我想我可以将指向对话框的指针作为消息的 lParam 传递,然后将其转换为 CWnd*,然后调用 DestroyWindow。它将以非常全面的方式适用于大多数情况。我可能会在最小化和最大化对话框的主框架窗口时遇到问题,但我们会看到。
【问题讨论】:
标签: c++ winapi user-interface mfc