Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
129-160.doc
Скачиваний:
2
Добавлен:
11.11.2019
Размер:
343.04 Кб
Скачать

162

Функция CCmdUI::Enable() блокирует элемент пользовательского интерфейса (кнопку панели инструментов или команду меню), если ей передается значение FALSE и делает элемент доступным (разблокирует его), если ей передать значение TRUE.

Функция CCmdUI::SetGheck() устанавливает элемент управления в соответствующее состояние. Если в функцию передать значение, равное 1, то элемент управления (кнопка или команда меню) являются выбранными. Кнопка меняет свой внешний вид, а команда меню помечается меткой выбора (специальным символом). Значение 0 сбрасывает элемент управления, т.е. отменяется выбор кнопки, с команды меню снимается метка выбора. Переданное в функцию значение 2 переводит кнопку в неопределенное состояние.

Функция CCmdUI::SetRadio() устанавливает переключатель (radio button). Работает аналогично функции CCmdUI::SetGheck(). Если элемент управления не поддерживает поведение переключателя, то проверка его состояния автоматически не осуществляется. Если функции передать значение TRUE, она отметит команду меню, используя метку выбора, или выберет кнопку на панели инструментов, подобно функции CCmdUI::SetCheck(). Если передать значение FALSE, то функция снимает метку с команды меню или отменяет выбор кнопки.

Чтобы задать надпись для команды меню или кнопки, вызовите функцию CCmdUI::SetText(), параметром которой является указатель на строку текста.

Приведенные методы класса CCmdUI необходимо вызывать в функциях с префиксом OnUpdate, реализующих процесс обновления команд. Обработчики обновления команд вызываются при простое программы и открытии ниспадающего меню. В обоих случаях обработчикам обновления команд передается указатель на объект класса CCmdUI. В нашем примере обработчики обновления команд вызывают функцию CCmdUI::SetCheck(), передавая ей значение 1, тем самым, устанавливая состояние кнопки и команды меню как выбранное. Если обработчик обновления команд вызывается во время простоя программы, то объект CCmdUI связан с кнопкой панели инструментов и при вызове функции CCmdUI::SetCheck() выбирается эта кнопка. Если обработчик вызван в ответ на открытие ниспадающего меню, то объект класса CCmdUI связан с командой меню и функция CCmdUI::SetCheck() отмечает эту команду.

Задание 6. Добавление обработчиков сообщений для кнопок панели инструментов

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

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

  1. О ткройте окно Class View. Выберите класс CMyPaintApp, предварительно развернув список классов. Откройте окно Properties и нажмите кнопку Events (События) с изображением молнии.

  1. В появившемся списке идентификаторов команд меню выберите идентификатор ID_LINES_DOUBLE, щелкните мышью на значке + слева от идентификатора для получения списка сообщений COMMAND и UPDATE_COM-MAND_UI.

  2. Выберите сообщение COMMAND, щелкните на кнопке, раскрывающей список команд, выберите команду <Add> OnLinesDouble как на рис. 5.14. Так как ID_LINES_DOUBLE — это идентификатор кнопки Double-Thickness Lines и команды Double в меню Lines, то функция OnLinesDouble() получает управление либо после щелчка на кнопке, либо после выбора команды меню.

В файл MyPaint.h интерфейса класса приложения CMyPaintApp будет добавлено объявление функции OnLinesDouble(). В файл MyPaint.cpp добавляется шаблон функции CMyPaint-App::OnLinesDouble().

  1. Для идентификатора ID_LINES_DOUBLE команды меню выберите сообщение UPDATE_COMMAND_UI, щелкните на кнопке раскрытия списка команд и затем на команде <Add> OnUpdateLinesDouble. Функция OnUpdateLinesDouble() получает управление через равные промежутки времени при простое системы для обновления кнопки Double-Thickness Lines, а также при открытии всплывающего меню Lines для инициализации команды меню Double.

  2. Создайте обработчики всех остальных команд меню, выбирая в списке идентификаторов команд в окне свойств значения с префиксами ID_LINES и ID_TOOLS, а в списке сообщений — сообщения COMMAND и UPDATE_COMMAND_UI. Не создавайте обработчики для команды меню ViewToolbar. Для этой команды MFC уже создал обработчик по умолчанию. Соответствие идентификаторов команд и обработчиков сообщений, созданных с помощью окна свойств, приведено в табл. 5.2. Во всех случаях необходимо принимать стандартное имя функции, предлагаемое Microsoft Visual Studio.

