Консультация № 52784
21.08.2006, 18:19
0.00 руб.
0 2 1
Я пишу MDI приложения. В приложении будет панел инструментов на базе шаблона диалогового окна. На этой панели инструментов будут ряд Control-элементов, некоторые из которых желательно сделать недоступные, когда не открыт ни один инструмент. Для этого обрабатываю сообщение WM_MDIACTIVE. Код обрабодчика приведен в приложении.
Но он работает весьма странно. Когда закрываю последний документ выводится окно с заголовком кнопки (см. Приложение). Пока это окно на экране, кнопка заблокирована, а как только я закрываю окно с заголовком кнопки, кнопка на панели инструментов становится доступной.

Поле CMainFrame::m_DlgToolBar имеет тип CDialogBar

Приложение:
void CChildFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) { CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd); CMainFrame *pMainFrame = (CMainFrame *) AfxGetMainWnd(); if(pMainFrame) { CWnd *pWnd = pMainFrame->m_DlgToolBar.GetDlgItem(IDC_OTHERCOLOR); if(pWnd) { if(pActivateWnd) pWnd->EnableWindow(true); else { pWnd->EnableWindow(false); char Title[256]; pWnd->GetWindowText(Title,256); AfxMessageBox(Title); } } }}

Обсуждение

Неизвестный
21.08.2006, 19:20
общий
Забыл сказать что среда программирования MS VC 6
Неизвестный
22.08.2006, 11:16
общий
это ответ
Здравствуйте, Melamed!

Привяжите кнопку не к MainFrame, а к ChildFrame или к CView. Код для OnMDIActivate писать не нужно - за вас это сделает MFC. Кстати он вам и мешает:

При создании/уничтожении окна MainFrame обновляет свое меню, проверяя доступность обработчика кнопки и включая её, если обработчик существует; причём это происходит после OnMDIActivate. Можете в этом убедится, изменив код так:

...
if(pActivateWnd)
pWnd->EnableWindow(false);
else
...

Если вам всё-таки нужно, чтобы кнопка была связана с Mainframe - можно поступить так же, как и разработчики MFC. Создаётся два шаблона менюшки и меняются по необходимости. Менять шаблоны лучше в MainFram`е, а вызывать функцию, которая меняет шаблоны - из OnMDIActivate.
Форма ответа