РЕДАКТИРОВАТЬ:
Сначала мне нужно исследовать некоторые странные вещи, есть ли способ поставить вопрос «на удержание»?
Оригинал:
Я работаю над существующей кодовой базой, используя графический интерфейс на основе 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, ошибка не возникает.
MFC зависит от m_pMainWnd во многих случаях. Оставить NULL не очень хороший подход, и это не решит вашу проблему.
Основная проблема швов должна быть более тонкой. Вопрос в том, почему AfxMessageBox находит основной диалог как последний активный, а не ваш вспомогательный диалог. И это может быть проблемой только в том случае, если вы не определяете pParent при создании нового субдиалога на основе CDialog.
Попытайтесь передать диалог, который в данный момент активен, вспомогательному диалогу, который вы вызываете. CDialog найти родителя «автоматически». Но иногда это не работает для меня.
У меня была та же проблема, что диалоговое окно wrond было снова включено после окна сообщения или DoModal.
Я исправил это, когда всегда определял родителя при создании под-диалогов.
Других решений пока нет …