AfxMessageBox появляется за диалогом MFC - PullRequest
2 голосов
/ 13 февраля 2012

На главном экране моего приложения я создаю немодальное диалоговое окно, а именно:

CMyDialog dlg;
int returnval = dlg.doModal();

Теперь это первый раз, когда это происходит со мной, но в этом конкретном диалоге, если я хочу отобразитьокно сообщения при нажатии кнопки, оно всегда появляется за окном диалога.Если я нажму клавишу Alt на клавиатуре, то она получит фокус и появится вперед.

int nResult = AfxMessageBox(_T("Are you sure you want to delete this file?"), MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL);
if(nResult == IDNO){
    return;
}
else{
...
}

Мне интересно, что я сделал или какую опцию я проверил, что привело бы к такому поведению?


РЕДАКТИРОВАТЬ: Вот небольшая часть кода в моей функции OnInitDialog, я закомментировал все остальное, и то же поведение остается:

CDialog::OnInitDialog();
DEVMODE sDevMode;
ZeroMemory(&sDevMode, sizeof(DEVMODE));
sDevMode.dmSize = sizeof(DEVMODE);

EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&sDevMode);
_screenw = (int)sDevMode.dmPelsWidth;
_screenh = (int)sDevMode.dmPelsHeight;

_dlgx = (int) 50;
_dlgy = (int) 50;
_dlgw = (int) _screenw-100;
_dlgh = (int) _screenh-100;

this->MoveWindow(_dlgx,_dlgy,_dlgw,_dlgh);

Ответы [ 4 ]

5 голосов
/ 18 марта 2014

Мне удалось обойти эту же проблему, вызвав CWnd :: PostMessage (0x118) перед DoModal (), как сообщается здесь .

Кажется сбой в архитектуре MFC, поскольку диалоговое окно не отображается, если базовый цикл обработки сообщений не пуст, и единственный способ - это выдать сообщение 0x118 или нажатие клавиши ALT (WM_SYSKEYDOWN).

Так что обходной путь для этого вопроса может быть:

CMyDialog dlg;
CWnd::PostMessage(0x118);
int returnval = dlg.doModal();
1 голос
/ 13 февраля 2012

Вы можете использовать MB_APPLMODAL, чтобы получить его перед всеми окнами в вашем приложении.

Что вам нужно сделать, это создать окно сообщения как дочерний элемент вашего диалога.Для этого используйте CWnd :: MessageBox.

0 голосов
/ 04 апреля 2014

Спасибо за подсказку. Вот еще одна форма, которая работает для меня, если вы не вызываете DoModal из главного окна:

void MyApp::OnAppAbout()
{

    CAboutDlg aboutDlg;
    CWnd * pParent = GetMainWnd();
    if (pParent)
        pParent->PostMessage(WM_SYSKEYDOWN);

    aboutDlg.DoModal();
}
0 голосов
/ 13 февраля 2012

AfxMessageBox всегда будет модальным в верхнем окне в Z-порядке.Я не вижу необходимости передавать дополнительные флаги для продвижения вперед.Да, если приложение (главное окно) не находится в фокусе, вы можете явно активировать его перед вызовом AfxMessageBox.

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

...