Иллюстрированный самоучитель по Visual Studio.Net


Отслеживание состояния команд - часть 2


Имея в классе главного окна такую функцию, как ChangeToolbar, мы просто должны вызывать ее в нужные моменты, подавая на вход идентификатор той или иной панели. Осталось правильно определить те моменты, когда надо производить смену панелей. Очевидно, это моменты перевода фокуса из окна типа CTreeFrame в окно типа CDrawFrame и наоборот.

Примечание

Здесь важно понять, что фокус на самом деле попадает в одно из дочерних окон CLeftView или CRightView или CDrawView. Но это происходит после того, как он попадет в родительское окно-рамку. В принципе, возможны и другие варианты решения проблемы своевременной смены панелей инструментов. Например, переопределить в каждом из трех представлений виртуальную функцию OnActivateView и в ней вызывать ChangeToolbar.

Заметьте, что фокус может быть переведен в окно четырьмя разными способами:

  • активизация представления или его рамки при помощи левой кнопки мыши;

  • ввод клавишной комбинации (accelerator) Ctrl+F6, которая обрабатывается каркасом приложения и по очереди в цикле активизирует окна;

  • системная активизация следующего окна при закрытии одного из окон;

  • системная активизация окна при создании одного из окон (вспомните вызов CreateNewFrame В теле CTreeDoc: :MakeView) или открытии существующего документа.

Во всех четырех случаях окну-рамке будет послано сообщение WM_SETFOCUS, что нам и надо. Создайте известным вам способом обработчики рассматриваемого сообщения в двух классах окон-рамок CTreeFrame и CDrawFrame и наполните заготовки кодами, как показано ниже:

void CTreeFrame::OnSetFocus(CWnd* pOldWnd)

//====== Родитель делает свое дело,

CMDIChildWnd::OnSetFocus(pOldWnd);

//====== а мы делаем свое

((CMainFrame*)GetParentFrame())

->ChangeToolbar(IDRJTreeTYPE);

void CDrawFrame::OnSetFocus(CWnd* pOldWnd)

CMDIChildWnd::OnSetFocus(pOldWnd);

((CMainFrame*)AfxGetMainWnd())

->ChangeToolbar(IDR_DrawTYPE);

Функция GetParentFrame, полученная в наследство от класса CWnd, прбдвигаясь снизувверх, ищет среди родительских окон ближайшее окно-рамку.


Начало  Назад  Вперед