0
votes

I have seen so many posts about how to prevent the escape key from closing a CDIalog but in my case I want to close the dialog but it doesn`t.

I have created a sample MFC Dialog application thats adds property sheet and 2 property pages. I tried putting pretranslatemessage, OnCancel, KillFocus overrides into the property pages and the dialog but that doesn't get hit. Used following code:

#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;

In CMFCDlg::OnInitDialog() of MFCDlg.CPP

       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 );

I dont get any events fired in propertypages and dialog. If I place some controls on the property pages, then events are fired and can be catched in property pages. However,in other case why wouldn't the Esc and other event get fired?

Please suggest?

Thanks, Nikhil

2
I think it may be a focus issue? The CDialog has a propertysheet with 2 pages on it. Could one of them be stealing the focus from the main dialog and preventing this? But I'm not sure if it's a focus issue because one of the thing I did that just added control on property page when control has a focus the event get fired.Nikhil

2 Answers

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

I believe both pg1 and pg2 are objects of type CPropertyPage or derived class. If they are CDialog or derived objects, it may not work - ensure the message-map is correctly mapped with CPropertyPage and not CDialog

Further, there is no need to call Create for a CPropertySheet object. Constructor does the thing. Where are you calling DoModal or ShowWindow? If you are calling CPropertySheet::DoModal, there is no need to allocate property-sheet on heap.

I would have simply used:

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

sheet.DoModal();
0
votes

In your property sheet, you can capture the WM_KEYDOWN message and check for escape

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