我看过很多关于如何防止转义键关闭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
答案 0 :(得分:1)
m_sheet = new mySheet(L"mySheet",this,0);
m_sheet->AddPage(&pg1);
m_sheet->AddPage(&pg2);
我认为pg1
和pg2
都是CPropertyPage
或派生类的对象。如果它们是CDialog
或派生对象,则可能无效 - 确保消息地图已正确映射到CPropertyPage
而非CDialog
此外,无需为Create
对象调用CPropertySheet
。构造函数做了这件事。你在哪里打电话DoModal
或ShowWindow
?如果您正在调用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 )