Не удалось напечатать AfxMessagBox () после метода doModal () - PullRequest
0 голосов
/ 23 января 2012
BOOL CmsgboxApp::InitInstance()  
{
    INITCOMMONCONTROLSEX InitCtrls;  
    InitCtrls.dwSize = sizeof(InitCtrls);  
    InitCtrls.dwICC = ICC_WIN95_CLASSES;  
    InitCommonControlsEx(&InitCtrls);  
    CWinApp::InitInstance();  
    AfxEnableControlContainer();  
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));  
    CmsgboxDlg dlg;  
    m_pMainWnd = &dlg;  
    INT_PTR nResponse = dlg.DoModal();  
    if (nResponse == IDOK)  
    {  
        AfxMessageBox(L"here",0,0);//This MessageBox is not getting displayed  
    }  
    else if (nResponse == IDCANCEL)  
    {  
    }  
    return FALSE;  
}  

В приведенном выше коде AfxMessageBox() не отображается. Почему эта проблема идет?

Сначала я создал Modal DialogBox и после возвращения из него я попытался предоставить окно сообщения Но это не отображается

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Вы должны поместить сообщение в обработчик диалога OnOK (), оно точно такое же, как когда диалоговое окно возвращает IDOK.

AfxMessageBox () не отображается, потому что на данный момент у него нет окна владельца. Если вы выполните отладку в AfxMessageBox (), вы в конечном итоге попадете в функцию CWinApp :: ShowAppMessageBox (...), в которой вызывается следующее:

HWND hWnd = CWnd::GetSafeOwner_(NULL, &hWndTop);

Поскольку окно владельца теперь равно NULL, так как диалоговое окно уже существует, окно сообщения отображаться не будет.

0 голосов
/ 23 января 2012

Я не уверен, но, возможно, AfxMessageBox не предоставляет свой собственный генератор сообщений, как CDialog::DoModal().Я бы предположил, что AfxMessageBox просто вызывает функцию Win32 MessageBox(), которая потребует помпы сообщений для отправки сообщений рисования / щелчка и т. Д.

РЕДАКТИРОВАТЬ: Программы Windows работают путем передачи сообщенийвокруг.У всех программ Windows есть сообщение «насос», которое обрабатывает любые входящие сообщения для таких вещей, как рисование экрана, реагирование на щелчки мыши и т. Д. Изначально вам приходилось кодировать насос сообщений самостоятельно.

MFC пришел и предоставилнасос сообщений для вас.Один в CWinApp::Run() для обычных приложений SDI / MDI и один в CDialog::DoModal() для диалоговых приложений (и модальных диалоговых окон в целом).

Код, который вы опубликовали, представляет собой диалоговое приложение MFC.«Приложение» - это диалог.После того, как вы вернулись из этого диалогового окна, насос сообщений отсутствует, и приложение в значительной степени устарело.Вы должны делать очень мало после этого, возможно, некоторую очистку.Конечно, не отображать дополнительную информацию.

Если вы хотите отобразить дополнительную информацию о закрытии, переопределите OnClose() в диалоговом окне приложения и вызовите AfxMessageBox() там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...