Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП02_Органы управления.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
576 Кб
Скачать

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 для создания кнопки обладает следующими особенностями.

  1. В качестве lpClassName указывают имя класса "button".

  2. Аргумент lpWindowName определяет строку, которая будет написана на кнопке.

  3. Аргумент dwStyle задает стиль кнопки. Его значение задают комбинацией константы WS_CHILD, константы с префиксом BS_ (табл. 2.2) и, почти всегда, константы WS_VISIBLE. Можно указывать только одну константу из табл. 2.2. Исключением являются константы BS_LEFTTEXT и BS_RIGHTBUTTON. Эти константы используют совместно с другими константами табл. 2.2 при создании флажков и переключателей с текстом, расположенным слева от квадратика флажка или кружка переключателя.

  4. Значение hWndParent определяет родительское окно, в рабочей области которого создается кнопка. Дескриптор окна-родителя указывают обязательно.

  5. Значение hMenu должно быть равно идентификатору кнопки.

  6. Для органов управления в качестве lpParam указывают NULL.

Алгоритм создания кнопки:

  1. Описать идентификатор кнопки. Например, это можно сделать так:

#define ID_BUTTON 3000

  1. С помощью этого идентификатора функция окна-родителя будет "узнавать" кнопку. В описании идентификатора можно использовать произвольное целочисленное значение.

  2. Описать дескриптор дочернего окна для кнопки. Например, в теле функции родительского окна это можно сделать следующим образом:

static HWND hButton;

  1. Создать кнопку. Например, следующий оператор в левом верхнем углу рабочей области окна создает обычную кнопку с черной рамкой шириной в 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.