Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.1 Класс кнопок

Наше изучение класса окна button мы начнем с программы BTNLOOK "вид кнопки" (button look), в которой создается 10 дочерних окон управления в виде кнопок, по одному на каждый из 10 стандартных стилей кнопок.

При щелчке на любой из кнопок она посылает сообщение WM_COMMAND оконной процедуре родительского окна WndProc. WndProc программы BTNLOOK выводит на экран параметры wParam и lParam этого сообщения в правой половине рабочей области.

Кнопка со стилем BS_OWNERDRAW выводится в окне только в виде затенения фона, поскольку стиль этой кнопки рассчитан на то, что за рисование отвечает сама программа. Эта кнопка показывает, что ее необходимо рисовать при обработке сообщения WM_DRAWITEM с параметром lParam, являющимся указателем на структуру типа DRAWITEMSTRUCT. Эти сообщения также выводятся на экран в программе BTNLOOK.

8.1.1 Создание дочерних окон

В программе BTNLOOK определяется структура с именем button, в которой содержатся стили окон кнопок и строки текста для каждой из 10 типов кнопок. Все стили окон кнопок начинаются с префикса BS, что означает "button style" (стиль кнопки).

Десять дочерних окон в виде кнопок создаются в цикле for при обработке сообщения WM_CREATE в WndProc. При вызове функции CreateWindow используются следующие параметры:

Параметр "имя класса" — его предопределенное имя. При задании стиля окна используются стили WS_CHILD, WS_VISIBLE и один из десяти стилей кнопок (BS_PUSHBUTTON, BS_DEFPUSHBUTTON и т. д.), которые определены в структуре button. Параметр "текст окна" (который у обычного окна появляется в строке заголовка) — это текст, который будет выводиться вместе с каждой кнопкой. Здесь просто использовался текст, идентифицирующий стиль кнопки.

Параметры "положение по х" и "положение по у" показывают положение верхнего левого угла дочернего окна относительно верхнего левого угла рабочей области родительского окна. Параметры "ширина" и "высота" задают ширину и высоту каждого дочернего окна.

Параметр "идентификатор дочернего окна" должен быть для каждого окна уникальным. Этот идентификатор помогает оконной процедуре при обработке сообщений WM_COMMAND определить дочернее окно — источник сообщений. Обратите внимание, что идентификатор дочернего окна передается в функцию CreateWindow в виде параметра, который обычно используется для задания меню программы, поэтому его тип должен быть преобразован к HMENU.

Параметр "описатель экземпляра" функции CreateWindow выглядит несколько странно, но при этом во время обработки сообщения WM_CREATE параметр lParam фактически равен указателю на структуру типа CREATESTRUCT ("creation structure" — структура создания), членом которой является hInstance. Поэтому мы приводим тип параметра lParam к типу указатель на структуру CREATESTRUCT и извлекаем hInstance. (Некоторые программы для Windows используют глобальную переменную hInst для того, чтобы обеспечить доступ оконной процедуры к описателю экземпляра, который находится в WinMain. В WinMain перед созданием главного окна нужно просто написать:

hInst = hInstance;

В программе CHECKER в главе 6 мы использовали функцию GetWindowLong для получения описателя экземпляра:

GetWindowLong(hwnd, GWL_HINSTANCE)

Можно использовать любой из этих методов.)

После вызова функции CreateWindow нам больше ничего не нужно делать с этими дочерними окнами. Оконная процедура кнопки внутри Windows поддерживает эти кнопки и управляет всеми процессами перерисовки. (За исключением кнопки стиля BS_OWNERDRAW; как позже будет рассказано, этот стиль кнопки требует программы для рисования кнопки.) При завершении программы, когда удаляется родительское окно, Windows удаляет и дочерние окна.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]