Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Однодокументный интерфейс 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 новый пункт
-
Во вкладке 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, то можно увидеть предупреждение, что файл ресурсов редактировался напрямую через прочие редакторы
-
Сверните узел дерева с изображением папки и разверните вновь - предупреждение исчезнет
Прямое редактирование файла ресурсов было выполнено по трем причинам:
- Показать возможность редактирования напрямую
- Дизайнер панели инструментов оболочки не позволяет добавить более одного разделителя
- Если в конце панели после разделителя ничего не добавить, то дизайнер решит, что разделитель вставлен по ошибке и автоматически удалит его, поэтому мы и добавили еще один разделитель в конце, как что-то существенное
-
Постройте приложение и обратите внимание, что в конце панели инструментов выбора цвета появились два вертикальных разделителя - это и есть добавленные нами сепараторы
Добавление текстовых строк будущего комбинированного списка
Теперь нужно добавить текстовые строки как ресурс, которые будут загружены в комбинированный список при его создании. Следует помнить, что каждая строка комбинированного списка является отдельным ресурсом и должна иметь уникальный идентификатор с уникальным значением. Текстовые строки добавим через таблицу строк 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
Должно получиться нечто подобное
Теперь в файле ресурсов соответствующий раздел выглядит так
Раздел таблицы строк в 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