退出键不关闭对话框

时间:2011-06-21 10:32:04

标签: mfc dialog

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

我创建了一个示例MFC Dialog应用程序,它添加了属性表和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和其他事件不会被解雇?

请建议?

谢谢, NIKHIL

2 个答案:

答案 0 :(得分:1)

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

我认为pg1pg2都是CPropertyPage或派生类的对象。如果它们是CDialog或派生对象,则可能无效 - 确保消息地图已正确映射到CPropertyPage而非CDialog

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

我会简单地使用:

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

sheet.DoModal();

答案 1 :(得分:0)

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

BOOL CInfoPropertySheet::PreTranslateMessage(MSG* pMsg)
{
    switch(pMsg->message)
    {
        case WM_KEYDOWN:
        {
            if( pMsg->wParam == VK_ESCAPE )