Т а б л и ц а 5.2

Обработчики сообщений для кнопок панели инструментов программы MyPaint

Идентификатор кнопки/команды меню

Идентификатор сообщения

Обработчик сообщения

ID_LINES_DOUBLE

COMMAND

OnLinesDouble

ID_LINES_DOUBLE

UPDATE_COMMAND_UI

OnUpdateLinesDouble

ID_LINES_SINGLE

COMMAND

OnLinesSingle

ID_LINES_SINGLE

UPDATE_COMMAND_UI

OnUpdateLinesSingle

ID_LINES_TRIPLE

COMMAND

OnLinesTriple

ID_LINES_TRIPLE

UPDATE_COMMAND_UI

OnUpdateLinesTriple

ID_TOOLS_CIRCLE

COMMAND

OnToolsCircle

ID_TOOLS_CIRCLE

UPDATE_COMMAND_UI

OnUpdateToolsCircle

ID_TOOLS_CIRCLEFILL

COMMAND

OnToolsCirclefill

ID_TOOLS_CIRCLEFILL

UPDATE_COMMAND_UI

OnUpdateToolsCirclefill

ID_TOOLS_LINE

COMMAND

OnToolsLine

ID_TOOLS_LINE

UPDATE_COMMAND_UI

OnUpdateToolsLine

ID_TOOLS_RECTANGLE

COMMAND

OnToolsRectangle

ID_TOOLS_RECTANGLE

UPDATE_COMMAND_UI

OnUpdateToolsRectangle

ID_TOOLS_RECTFILL

COMMAND

OnToolsRectfill

ID_TOOLS_RECTFILL

UPDATE_COMMAND_UI

OnUpdateToolsRectfill

ID_TOOLS_RECTROUND

COMMAND

OnToolsRectround

ID_TOOLS_RECTROUND

UPDATE_COMMAND_UI

OnUpdateToolsRectround

ID_TOOLS_RECTROUNDFILL

COMMAND

OnToolsRectroundfill

ID_TOOLS_RECTROUNDFILL

UPDATE_COMMAND_UI

OnUpdateToolsRectroundfill

  1. Добавление объявлений и шаблонов реализаций функций‑обработчиков сообщений обеспечивает добавление в карту сообщений соответствующих макросов. Они устанавливают соответствие между вызываемыми функциями и выбранными командами меню или кнопками панели инструментов. Фрагмент созданной карты сообщений класса CMyPaintApp из файла MyPaint.cpp приводится ниже.

