- •Уп. 2. Органы управления в приложениях Win32
- •2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •2.2. Статический орган управления
- •2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •2.3.6. Пример обработки сообщений от полос прокрутки
- •2.3.7. Новые функции управления полосами прокрутки
- •2.3.8. Пример окна приложения с полосой просмотра
- •2.4. Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •2.4.4. Пример работы с однострочным редактором
- •2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •2.5.4. Пример работы со списком
- •2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •2.6.4. Пример работы с комбинированным списком
- •Контрольные вопросы
- •Упражнения
- •Приложение 2
2.1. Кнопки
2.1.1. Создание кнопок
Для создания кнопки можно вызвать уже знакомую вам функцию CreateWindow. Вспомним синтаксис этой функции:
HWND CreateWindow(
LPCTSTR lpClassName, //Указатель на имя класса
LPCTSTR lpWindowName, //Указатель на имя окна
DWORD dwStyle, //Стиль окна
int x, //Координата левого края окна
int У, //Координата верхнего края окна
int nWidth, //Ширина окна
int nHeight, //Высота окна
HWND hWndParent, //Дескриптор окна-родителя или
//окна-владельца
HMENU hMenu, //Дескриптор меню или идентифи-
//катор дочернего окна
HANDLE hInstance, //Дескриптор экземпляра приложения
LPVOID lpParam //Указатель на данные окна
);
Вызов функции CreateWindow для создания кнопки обладает следующими особенностями.
В качестве lpClassName указывают имя класса "button".
Аргумент lpWindowName определяет строку, которая будет написана на кнопке.
Аргумент dwStyle задает стиль кнопки. Его значение задают комбинацией константы WS_CHILD, константы с префиксом BS_ (табл. 2.2) и, почти всегда, константы WS_VISIBLE. Можно указывать только одну константу из табл. 2.2. Исключением являются константы BS_LEFTTEXT и BS_RIGHTBUTTON. Эти константы используют совместно с другими константами табл. 2.2 при создании флажков и переключателей с текстом, расположенным слева от квадратика флажка или кружка переключателя.
Значение hWndParent определяет родительское окно, в рабочей области которого создается кнопка. Дескриптор окна-родителя указывают обязательно.
Значение hMenu должно быть равно идентификатору кнопки.
Для органов управления в качестве lpParam указывают NULL.
Алгоритм создания кнопки:
Описать идентификатор кнопки. Например, это можно сделать так:
#define ID_BUTTON 3000
С помощью этого идентификатора функция окна-родителя будет "узнавать" кнопку. В описании идентификатора можно использовать произвольное целочисленное значение.
Описать дескриптор дочернего окна для кнопки. Например, в теле функции родительского окна это можно сделать следующим образом:
static HWND hButton;
Создать кнопку. Например, следующий оператор в левом верхнем углу рабочей области окна создает обычную кнопку с черной рамкой шириной в 200 и высотой в 20 пикселей с текстом "Пример кнопки":
hButton = CreateWindow("button", "Пример кнопки",
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
0, 0, 200, 20, hwnd, (НМENU)ID_BUTTON, hInstance, NULL);
Листинг 2.1 приложения демонстрирует реализацию данного алгоритма.
Листинг 2.1. Пример создания кнопки.
#include <windows.h>
#define ID_BUTTON 3000
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
TCHAR szClassName[] = TEXT("Example21");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hwnd;
hInstance = hInst;
if(!RegClass(WndProc, szClassName, COLOR_WINDOW)) return FALSE;
hwnd = CreateWindow(szClassName,
TEXT("Приложение с кнопкой"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0,
hInstance,
NULL);
if (!hwnd) return FALSE;
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
UpdateWindow(hwnd);
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground + 1);
wc.lpszMenuName = (LPCTSTR)NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc) != 0);
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hButton;
switch (msg)
{
case WM_CREATE:
{
hButton = CreateWindow( TEXT("button"),
TEXT("Пример кнопки"),
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
0, 0, 200, 20,
hwnd,
(HMENU)ID_BUTTON,
hInstance,
NULL );
return 0;
}
case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Функция родительского окна будет получать от кнопки hButton сообщения с кодом WM_COMMAND. Этим сообщением кнопка информирует родительское окно о том, что с ней что-то сделали. Но описание функции окна-родителя пока не содержит обработку сообщения WM_COMMAND.
