Образец DLGCBR32: демонстрация добавления строки состояния и панели инструментов в диалоговые окна

Обновлен: Ноябрь 2007

В образце DLGCBR32 демонстрируется, как добавить в диалоговое окно строку состояния и панель инструментов. Кроме того, здесь показан ряд методов, связанных с использованием немодального диалогового окна в качестве главного окна приложения MFC.

В приложении MFC можно добавлять в фрейм окна различные управляющие области, например строки состояния и панели инструментов. Однако для многих приложений вполне достаточно простейшего интерфейса пользователя на базе диалогового окна. В MFC отсутствует встроенная поддержка добавления управляющих областей в диалоговые окна.

ccstww6w.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца DLGCBR32

  1. Откройте решение Dlgcbr32.sln.

  2. В меню Построение выберите команду Построить.

  3. В меню Отладка выберите пункт Запуск без отладки.

Добавление управляющей области в диалоговое окно

Чтобы добавить управляющую область в диалоговое окно, создайте ее обычным способом, а затем выделите для нее место в клиентской области диалогового окна. Чтобы управляющая область функционировала нормально, диалоговое окно должно дублировать некоторые функции фрейма окна. Если для управляющих областей должны быть доступны обработчики ON_UPDATE_COMMAND_UI, необходимо также создать новые производные классы управляющих областей и реализовать обработку сообщения WM_IDLEUPDATECMDUI. Если диалоговое окно не является главным окном приложения, необходимо изменить его родительский фрейм окна так, чтобы сообщение WM_IDLEUPDATECMDUI передавалось в управляющие области диалогового окна.

Чтобы выделить место для управляющей области в клиентской области диалогового окна, выполните в функции OnInitDialog диалогового окна следующие действия.

  1. Создайте управляющие области. Выясните, сколько места потребуется для управляющих областей; используйте для этого параметр reposQuery функции RepositionBars.

    CRect rcClientStart;
    CRect rcClientNow;
    GetClientRect(rcClientStart);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,
                   AFX_IDW_CONTROLBAR_LAST,
                   0, reposQuery, rcClientNow);
    
  2. Переместите элементы управления в диалоговом окне с учетом места, занимаемого управляющими областями в верхней или левой части клиентской области. Если диалоговое окно содержит меню, необходимо также учесть место, занимаемое меню.

    CPoint ptOffset(rcClientNow.left - rcClientStart.left,
                    rcClientNow.top - rcClientStart.top);
    CRect rcChild;
    CWnd* pwndChild = GetWindow(GW_CHILD);
    while (pwndChild)
        {
           pwndChild->GetWindowRect(rcChild);
           ScreenToClient(rcChild);
           rcChild.OffsetRect(ptOffset);
           pwndChild->MoveWindow(rcChild, FALSE);
           pwndChild = pwndChild->GetNextWindow();
        }
    
  3. Увеличьте размеры диалогового окна в соответствии с добавляемыми управляющими областями.

    CRect rcWindow;
    GetWindowRect(rcWindow);
    rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
    rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
    MoveWindow(rcWindow, FALSE);
    
  4. Установите положение управляющих областей, используя RepositionBars.

Чтобы обновить первую область строки состояния, показав в ней текст пункта меню, необходимо обработать сообщения WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING и WM_POPMESSAGESTRING в классе диалогового окна. Необходимо дублировать функции обработчиков CFrameWnd для этих сообщений. Примеры таких обработчиков сообщений см. в определении класса CModelessMain в образце программы.

Чтобы показать подсказки для кнопок панели инструментов, необходимо обработать уведомления TTN_NEEDTEXTW и TTN_NEEDTEXTA.

Чтобы обработчики ON_UPDATE_COMMAND_UI могли работать с другими областями строки состояния и с кнопками панели инструментов, необходимо определить новые производные классы управляющих областей и реализовать обработчик сообщений для WM_IDLEUPDATECMDUI. Это требуется потому, что в реализациях OnUpdateCmdUI по умолчанию для управляющих областей предполагается, что родительское окно является фреймом. Однако вся обработка в OnUpdateCmdUI сводится к передаче указателя на родительское окно в функцию, для которой требуется только указатель CCmdTarget. Поэтому для соблюдения требований компилятора можно временно определить для OnUpdateCmdUI, что представленный указатель на родительское окно является указателем CFrameWnd. Например:

LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
   if (IsWindowVisible())
   {
      CFrameWnd* pParent = (CFrameWnd*)GetParent();
      if (pParent)
         OnUpdateCmdUI(pParent, (BOOL)wParam);
   }
   return OL;
}

Чтобы передавать сообщения WM_IDLEUPDATECMDUI в диалоговые окна, отличные от главного окна, сохраните указатели на диалоговые окна в классе фрейма окна и создайте в этом классе обработчик WM_IDLEUPDATECMDUI. Обработчик должен отправлять сообщение WM_IDLEUPDATECMDUI в дочерние диалоговые окна, используя CWnd::SendMessageToDescendants. После этого выполните стандартную обработку сообщения в фрейме окна.

ccstww6w.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Примеры MFC