Должно ли приложение на основе 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.
Я исправил это, когда всегда определял родителя при создании вложенных диалогов.