- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
10.2. Подключение и инициализация общих элементов управления
Для использования общих элементов управления в Вашей программе необходимо подключить стандартный файл определений Commctrl.h. Кроме того, при компоновке программы нужно подключить библиотеку общих элементов управления Сomctl32.lib.
Прежде чем использовать любой из этих элементов, приложение должно вызвать функцию InitCommonControls(), которая загружает динамическую библиотеку общих элементов управления (DLL) и инициализирует их подсистему. Прототип этой функции имеет следующий вид:
Void InitCommonControls(void);
Наилучшее место для вызова функции InitCommonControls() – непосредственно после регистрации класса главного окна в функции WinMain().
Необходимо отметить одно важное свойство общих элементов управления: все они являются порожденными окнами. Они могут быть созданы одним из трех способов: с помощью вызова функций CreateWindow() или CreateWindowEx(), либо при помощи специальной функции API, создающей соответствующий элемент управления. (Функция CreateWindowEx() позволяет задать расширенный стиль для создаваемого окна.) Поскольку общие элементы управления являются окнами, они ведут себя и управляются преимущественно так же, как все остальные окна, создаваемые программой.
Большинство общих элементов управления при воздействии на них посылают программе сообщение WM_COMMAND либо WM_NOTIFY. Многими из них можно управлять программно, направляя им сообщения с помощью функции API SendMessage(), имеющей следующий прототип:
LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam);
Здесь hwnd представляет дескриптор элемента управления, Msg – это сообщение, которое Вы хотите ему направить, a wParam и lParam – параметры этого сообщения. Функция возвращает ответ элемента управления (если ответ требуется).
10.3. Работа с панелью инструментов
Вероятно, самым распространенным общим элементом управления является панель инструментов (toolbar), которая представляет собой не что иное, как графическое меню (возможно, с некоторыми дополнительными свойствами). Команды меню в панели инструментов представляются в виде небольших изображений, имеющих форму кнопок. Часто такая панель может использоваться вместе с обычным меню. Таким образом, панель инструментов представляет собой альтернативный способ выбора команд меню.
Для создания панели инструментов используется функция CreateToolbarEx():
HWND CreateToolbarEx(HWND hwnd, DWORD dwStyle,
WORD ID, int NumButtons,
HINSTANCE hInst, WORD BPID,
LPCTBBUTTON Buttons,
int NumButtons, int ButtonWidth,
int ButtonHeight, int BMPWidth,
int BMPHeight, UINT Size);
Здесь параметр hwnd задает дескриптор родительского окна панели инструментов. Стиль окна панели инструментов задается параметром dwStyle. Кроме стиля WS_CHILD, он может включать и другие стандартные стили, такие как WS_BORDER или WS_VISIBLE.
Имеются еще два стиля, задаваемых для панели инструментов, которые могут Вас заинтересовать. Один из них, с именем TBSTYLE_TOOLTIPS, позволяет использовать подсказки панели инструментов – tooltips (они будут рассмотрены ниже). Другой специфичный для панели инструментов стиль, называемый TBSTYLE_WRAPABLE, обеспечивает возможность отображения длинных панелей инструментов (с большим количеством кнопок) в несколько строк.
Параметр ID задает идентификатор панели инструментов. Количество кнопок в панели инструментов задается параметром NumButtons. Параметр hInst передает дескриптор текущего экземпляра приложения. Идентификатор ресурса растрового изображения, из которого формируются изображения кнопок, передается в параметре BPID.
Информация о каждой кнопке передается в массиве структур типа TBBUTTON, указатель на который должен содержаться в параметре Buttons. Параметр NumButtons задает количество кнопок в панели инструментов. Ширина и высота кнопок определяется параметрами ButtonWidth и ButtonHeight. Если ButtonWidth и ButtonHeight имеют нулевые значения, размеры кнопок подбираются автоматически исходя из размеров изображения на них. Размер структуры TBUTTON передается в параметре Size. Функция возвращает дескриптор окна панели инструментов.
Каждая кнопка панели инструментов должна иметь связанную с ней структуру типа TBBUTTON, которая задает различные характеристики кнопки и определяется следующим образом:
typedef struct _TBBUTTON
{
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
DWORD dwData;
int iString;
}
TBBUTTON;
Поле iBitmap определяет индекс изображения, связанного с кнопкой (этот индекс, в свою очередь, определяет смещение в исходном ресурсе растра, начиная с которого рисуется изображение в кнопке). Индексы начинаются с 0.
Поле idCommand определяет команду, ассоциированную с кнопкой. При нажатии кнопки родительское окно получает сообщение WM_COMMAND. В младшем слове параметра wParam этого сообщения содержится значение idCommand.
Начальное состояние кнопки определяется значением поля fsState. Этот параметр может принимать одно из следующих значений (или комбинацией значений), перечисленных в таблице 10.2.
Таблица 10.2
