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

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

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

Рассмотрим следующий фрагмент кода, добавленного нами ранее в функцию CMainFrame::OnCreate() файла MainFrm.cpp

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  m_wndColorBar.EnableDocking(CBRS_ALIGN_ANY);// Наша!!!
  EnableDocking(CBRS_ALIGN_ANY);
  
  DockControlBar(&m_wndToolBar);
  DockControlBar(&m_wndColorBar);// Наша!!!

По умолчанию положение панели инструментов можно изменить только программно. Но можно разрешить пользователям самостоятельно перемещать панели инструментов и располагать их в других частях фреймового окна. О том, что такая возможность разрешена, необходимо уведомить как саму панель инструментов, так и фреймовое окно. Для этого и вызываются функции CToolBar::EnableDocking() и CFrameWnd::EnableDocking() (разрешить прикрепление).

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

Последняя функция DockControlBar(&m_wndColorBar) кода - это функция фреймового окна, дающая команду изначально прикрепить панель инструментов, адрес на которую ей передается, к фрейму перед первым появлением окна на экране.

Параметры, передаваемые функциями EnableDocking()
Стиль Описание
CBRS_ALIGN_TOP Прикрепляет панель инструментов к верхней стороне рабочей области обрамляющего окна
CBRS_ALIGN_BOTTOM Прикрепляет панель инструментов к нижней стороне рабочей области обрамляющего окна
CBRS_ALIGN_LEFT Прикрепляет панель инструментов к левой стороне рабочей области обрамляющего окна
CBRS_ALIGN_RIGHT Прикрепляет панель инструментов к правой стороне рабочей области обрамляющего окна
CBRS_ALIGN_ANY Позволяет прикреплять панель инструментов к любой стороне рабочей области обрамляющего окна
CBRS_FLOAT_MULTI Позволяет помещать в одно плавающее мини-окно несколько панелей инструментов
0 Не позволяет прикреплять панель инструментов к рамке

Управление видимостью панели инструментов IDR_TBCOLOR

Расширим меню View нашего приложения и добавим в него пункт включения/выключения панели инструментов IDR_TBCOLOR. Затем нужно создать код отображения и сокрытия панели инструментов. Здесь можно применить два варианта, первый из которых использует методы базового класса CWnd панели инструментов, второй - методы класса CToolBar.

Вариант 1

Прежде, чем отображать или скрывать панель инструментов, нужно выяснить ее текущее состояние (отображена/скрыта). Информацию о видимости панели инструментов содержит флаг WS_VISIBLE стиля ее окна. Для этого с помощью функции CWnd::GetStyle() необходимо получить сначала значение стиля окна панели инструментов, а затем сравнить его по маске со значением флага WS_VISIBLE.

// Выяснить текущее состояние видимости
bool bVisible = (m_wndColorBar.GetStyle() & WS_VISIBLE);

На основании информации о том, скрыта панель инструментов или отображена, можно применить соответствующее действие

// Показать или скрыть панель инструментов
int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;
m_wndColorBar.ShowWindow(nShow);

После этого обо всех программных изменениях панели инструментов необходимо уведомить фреймовое окно, которое повторно вычислит позиции всех панелей и перестроит их. Для этого достаточно вызова функции CFrameWnd::RecalcLayout()

// Переконфигурировать элементы всех панелей инструментов,
// строки состояния и всего остального в пределах фрейма
RecalcLayout();
Вариант 2

Прежде, чем отображать или скрывать панель инструментов, нужно выяснить ее текущее состояние (отображена/скрыта). Информацию о видимости панели инструментов можно получить с помощью функции CControlBar::IsVisible(). Затем для отображения или скрытия панели инструментов можно применить функцию фреймового окна CFrameWnd::ShowControlBar(). Прототип этой функции

void ShowControlBar(CControlBar* pBar, BOOL bShow, BOOL bDelay);
  • pBar - адрес переменной управляемой панели инструментов
  • bShow - булева переменная, которая определяет, показывать или скрывать панель инструментов ( TRUE - показать, FALSE - скрыть)
  • bDelay - булева переменная, которая определяет, показать/скрыть панель инструментов с задержкой ( TRUE ) или немедленно ( FALSE )

