Клавиша Escape не закрывает диалог - PullRequest
0 голосов
/ 21 июня 2011

Я видел так много постов о том, как запретить escape-ключ закрывать 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;

В CMFCDlg :: OnInitDialog () 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 );

Я не получаю никаких событий на страницах свойств и в диалоге. Если я размещу некоторые элементы управления на страницах свойств, то события запускаются и могут отслеживаться на страницах свойств. Тем не менее, в другом случае, почему не сработают Esc и другое событие?

Пожалуйста, предложите?

Спасибо, Нихилу

Ответы [ 2 ]

1 голос
/ 21 июня 2011
 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();
0 голосов
/ 21 июня 2011

В вашем листе свойств вы можете захватить сообщение WM_KEYDOWN и проверить на спасение

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