Развитие начальной заготовки
Мы хотим показать способы развития начальной заготовки приложения Win32. В наши планы входит создание пера Windows и управление его стилями. Кроме того, мы хотим показать, как можно изменять цвет пера с помощью стандартного диалога Windows. Существует множество стандартных диалогов для управления разными объектами системы, например открытие файла, выбор шрифта, поиск и замена текста. Мы будем управлять стандартным диалогом по выбору цвета. Обычным приемом при работе с каким-либо из стандартных диалогов является использование подходящей вспомогательной структуры. Поля структуры помогают инициализировать элементы диалога при его открытии, а также извлечь результат после его завершения.
В нашем случае диалог вызывается ЛР1-функцией chooseColor, которая требует задать в качестве параметра адрес структуры типа CHOOSECOLOR. Ее надо предварительно создать и использовать для хранения текущего цвета, а также цвета, выбранного пользователем в рамках диалога. Цвет должен храниться в поле rgbResult этой структуры. Вы помните, что оконная процедура многократно, при обработке каждого сообщения, получает и вновь отдает управление системе. Ее локальные (автоматические) переменные будут каждый раз создаваться и погибать. Следовательно, они не в состоянии запомнить текущий выбранный цвет. Выход — использовать либо глобальные, либо статические переменные. Используя второй способ, вставьте в начало тела функции WndProc следующие переменные:
//=====
Структура для работы со стандартным диалогом
CHOOSECOLOR
cc;
//=====
Переменная для хранения текущего цвета
static
COLORREF color = RGB(255,0,0);
//=====
Массив цветов, выбираемых пользователем
static
COLORREF CustColors[16];
Структура CHOOSECOLOR
определена в библиотеке, которая сейчас недоступна, поэтому вставьте в конец
файла stdafx.h директиву #include <CommDlg.h>. Заодно добавьте туда еще
две строки:
#include <string>
using
namespace
std;
так как ниже
мы будем пользоваться объектами типа string из библиотеки STL. Затем в блок
switch (wmld) функции WndProc введите ветвь обработки команды меню ID_EDIT_COLOR
(саму команду создадим позже):
// Если выбрана команда с идентификатором ID_EDIT_COLOR
case
ID_EDIT_COLOR:
//
Подготовка структуры для обмена с диалогом
ZeroMemory(Sec,
sizeof(CHOOSECOLOR));
//======
Ее размер
cc.lStructSize = sizeof(CHOOSECOLOR);
//======
Адрес массива с любимыми цветами
cc.lpCustColors
= (LPDWORD)CustColors;
if
(ChooseColor (ice)) // Вызов диалога
{
//
Если нажата кнопка OK,
//
то запоминаем выбранный цвет
color
= cc.rgbResult;
//
Объявляем недействительной
//
клиентскую область окна
InvalidateRect(hWnd, NULL, TRUE);
}
break;
Функция ChooseColor
запускает диалог в модальном режиме. Это означает, что пользователь не может
управлять приложением, пока не завершит диалог. Тактика работы с диалогом такого
типа стандартна:
-
Подготовка данных, инициализирующих
поля диалога.
-
Запуск диалога, ожидание
его завершения и проверка результата.
-
В случае выхода по кнопке
ОК, выбор данных из полей вспомогательной структуры.
-
Использование результатов
диалога, например перерисовка окна с учетом нового цвета.
Функция InvalidateRect
сообщает системе, что часть окна стала недействительной, то есть требует перерисовки.
В ответ на это система посылает приложению сообщение WM_PAINT. Наша оконная
процедура уже реагирует на это сообщение, но пока еще не рисует. Теперь создадим
команду меню, при выборе которой диалог должен появится на экране. Для этого:
-
Перейдите в окно Resource
View.
-
Раскройте узел дерева
ресурсов под именем Menu.
-
Выполните двойной щелчок
на идентификаторе всей планки меню IDC_API.
-
В окне редактора меню
переведите фокус ввода в окно
на планке меню
с надписью Type here (Внимание,
там два таких окна!).
-
Введите имя меню Edit
и переведите курсор вниз в пустое поле для команды.
-
Введите имя команды меню
Color.
-
Откройте окно Properties
и убедитесь, что команда получила идентификатор ID_EDIT_COLOR.
- Перетащите мышью меню Edit на одну позицию влево.
Запустите приложение (Ctrl+F5) и опробуйте команду меню Edit > Color. Диалог имеет две страницы. Для того чтобы убедиться в правильном функционировании статического массива любимых цветов (custColors), раскройте вторую страницу, выберите несколько цветов в ее правой части, нажимая кнопку Add to Custom Colors. Обратите внимание на то, что выбранные цвета попадают в ячейки левой части диалога. Закройте и вновь откройте диалог. Новые цвета должны остаться на месте, так как они сохранились в массиве CustColors.