退出键不关闭对话框

Posted

技术标签:

【中文标题】退出键不关闭对话框【英文标题】:Escape key not closng the Dialog 【发布时间】:2011-06-21 10:32:04 【问题描述】:

我看过很多关于如何防止转义键关闭 CDIAlog 的帖子,但在我的情况下,我想关闭对话框但它没有。

我创建了一个示例 MFC 对话框应用程序,它添加了属性表和 2 个属性页。我尝试将 pretranslatemessage、OnCancel、KillFocus 覆盖放入属性页和对话框中,但没有受到影响。 使用以下代码:

#include "proppage1.h"
#include "proppage2.h"
#include "mySheet.h"

// ......
protected:
       // proppage1,proppage2 are the class dervied from CPropertyPage
       proppage1 pg1;
       proppage2 pg2;

       // mySheet is the class dervied from CPropertySheet
       mySheet *m_sheet;

在 MFCDlg.CPP 的 CMFCDlg::OnInitDialog() 中

       m_sheet = new mySheet(L"mySheet",this,0);
       m_sheet->AddPage(&pg1);
       m_sheet->AddPage(&pg2);

       m_sheet->Create(this, WS_CHILD | WS_VISIBLE  , 0);
       m_sheet->ModifyStyleEx (0, WS_EX_CONTROLPARENT);
       m_sheet->ModifyStyle( 0, WS_TABSTOP );

我没有在属性页和对话框中触发任何事件。 如果我在属性页上放置一些控件,则会触发事件并且可以在属性页中捕获这些事件。 但是,在其他情况下,为什么不会触发 Esc 和其他事件?

请推荐?

谢谢, 尼基尔

【问题讨论】:

我认为这可能是焦点问题? CDialog 有一个属性表,上面有 2 页。他们中的一个是否会从主对话中窃取焦点并阻止这种情况发生?但我不确定这是否是焦点问题,因为我所做的一件事就是在控件具有焦点时在属性页上添加控件,事件被触发。 【参考方案1】:
 m_sheet = new mySheet(L"mySheet",this,0);
 m_sheet->AddPage(&pg1);
 m_sheet->AddPage(&pg2);

我相信pg1pg2 都是CPropertyPage 类型或派生类的对象。如果它们是 CDialog 或派生对象,它可能不起作用 - 确保消息映射正确映射到 CPropertyPage 而不是 CDialog

此外,无需为 CPropertySheet 对象调用 Create。构造函数做这件事。你在哪里打电话给DoModalShowWindow?如果您调用CPropertySheet::DoModal,则无需在堆上分配属性表。

我会简单地使用:

CPropertySheet sheet( _T("MySheet Title") );
CPropertyPage page1(ID1), page2(ID2);
sheet.AddPage(&page1);
sheet.AddPage(&page2);

sheet.DoModal();

【讨论】:

我正在使用 m_pdlgPropSheet->SetWindowPos() 来处理显示属性表。我不想使用 DoModal,因为我想将其设为无模式。我发现阻止获取事件的代码是 m_sheet->ModifyStyleEx (0, WS_EX_CONTROLPARENT) 将属性表设置为父级。如果我删除此行,ESCAPE 工作正常并关闭对话框。不知道如果我不设置为 WS_EX_CONTROLPARENT 会有什么影响。【参考方案2】:

在您的属性表中,您可以捕获 WM_KEYDOWN 消息并检查转义

BOOL CInfoPropertySheet::PreTranslateMessage(MSG* pMsg)

    switch(pMsg->message)
    
        case WM_KEYDOWN:
        
            if( pMsg->wParam == VK_ESCAPE )

【讨论】:

以上是关于退出键不关闭对话框的主要内容,如果未能解决你的问题,请参考以下文章

退出活动而不关闭对话框

Python:QMainWindow 对话框关闭后如何关闭(或退出)Python 进程

怎样使对话框关不了

Vue/Vuetify:显示/隐藏父组件的对话框。 Esc 键不起作用

android dialog怎么关闭

GTK 退出对话框?