Учебник по Visual C++ .Net




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


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

  • ввод клавишной комбинации (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, прбдвигаясь снизувверх, ищет среди родительских окон ближайшее окно-рамку. В нашем случае в этой цепи будет одно промежуточное окно типа MDICLIENT, управляемое классом cwnd. Отметим, что тип MDICLIENT не документирован, но известно, что он служит для управления окнами-рамками типа CMDlchildWnd, располагающимися в клиентской области главного окна приложения. Наши классы CTreeFrame и CDrawVrame являются потомками CMDlchildWnd, поэтому ими-то и управляет секретное окно типа MDICLIENT. Существует и другой способ получить адрес главного окна (CMainFrame). Это вызов глобальной функции MFC Af xGetMainWnd. Мы используем его во второй версии OnSetFocus только для того, чтобы продемонстрировать оба способа.

    Если вы запустите приложение в этот момент, то получите сообщение об ошибках, к которым пора привыкнуть, так как они встречаются довольно часто и вызваны тривиальной причиной — отсутствием видимости класса. Вставьте строку #include "MainFrm.h" в оба файла реализации окон-рамок. Затем запустите приложение вновь и, выбрав шаблон Tree, дайте команду View > Geometry. Вместе с окном другого типа вы увидите и другую панель инструментов. Дайте команду Window > Tile Vertically и проверьте все способы поочередной активизации окон. Панель инструментов и меню должны мгновенно отслеживать переход фокуса.




    Содержание  Назад  Вперед