2011-08-26 60 views
0

要前言我们有一个奇怪的规定,所有的对话必须为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。它将在大多数情况下适用于大多数情况。我可能会遇到麻烦,最大限度地减少和最大化对话框的主框架窗口,这些对话框都没有任何指针,但我们会看到。

回答

0

下面是我能想出的最简单和干净的解决方案:

BOOL CTransactionDialog::OnNcActivate(BOOL bActive) 
{ 
    if (!bActive) 
     PostMessage(WM_CLOSE); 

    return CDialog::OnNcActivate(bActive); 
} 
1

类名NOT表示C++类名称 - 它表示窗口类名。这个名字被用来在操作系统上注册窗口,并且与C++类无关。

MSDN微启你......

+0

他_is_使用窗口类的名称。 –

+0

我正在使用我的课程名称注册窗口课程。我可能可以使它更独特,但认为这将起作用。 – AJG85

+0

我明白了 - 对不起 - 令人困惑。 – Simon

0

的CWnd :: FindWindow函数不搜索子窗口。

有没有可能是你所创建的模式不太窗口有一个父集,这就是为什么FindWindow函数没有找到它的原因是什么?

+0

窗户可以是没有'WS_CHILD'标志的子窗口吗?他的窗口课没有它。 –

+0

WS_CHILD与提供给WNDCLASS的风格正交 –

3

FindWindow不能与子窗口的工作。要找到子窗口,可以使用FindWindowEx,将父窗口的HWND作为第一个参数传递。

+0

创建对话框时的WS_POPUP样式取消了WS_CHILD。我是否也需要在类注册中指定它? – AJG85

+0

你刚刚使用'Create()'?如果是这样,那么窗口会将您的主应用程序窗口作为其父窗口。 – dlev

+0

真的吗?即使我正在使用的资源具有在创建时映射到'WS_POPUP'风格的属性中指定的Popup?我会发布我的代码片段进行创建。 – AJG85

-1

不是100%肯定这个,但我认为你需要在资源文件来设置你的类名。您正在定义一个Windows类并创建一个对话框类,但您并未链接它们。除非您真的有将其链接到对话框的方式,否则在WNDCLASS结构中设置类名将无济于事。如果你使用资源文件并定义对话框和类名,那么它应该工作。

+0

你能给我看一些代码吗? –