Развитие
начальной заготовки
Мы хотим показать
способы развития начальной заготовки приложения 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.