BEGIN_MESSAGE_MAP(CMyPaintApp, CWinApp) //. . . ON_COMMAND(ID_LINES_DOUBLE, OnLinesDouble) ON_UPDATE_COMMAND_UI(ID_LINES_DOUBLE, OnUpdateLinesDouble) ON_COMMAND(ID_LINES_SINGLE, OnLinesSingle) ON_UPDATE_COMMAND_UI(ID_LINES_SINGLE, OnUpdateLinesSingle) ON_COMMAND(ID_LINES_TRIPLE, OnLinesTriple) ON_UPDATE_COMMAND_UI(ID_LINES_TRIPLE, OnUpdateLinesTriple) ON_COMMAND(ID_TOOLS_CIRCLE, OnToolsCircle) ON_UPDATE_COMMAND_UI(ID_TOOLS_CIRCLE, OnUpdateToolsCircle) ON_COMMAND(ID_TOOLS_LINE, OnToolsLine) ON_UPDATE_COMMAND_UI(ID_TOOLS_LINE, OnUpdateToolsLine) //. . . END_MESSAGE_MAP()

  1. Команды меню Lines должны задавать толщину линии, используемой при рисовании фигуры в окне представления. Команды меню Tools должны обеспечить выбор типа фигуры для рисования. Для хранения текущей толщины линии определите переменную m_CurrentThickness. Для хранения типа фигуры, который соответствует выбранной кнопке панели инструмента, определите переменную m_CurrentTool. Для добавления переменных откройте окно Class View. Выберите класс CMyPaintApp в списке классов. В контекстном меню для класса CMiniDrawApp выполните команду AddAdd Variable и откройте диалоговое окно мастера Add Member Variable Wizard.

  2. В диалоговом окне Add Member Variable Wizard в поле Access выберите значение public, в поле Variable type выберите тип int, в поле Variable name введите имя m_CurrentThickness. Нажмите кнопку Finish. Толщина линий будет определяться значениями 1, 2 или 3, поэтому задается целый тип переменной.

  3. Аналогично в класс CMyPaintApp добавьте объявление переменной m_CurrentTool. Для этого откройте окно мастера Add Member Variable Wizard. Поля ввода заполните такими значениями: в поле Access выберите public, в поле Variable type введите значение UINT, в поле Variable name —m_CurrentTool. Нажмите кнопку Finish. В файле MyPaint.h появятся строки, выделенные в коде интерфейса класса приложения полужирным шрифтом.

// MyPaint.h : main header file for the MyPaint application class CMyPaintApp : public CWinApp { public: CMyPaintApp(); public: virtual BOOL InitInstance(); // Implementation afx_msg void OnAppAbout(); DECLARE_MESSAGE_MAP() afx_msg void OnLinesDouble(); afx_msg void OnUpdateLinesDouble(CCmdUI *pCmdUI); afx_msg void OnLinesSingle(); afx_msg void OnUpdateLinesSingle(CCmdUI *pCmdUI); afx_msg void OnLinesTriple(); afx_msg void OnUpdateLinesTriple(CCmdUI *pCmdUI); afx_msg void OnToolsCircle(); afx_msg void OnUpdateToolsCircle(CCmdUI *pCmdUI); //. . . int m_CurrentThickness; // толщина линий UINT m_CurrentTool; // тип фигуры };

  1. Добавленные в класс CMyPaintApp переменные инициализированы в конструкторе с помощью списка инициализации. Эту операции выполнил мастер добавления переменных-членов класса. Однако нулевые значения, которые присвоены этим переменным, не удовлетворяют требованиям нашей программы.. Откройте файл MyPaint.cpp и в конструкторе CMyPaintApp void) замените в строке m_CurrentThickness(0) значение 0 на 1. Добавьте в тело конструктора новый оператор инициализации переменной m_CurrentTool и закомментируйте строку m_CurrentTool(0). Все изменения показаны ниже полужирным шрифтом.

CMyPaintApp::CMyPaintApp() : m_CurrentThickness(1) //, m_CurrentTool(0) { // TODO: add construction code here, // Place all significant initialization in InitInstance m_CurrentTool = ID_TOOLS_LINE; }

  1. В файл MyPaint.cpp добавьте код для реализации обработчика сообщений, вызванных щелчком на кнопке Double-Thicknees Lines или выбором команды Double в меню Lines. Обработчик сгенерирован с помощью окна свойств. Функция-обработчик CMyPaintApp::OnLinesDouble() устанавливает значение переменной m_CurrentThickness равным 2 (двойная толщина).

void CMyPaintApp::OnLinesDouble() { // TODO: Add your command handler code here m_CurrentThickness = 2; }

  1. Если нажать кнопку Double-Thicknees Lines, то она становится выбранной и соответствующая команда Double меню Lines отмечается меткой выбора . Если сначала выбрать команду меню LinesDouble, то соответствующая ей кнопка панели инструментов становится выбранной. Если после этого развернуть меню Lines, то команда меню Double отмечена символом . Таким образом, происходит обновление команды и выполняется оно обработчиком CMyPaintApp::OnUpdateLinesDouble(). Рассматриваемая функция вызывает функцию CCmdUI::SetCheck(), передавая ей значение 1. Для реализации описанных действий разверните список методов класса CMyPaintApp. Двойным щелчком на имени функции OnUpdateLinesDouble() выведите ее код в окно редактора кода. Внесите дополнения, показанные полужирным шрифтом.

void CMyPaintApp::OnUpdateLinesDouble(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentThickness == 2 ? 1 : 0); }

  1. Когда выбирается определенная толщина линии с помощью панели инструментов или меню Lines, функции OnLinesSingle(), COnLinesDouble() или OnLinesTriple() класса CMyPaintApp присваивают переменной m_LineThickness правильное значение. Для задания нужной толщины линии добавьте в сгенерированный код строки, выделенные полужирным шрифтом.

