Развитие начальной заготовки
Мы хотим показать способы развития начальной заготовки приложения Win32. В наши планы входит создание пера Windows и управление его стилями. Кроме того, мы хотим показать, как можно изменять цвет пера с помощью стандартного диалога Windows. Существует множество стандартных диалогов для управления разными объектами системы, например открытие файла, выбор шрифта, поиск и замена текста. Мы будем управлять стандартным диалогом по выбору цвета. Обычным приемом при работе с каким-либо из стандартных диалогов является использование подходящей вспомогательной структуры. Поля структуры помогают инициализировать элементы диалога при его открытии, а также извлечь результат после его завершения.
В нашем случае диалог вызывается функцией 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.