Должно ли приложение на основе CDialog установить AfxGetApp()->m_pMainWnd

РЕДАКТИРОВАТЬ:

Сначала мне нужно исследовать некоторые странные вещи, есть ли способ поставить вопрос "на удержание"?

Оригинал:

Я работаю над существующей кодовой базой, используя графический интерфейс на основе CDialog. Приложение состоит из CDialog "MainWindow", который порождает другие CDialog "SubWindow" с использованием CDialog.DoModal. Это работает, когда отображается SubWindow, блоки MainWindow и т. Д.

Когда мы вызываем AfxMessageBox из "SubWindow", MainWindow снова включается и фокусируется.

Отладка в AfxMessagebox показывает, что функция получает mainWindow и включает его снова. Это вызывает много разных ошибок. Использование::MesageBox работает корректно, но у нас есть около 50 различных суб-окон, и, если возможно, я бы хотел сделать только небольшие локализованные изменения.

C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ atlmfc \ src \ mfc \ appui1.cpp

int CWinApp::ShowAppMessageBox(CWinApp *pApp, LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
...
HWND hWndTop;
HWND hWnd = CWnd::GetSafeOwner_(NULL, &hWndTop);

// re-enable the parent window, so that focus is restored 
// correctly when the dialog is dismissed.
if (hWnd != hWndTop)
    EnableWindow(hWnd, TRUE);
...

В нашей точке входа мы делаем что-то вроде этого:

::AfxGetApp()->m_pMainWnd = &mainDlg;
mainDlg.DoModal();

Какой предпочтительный способ? Должен ли я прокомментировать строку, чтобы участник остался NULL?

или это может вызвать какие-либо побочные эффекты?

Я думаю (еще не проверено) я мог бы также установить

AfxGetApp()->m_pMainWnd = &subDlg;

до subDlg.DoModal() и затем сбросьте его, но это также будет означать изменение 50 различных файлов, по одному на каждое подокно.

Зависит ли MFC от m_pMainWnd, или я должен просто оставить его равным NULL? Благодарю.

РЕДАКТИРОВАТЬ:

Я попытался передать MainWindow в конструктор SubWindow, но безрезультатно.

Это где MainWindow включается:

Здесь MFC находит MainWindow:Мне нужно вручную установить m_pActiveWnd?

(OFF Topic: Мне нравится, что есть доступный исходный код для mfc.)

РЕДАКТИРОВАТЬ 2:

Приложение MFC на самом деле является библиотекой DLL, которая может быть вызвана двумя способами: либо загружена простым loader.exe, либо любым другим крупным приложением. Это другое приложение также может использовать MFC, поэтому может быть два разных объекта CWinApp.

Если он загружен loader.exe, ошибка не возникает.

1 ответ

MFC зависит от m_pMainWnd во многих случаях. Оставить NULL - не очень хороший подход, и это не решит вашу проблему.

Основная проблема швов должна быть более тонкой. Вопрос в том, почему AfxMessageBox находит основной диалог как последний активный, а не ваш вспомогательный диалог. И это может быть проблемой только в том случае, если вы не определяете pParent при создании нового condialog на основе con CDialog.

Попытайтесь передать диалог, который в данный момент активен, вспомогательному диалогу, который вы вызываете. CDialog найти родителя "автоматически". Но иногда это не работает для меня. У меня была та же проблема, что диалоговое окно wrond было снова включено после окна сообщения или DoModal.

Я исправил это, когда всегда определял родителя при создании вложенных диалогов.

Другие вопросы по тегам