Membuat Checkbox dan Radio Button dalam Group Box

Dalam pemrograman dengan windows.h semua bagian window adalah window. Setiap window bisa punya parent dan child. Sebelumnya, parent yang saya gunakan adalah window utama, kali ini, saya akan menggunakan Group box sebagai parent untuk mengelompokkan Check Box dan Radio Button. Untuk membuat Group Box, Check, dan Radio Button; caranya sama dengan pembuatan button yaitu dengan CreateWindow atau CreateWindowEx. Nama class yang digunakan adalah "Button". Bedanya ada pada parameter stylenya.

Untuk membuat checkbox, gunakan BS_CHECKBOX atau BS_AUTOCHECKBOX. Untuk membuat radio button, gunakan BS_RADIOBUTTON atau BS_AUTORADIOBUTTON. BS_AUTOCHECKBOX dan BS_AUTORADIOBUTTON akan mengubah statenya secara otomatis karena pengelompokkannya adalah sesuai dengan parentnya. Sedangkan BS_AUTOCHECKBOX dan BS_AUTORADIOBUTTON perlu kita ubah statenya secara manual dengan SendMessage. Contoh kode programnya bisa dilihat di bawah ini.

#include <windows.h>
#include <string.h>

#define nkolom 4
#define nbaris 5

HWND grup, cxbx, bradio;
char stombol[24][5]={"AC", "C", "<=", "+", "1", "2", "3", "-", "4", "5", "6", "x", "7", "8", "9", "/", "+/-", ",", "0", "="};

LRESULT CALLBACK wndproc(
  HWND hwnd,
  UINT pesan,
  WPARAM wParam,
  LPARAM lParam
);


int __stdcall WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdl, int cmds){
HWND wind;
MSG msg;
WNDCLASS wcls={0};
    wcls.hInstance=hinst;
    wcls.hbrBackground=GetSysColorBrush(COLOR_3DFACE);
    wcls.lpszClassName=TEXT("windowku");
    wcls.lpfnWndProc=wndproc;
    wcls.hCursor=LoadCursor(0,IDC_ARROW);

    RegisterClass(&wcls);

    wind=CreateWindowEx(0, TEXT("windowku"), "Programku", WS_VISIBLE | WS_OVERLAPPEDWINDOW , 400, 200, 198, 300, 0, 0, hinst, 0);
    grup=CreateWindowEx(0, TEXT("BUTTON"), "Coba", WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON | BS_GROUPBOX, 4, 4, 170, 180, wind, 0, hinst, 0);
  
    //radio Button
    CreateWindowEx(0, TEXT("BUTTON"), "Coba", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON , 4, 30, 150, 20, grup, (HMENU)200, hinst, 0);
    CreateWindowEx(0, TEXT("BUTTON"), "Coba", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON , 4, 60, 150, 20, grup, (HMENU)201, hinst, 0);

    //Check Box
    CreateWindowEx(0, TEXT("BUTTON"), "Check Box 1", WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, 4, 92, 150, 20, grup, (HMENU)202, hinst, 0);
    CreateWindowEx(0, TEXT("BUTTON"), "Check Box 2", WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, 4, 122, 150, 20, grup, (HMENU)203, hinst, 0);

    //Auto 3 state
    CreateWindowEx(0, TEXT("BUTTON"), "Auto3state", WS_VISIBLE | WS_CHILD | BS_AUTO3STATE, 4, 154, 150, 20, grup, (HMENU)203, hinst, 0);

    //
    bradio=CreateWindowEx(0, TEXT("BUTTON"), "Coba", WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON, 4, 204, 150, 20, wind, (HMENU)204, hinst, 0);
    cxbx=CreateWindowEx(0, TEXT("BUTTON"), "Coba", WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 4, 236, 150, 20, wind, (HMENU)205, hinst, 0);

    while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK wndproc(HWND hwnd, UINT pesan, WPARAM wParam, LPARAM lParam){
int x;
    switch(pesan){
        case WM_COMMAND:
            x=LOWORD(wParam);
            if(x==204){
                x=SendMessage(bradio, BM_GETCHECK, 0, 0);
                if(x==BST_CHECKED){
                    SendMessage(bradio, BM_SETCHECK, BST_UNCHECKED, 0);
                }else if(x==BST_UNCHECKED)SendMessage(bradio, BM_SETCHECK, BST_CHECKED, 0);
            }else if(x==205){
                x=SendMessage(cxbx, BM_GETCHECK, 0, 0);
                if(x==BST_CHECKED){
                    SendMessage(cxbx, BM_SETCHECK, BST_UNCHECKED, 0);
                }else if(x==BST_UNCHECKED)SendMessage(cxbx, BM_SETCHECK, BST_CHECKED, 0);
            }
            break;
        case WM_CLOSE:
            PostQuitMessage(0);
            break;

    }

    return DefWindowProc(hwnd, pesan, wParam, lParam);
}

 


Pada contoh di atas, beberapa radio button dan checkbox (selain dua yang paling bawah) dikelompokkan dalam satu group box sebagai parentnya. Diantara check box yang ada, ada satu checkbox khusus yang punya 3 state. Pada contoh di atas, "SendMessage(cxbx, BM_GETCHECK, 0, 0)" digunakan untuk mendapatkan state atau keadaan dari checkbox dan radio button. State dari checkbox dan radio button bisa diubah dengan SendMessage yang menggunakan BM_SETCHECK