Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 9:

Однодокументный интерфейс MFC

Панели инструментов и строка состояния MFC

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

Строкой состояния в SDI- и MDI- документах называется информационное окно, расположенное, как правило, в нижней части рамки приложения и отражающее поясняющий текст (длинные подсказки) о назначении пунктов меню или кнопок панели инструментов. Панелями инструментов называются окна, содержащие наборы кнопок быстрого доступа к функциональным возможностям приложения.

Панели инструментов, как и меню, делают контекстными к данному режиму приложения, т.е. они умеют к нему подстраиваться. Панели инструментов тесно связаны с меню, поскольку предназначены для тех же целей. Для удобства панели инструментов могут делать свободно плавающими ( floating ) или приклеивающимися ( dockable ) к рамке окна приложения. Панели инструментов снабжают короткими всплывающими подсказками о назначении кнопок. Панели инструментов и строка состояния относятся к группе элементов графического интерфейса пользователя ( GUI ).

Добавление в приложение нового ресурса панели инструментов IDR_TBCOLOR

  • Откройте вкладку Resource View и через контекстное меню на узле Toolbar добавьте новый ресурс Toolbar, нажав кнопку New


    Появится окно графического редактора с заготовкой панели инструментов


    Одновременно в узле Toolbar вкладки Resource View приложения появится новый ресурс с автоматически сгенерированным идентификатором


  • Присвойте идентификатору новое имя IDR_TBCOLOR
  • Присвойте пиктограммы каждой кнопке, т. е. заполните восемь кнопок новой панели восемью доступными в графическом редакторе оболочки цветами

    Чтобы не работать с карандашом, который включен по умолчанию, можно переключить инструмент рисования на кисть, предварительно вызвав через контекстное меню панели инструментов оболочки панель Image Editor


  • Убедитесь, что ресурс новой панели русифицирован, чтобы можно было заполнять в него тексты на русском
  • Выделите по очереди каждую кнопку новой панели и через вкладку оболочки Properties задайте свойства кнопок в соответствии с таблицей

    Свойство Prompt состоит из длинной (отображаемой в строке состояния) и короткой (всплывающей, когда пользователь задерживает курсор над кнопкой на время около 2 секунд) подсказок, разделенных управляющим символом "новая строка".

    ID Prompt
    ID_COLOR_BLACK Цвет рисования черный \n Черный
    ID_COLOR_BLUE Цвет рисования синий \n Синий
    ID_COLOR_GREEN Цвет рисования зеленый \n Зеленый
    ID_COLOR_CYAN Цвет рисования бирюзовый \n Бирюзовый
    ID_COLOR_RED Цвет рисования красный \n Красный
    ID_COLOR_MAGENTA Цвет рисования сиреневый \n Сиреневый
    ID_COLOR_YELLOW Цвет рисования желтый \n Желтый
    ID_COLOR_WHITE Цвет рисования белый \n Белый
  • Убедитесь, и это очень важно, что мы только что присвоили кнопкам панели инструментов IDR_TBCOLOR точно такие же идентификаторы, что и соответствующим пунктам меню категории Color

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

По умолчанию размер кнопок принят 16x15 пикселов. Использование изображений, размеры которых отличаются от принятых по умолчанию, вполне возможно, но об этом необходимо уведомить объект панели инструментов при помощи функции CToolBar::SetSizes().

  • Закройте окно графического редактора, чтобы случайно не испортить подготовленную панель инструментов

Любая панель инструментов хранится в виде растрового рисунка формата bmp в каталоге res проекта. Ее всегда можно открыть и отредактировать другим внешним редактором.

  • Выделите во вкладке Resource View идентификатор нашей новой панели IDR_TBCOLOR и во вкладке Properties посмотрите путь графического файла, представляющего изображение этой панели

В нашем случае файл имеет имя toolbar1.bmp. Открытый во внешнем редакторе он имеет вид


Присоединение панели инструментов IDR_TBCOLOR к рамке приложения

Пока мы только заготовили ресурс панели инструментов. Теперь подсоединим его к приложению. Поскольку панели инструментов присоединяются к рамке, необходимо начать добавление и изменение кода именно в модуле рамки. Рамкой нашего приложения управляет класс CMainFrame, являющийся производным от базового класса CFrameWnd и расположенный в файлах MainFrm.h и MainFrm.cpp.

У нас уже есть одна панель инструментов, автоматически сгенерированная мастером при создании заготовки приложения в самом начале выполнения лабораторной работы. В файле MainFrm.cpp можно увидеть, что она создается и прикрепляется к рамке окна приложения в функции OnCreate() - члене класса CMainFrame

Функция OnCreate() файла MainFrm.cpp
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
  
  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
  }
  
  if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
  {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
  }
  // TODO: Delete these three lines if you don't want the toolbar to be dockable
  m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  EnableDocking(CBRS_ALIGN_ANY);
  DockControlBar(&m_wndToolBar);
  
  return 0;
}

В этой функции мы, подобным образом, создадим и прикрепим нашу новую панель. Но вначале для этого добавим в класс CMainFrame новую переменную типа CToolBar, которая и будет содержать новую панель. Эта переменная должна быть защищенной и назовем ее m_wndColorBar.

  • Щелкните правой кнопкой мыши на классе CMainFrame во вкладке Class View, вызовите мастер Add Variable, который заполните так


    Мастер добавит в объявление класса следующий код

    Объявление переменной-панели в классе CMainFrame файла MainFrm.h
    class CMainFrame : public CFrameWnd
    {
    ........................................................
    protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
      // Панель инструментов для цвета
      CToolBar m_wndColorBar;
    };
  • Добавьте к функции OnCreate() класса CMainFrame следующий код

    Добавления в функцию CMainFrame::OnCreate() файла MainFrm.cpp
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
      if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
      
      if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
      {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
      }
      
      // Создать инструментальную панель 
      // для выбора цвета и настроить ее
      if (!m_wndColorBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndColorBar.LoadToolBar(IDR_TBCOLOR))
      {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
      }
      // Найти кнопку ID_COLOR_BLACK на инструментальной панели
        int iTBCtrlID = m_wndColorBar.CommandToIndex(ID_COLOR_BLACK);
      if(iTBCtrlID >= 0){
        // Установить все кнопки так, чтобы
        // они действовали как радиокнопки в группе
        for(int i = iTBCtrlID; i < (iTBCtrlID + 8); i++)
          m_wndColorBar.SetButtonStyle(i, TBBS_CHECKGROUP);
      }
      
      if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
          sizeof(indicators)/sizeof(UINT)))
      {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
      }
      
      // TODO: Delete these three lines if you don't want the toolbar to be dockable
      // Что делать: Удалите эти три строки, если инструментальную панель не нужно прикреплять
      m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
      m_wndColorBar.EnableDocking(CBRS_ALIGN_ANY);// Наша!!!
      EnableDocking(CBRS_ALIGN_ANY);
      
      DockControlBar(&m_wndToolBar);
      DockControlBar(&m_wndColorBar);// Наша!!!
      
      return 0;
    }
  • Постройте приложение и убедитесь, что панель ведет себя как нужно и переключает цвета точно также, как это делается через меню Color

Это происходит потому, что идентификаторы ресурсов кнопок и пунктов меню одни и те же.

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .