要前言我们有一个奇怪的规定,所有的对话必须为MFC应用程序是无模式。有一个特殊的对话框使用区域绘图和一些自定义控件来选择日期和时间来查看每个视图的过去和未来数据。我需要能够关闭该窗口,当它失去焦点,主要的应用程序获得系统命令等FindWindow按类名称不起作用?
我想这样做,这将是注册类,像这样的最简单的方法:
// 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
。它将在大多数情况下适用于大多数情况。我可能会遇到麻烦,最大限度地减少和最大化对话框的主框架窗口,这些对话框都没有任何指针,但我们会看到。
他_is_使用窗口类的名称。 –
我正在使用我的课程名称注册窗口课程。我可能可以使它更独特,但认为这将起作用。 – AJG85
我明白了 - 对不起 - 令人困惑。 – Simon