void CMyPaintApp::OnLinesSingle() { // TODO: Add your command handler code here m_CurrentThickness = 1; }

void CMyPaintApp::OnLinesTriple() { // TODO: Add your command handler code here m_CurrentThickness = 3; }

  1. Функции CMyPaintApp::OnUpdateLinesSingle() и CMyPaintApp::OnUpdateLinesTriple() также вызываются при простое программы и открытии меню Lines. Каждая из этих функций передает значение 0 в функцию CCmdUI::SetCheck(), отменяя выбор кнопки (если она выбрана) или убирая отметку возле команды меню (если она отмечена). Таким образом, метка перемещается от пункта, выбранного ранее, к пункту, выбранному в настоящий момент. Кроме того, OnUpdateLinesDouble(), OnUpdateLinesSingle() или OnUpdateLinesTriple() класса CMyPaintApp гарантируют, что соответствующая кнопка выбрана, а две другие — нет. Они же гарантируют, что в меню Lines необходимая команда отмечена. Дополните сгенерированный код функций строками, которые выделены полужирным шрифтом.

void CMyPaintApp::OnUpdateLinesSingle(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentThickness == 1 ? 1 : 0); }

void CMyPaintApp::OnUpdateLinesTriple(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentThickness == 3 ? 1 : 0); }

  1. Функции, обрабатывающие семь кнопок, связанных с инструментами рисования, и соответствующие команды в меню Tools, работают аналогично (присваивают значение переменной m_CurrentTool, выбирают правильную кнопку в панели инструментов и отмечают правильную команду в меню Tools). Внесите дополнения в сгенерированный шаблон функций в соответствии с приведенным ниже кодом.

void CMyPaintApp::OnToolsCircle() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_CIRCLE; }

void CMyPaintApp::OnUpdateToolsCircle(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_CIRCLE ? 1 : 0); }

void CMyPaintApp::OnToolsCirclefill() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_CIRCLEFILL; }

void CMyPaintApp::OnUpdateToolsCirclefill(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_CIRCLEFILL ? 1 : 0); }

void CMyPaintApp::OnToolsLine() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_LINE; }

void CMyPaintApp::OnUpdateToolsLine(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_LINE ? 1 : 0); }

void CMyPaintApp::OnToolsRectangle() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_RECTANGLE; }

void CMyPaintApp::OnUpdateToolsRectangle(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_RECTANGLE ? 1 : 0); }

void CMyPaintApp::OnToolsRectfill() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_RECTFILL; }

void CMyPaintApp::OnUpdateToolsRectfill(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_RECTFILL ? 1 : 0); }

void CMyPaintApp::OnToolsRectround() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_RECTROUND; }

void CMyPaintApp::OnUpdateToolsRectround(CCmdUI *pCmdUI) // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_RECTROUND ? 1 : 0); }

void CMyPaintApp::OnToolsRectroundfill() { // TODO: Add your command handler code here m_CurrentTool = ID_TOOLS_RECTROUNDFILL; }

void CMyPaintApp::OnUpdateToolsRectroundfill(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_CurrentTool == ID_TOOLS_RECTROUNDFILL ? 1 : 0); }

  1. Теперь можно построить и запустить программу MyPaint. Обратите внимание: кнопки панели инструментов и соответствующие команды меню не заблокированы, значит, можно выбрать различные кнопки панели инструментов и отметить соответствующие команды меню.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]