Приложение MFC с главным окном в виде немодального диалога

Я разрабатываю приложение MFC и экспортирую его в dll. Приложение имеет только одно окно, и я хочу, чтобы это окно было немодальным. Внутри InitInstance (), если я хочу, чтобы он был модальным, мне нужно сделать только это:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CUIWelcomeDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
    // TODO: Place code here to handle when the dialog is
    //  dismissed with OK
}
else if (nResponse == IDCANCEL)
{
    // TODO: Place code here to handle when the dialog is
    //  dismissed with Cancel
}
return false;

Он отлично работает как модальный. Это код для немодального:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CUIWelcomeDlg * dlg;
dlg=new CUIWelcomeDlg();
m_pMainWnd=dlg;
if(dlg!=NULL) {
    dlg->Create(IDD_UIWELCOME_DIALOG,NULL);
    dlg->ShowWindow(SW_SHOW);
} 
return true;

Пытался отладить. Это нормально, пока не достигнет return true; После этого диалоговое окно зависает и не отвечает. Кто-нибудь знает, как это исправить?


person user654894    schedule 28.06.2011    source источник
comment
Только из любопытства: какой смысл в немодальном диалоговом приложении? Какие сценарии делают это необходимым?   -  person MikMik    schedule 28.06.2011


Ответы (2)


Попробуйте удалить следующую строку:
m_pMainWnd = dlg;

(если здесь указатель dlg, вы должны называть его pdlg).

person FKDev    schedule 28.06.2011

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

MSG msg;

// Handle dialog messages
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
    if(!IsDialogMessage(&msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);  
    }
}
person Javier De Pedro    schedule 28.06.2011
comment
хм, вообще-то я не совсем понимаю, но разве это не бесконечный цикл? Тогда, если я сделаю это после ShowWindow (внутри InitInstance), InitInstance никогда не вернется? - person user654894; 29.06.2011
comment
И да и нет. Это бесконечный цикл, но вы обрабатываете сообщения внутри этого цикла, поэтому он обработает сообщение о закрытии окна, и приложение завершится. Я попробую ... но, конечно, решать вам. - person Javier De Pedro; 30.06.2011