После этого обо всех программных изменениях панели инструментов необходимо уведомить фреймовое окно, которое повторно вычислит позиции всех панелей и перестроит их. Для этого достаточно вызова функции CFrameWnd::RecalcLayout()

// Переконфигурировать элементы всех панелей инструментов,
// строки состояния и всего остального в пределах фрейма
RecalcLayout();
Реализация управления видимостью

Для добавления возможности управления видимостью нашей панели инструментов выполните следующие пошаговые инструкции:

  • Откройте ресурс меню на редактирование, русифицируйте его и добавьте в категорию View новый пункт
    Параметры для категории View ресурса меню
    Свойство Значение
    ID (идентификатор) ID_VIEW_COLORBAR
    Caption (надпись) &Color Bar
    Prompt (подсказка) Показать или скрыть панель выбора цвета \n Показать/ Скрыть
  • Во вкладке Class View выделите класс CMainFrame
  • Во вкладке Properties установите режим Events
  • Найдите узел событий ID_VIEW_COLORBAR, раскройте его и добавьте обработчики для событий COMMAND и UPDATE_COMMAND_UI
  • Заполните обработчики так
    Обработчики меню View пункта Color Bar
    void CMainFrame::OnViewColorbar()
    {
    /***Студент Жук! Чтобы раскомментировать блок, добавьте спереди один слэш***
      // Вариант 1
      // Выяснить текущее состояние видимости
      bool bVisible = (m_wndColorBar.GetStyle() & WS_VISIBLE);
      // Показать или скрыть панель инструментов
      int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;
      m_wndColorBar.ShowWindow(nShow);
    //*****************************************************/
      
    //***Студент Жук! Чтобы закомментировать блок, уберите спереди один слэш***
      // Вариант 2
      // Показать или скрыть панель инструментов
      ShowControlBar(&m_wndColorBar
                      ,!m_wndColorBar.IsVisible()
                      ,FALSE);
    //*****************************************************/
      // Переконфигурировать элементы всех панелей инструментов,
      // строки состояния и всего остального в пределах фрейма
      RecalcLayout();// Можно и закомментировать, я разницу не нашел!
    }
      
    void CMainFrame::OnUpdateViewColorbar(CCmdUI *pCmdUI)
    {
      // В зависимости от видимости панели отобразить
      // пункт меню с отметкой флажком или без флажка
      pCmdUI->SetCheck(m_wndColorBar.IsVisible());
    }
  • Проследите за тем, чтобы обработчики были членами класса CMainFrame и попали в файл реализации MainFrm.cpp.

В первом обработчике реализованы два варианта управления отображением панели, рассмотренные выше. Один из вариантов закомментирован. Проверьте оба варианта, попеременно раскомментируя один и закомментируя другой. Обратите внимание на способ быстрого комментирования нужного блока, авось пригодится где-нибудь в "Силиконовой долине", где время - деньги.

Добавление комбинированного списка к панели инстументов, отвечающего за установку толщины линии Width

Добавим к панели инструментов комбинированный список, отвечающий за установку толщины пера рисования.

Редактирование файла ресурсов проекта вручную

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

  • Перейдите на вкладку Solution Explorer, найдите и выделите файл ресурсов DrawSDI.rc

  • Из контекстного меню этого ресурса откройте окно Open With

  • Выберите текстовый редактор Source Code (Text) Editor, как показано на рисунке, и нажмите кнопку Open. Если появится окно сообщения с вопросом, хотим ли мы закрыть текущий редактор ресурсов (вкладку Resource View ),


    щелкните по кнопке Да ( Yes )

    А теперь будьте очень осторожными и случайно не испортите файл ресурсов, иначе это приведет к выводу из строя всего проекта приложения!!! (лучше вначале создать его копию)

  • Найдите раздел панели инструментов IDR_TBCOLOR и добавьте две строки SEPARATOR (разделитель) как показано ниже
    Прямое редактирование файла ресурсов DrawSDI.rc
    ....................................................  
    ///////////////////////////////////////////////////////////
    //
    // Toolbar
    //
      
    IDR_TBCOLOR TOOLBAR  16, 15
    BEGIN
        BUTTON      ID_COLOR_BLACK
        BUTTON      ID_COLOR_BLUE
        BUTTON      ID_COLOR_GREEN
        BUTTON      ID_COLOR_CYAN
        BUTTON      ID_COLOR_RED
        BUTTON      ID_COLOR_MAGENTA
        BUTTON      ID_COLOR_YELLOW
        BUTTON      ID_COLOR_WHITE
        SEPARATOR
        SEPARATOR
    END
    ...................................................
  • Закройте окно редактора с сохранением изменений

