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