Если приложение на основе CDialog устанавливает AfxGetApp () — & gt; 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 при создании нового субдиалога на основе CDialog.

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]