Теперь, если открыть вкладку Resource View, то можно увидеть предупреждение, что файл ресурсов редактировался напрямую через прочие редакторы


  • Сверните узел дерева с изображением папки и разверните вновь - предупреждение исчезнет

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

  1. Показать возможность редактирования напрямую
  2. Дизайнер панели инструментов оболочки не позволяет добавить более одного разделителя
  3. Если в конце панели после разделителя ничего не добавить, то дизайнер решит, что разделитель вставлен по ошибке и автоматически удалит его, поэтому мы и добавили еще один разделитель в конце, как что-то существенное
  • Постройте приложение и обратите внимание, что в конце панели инструментов выбора цвета появились два вертикальных разделителя - это и есть добавленные нами сепараторы
Добавление текстовых строк будущего комбинированного списка

Теперь нужно добавить текстовые строки как ресурс, которые будут загружены в комбинированный список при его создании. Следует помнить, что каждая строка комбинированного списка является отдельным ресурсом и должна иметь уникальный идентификатор с уникальным значением. Текстовые строки добавим через таблицу строк String Table ресурса приложения.

  • Через вкладку Resource View откройте узел String Table

Если вы не русифицировали этот ресурс и одновременно для кнопок панели инструментов вводили русские сообщения, то в файле ресурсов оболочка создала два раздела, относящиеся к таблице строк. Один из разделов с последними изменениями имеет вид

Дополнительный раздел таблицы строк в DrawSDI.rc
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
  
STRINGTABLE 
BEGIN
    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Белый"
END
  
STRINGTABLE 
BEGIN
    ID_VIEW_COLORBAR        "Показать или скрыть панель выбора цвета\nПоказать/Скрыть"
END
  • Двойным щелчком мыши на русифицированном ресурсе вызовите редактор таблицы строк. Добавляете новые строки в соответствии с таблицей, приведенной ниже. При этом следите за тем, чтобы значения поля Value генерировались последовательно в порядке возрастания с шагом строго единица и чтобы IDS_WIDTH_1 имел наименьшее значение Value
    Параметры для категории View ресурса меню
    ID Caption
    IDS_WIDTH_1 1
    IDS_WIDTH_2 2
    IDS_WIDTH_3 3
    IDS_WIDTH_4 4
    IDS_WIDTH_5 5
    IDS_WIDTH_6 6
    IDS_WIDTH_7 7
    IDS_WIDTH_8 8
    IDS_WIDTH_16 Medium
    IDS_WIDTH_24 Thick
    IDS_WIDTH_32 Very Thick

Должно получиться нечто подобное


Теперь в файле ресурсов соответствующий раздел выглядит так

Раздел таблицы строк в DrawSDI.rc после добавления
//////////////////////////////////////////////////////////////
//
// String Table
//
  
STRINGTABLE 
BEGIN
    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Белый"
END
  
STRINGTABLE 
BEGIN
    ID_VIEW_COLORBAR        "Показать или скрыть панель выбора цвета\nПоказать/Скрыть"
    IDS_WIDTH_1             "1"
    IDS_WIDTH_2             "2"
    IDS_WIDTH_3             "3"
    IDS_WIDTH_4             "4"
    IDS_WIDTH_5             "5"
    IDS_WIDTH_6             "6"
    IDS_WIDTH_7             "7"
    IDS_WIDTH_8             "8"
    IDS_WIDTH_16            "Medium"
    IDS_WIDTH_24            "Thick"
    IDS_WIDTH_32            "Very Thick"
END
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .