退出键不关闭对话框
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);
我相信pg1
和pg2
都是CPropertyPage
类型或派生类的对象。如果它们是 CDialog
或派生对象,它可能不起作用 - 确保消息映射正确映射到 CPropertyPage
而不是 CDialog
此外,无需为 CPropertySheet
对象调用 Create
。构造函数做这件事。你在哪里打电话给DoModal
或ShowWindow
?如果您调用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 进程