Создание checkbox`a

Checkbox с точки зрения программирования является кнопкой. Это означает, что мы должны создавать его как и любую кнопку используя функцию CreateWindows. В качестве стиля надо указать BS_AUTOCHECKBOX (в этом случае галочка в checkbox’е будет автоматически ставиться/убираться) или BS_CHECKBOX (в этом случае галочка сама ставиться не будет – и это будет задача программиста).

Для создания checkbox`a используется функция:

1
2
3
4
5
6
7
8
9
10
11
12
13
CreateWindow(
      "button",
      "Press me",
      WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
      10,
      10,
      80,
      30,
      hwnd,
      (HMENU)10001,
      hInstance,
      NULL
);

Принцип тут такой же, как и при создании обычной кнопки. Обратите внимание на стиль для checkbox’а, задаваемый в третьем параметре.

Теперь о том, как обрабатывать щелчок по checkbox’у.

Для примера напишем код, который будет показывать текущее состояние checkbox’а в заголовке главного окна. Вот что вы должны добавить в switch оконной процедуры:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.

Результат выполнения программы будет таким:

  1. Дмитрий

    Хороший материал.
    Продолжайте писать статьи!

  2. очень полезная информация на сайте!
    продолжайте писать статьи! очень помогают! :idea:
    :wink:

  3. Спасибо, помогли :)

  4. А статья справедлива для VC++13? А то оконная процедура не хочет ничего обрабатывать.

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>