Windows API Урок 20. Работа с checkbox'ом
Checkbox с точки зрения программирования является кнопкой. Это означает, что мы должны создавать его как и любую кнопку используя функцию CreateWindows. В качестве стиля надо указать BS_AUTOCHECKBOX (в этом случае галочка в checkbox'е будет автоматически ставиться/убираться) или BS_CHECKBOX (в этом случае галочка сама ставиться не будет - и это будет задача программиста).
Вот так можно создать checkbox (это пишем в функции WinMain, после вызова CreateWindow для главного окна):
CreateWindow("button", "Press me", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
10, 10, 80, 30, hwnd, (HMENU)10001, hInstance, NULL);
Принцип тут такой же, как и при создании обычной кнопки (см. урок 18). Обратите внимание на стиль для checkbox'а, задаваемый в третьем параметре.
Теперь о том, как обрабатывать щелчок по checkbox'у.
Для примера напишем код, который будет показывать текущее состояние checkbox'а в заголовке главного окна. Вот что вы должны добавить в switch оконной процедуры:
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
switch (Message){
case WM_COMMAND:
// Если мы нажали на checkbox'е.
if(LOWORD(wparam)==10001)
{
// Получаем HWND нашего chechbox'а.
HWND hwndCheck = GetDlgItem(hwnd, 10001);
// Выясняем текущее состояние chechbox'а.
LRESULT res = SendMessage (hwndCheck, BM_GETCHECK, 0, 0);
// Если галочка стоит.
if(res == BST_CHECKED)
{
SetWindowText(hwnd, "Checked");
}
// Если галочка не стоит.
if(res == BST_UNCHECKED)
{
SetWindowText(hwnd, "Unchecked");
}
}
...
Как вы видите, для выяснения состояния checkbox'а мы посылаем ему сообщение BM_GETCHECK посредством вызова функции SendMessage, которая и возвращает в качестве значения одну из констант BST_CHECKED или BST_UNCHECKED (на самом деле есть еще одно значение: BST_INDETERMINATE - для неопределенного значения состояния checkbox'а). Функция SendMessage требует в качестве первого параметра HWND окна, которому посылаем сообщение (в нашем случае это окно - это сам checkbox). HWND для нашего checkbox'а мы выясняем путем вызова функции GetDlgItem, первый параметр которой - HWND родительского окна для элемента управления, а второй - идентификатор элемента управление (тот самый, который мы задали при создании элемента управления в вызове функции CreateWindow).
После выяснения состояния checkbox'а мы меняем заголовок главного окна путем вызова функции SetWindowText.
Результат выполнения программы будет таким:
|