BG MVC Model View Controller eğitim serisi yayında...

Ana page > Programlama > Windows API Programlama > RadioButton ve GroupBox

RadioButton ve GroupBox

► Kontroller

Radio Button kontrolü, BUTTON kontrolü altında tanımlanan bir kontroldür. Radio Button, yuvarlak bir buton ve program içinde tanımlanan bir metin veya küçük bir resimden (icon veya bitmap) oluşur. Radio Button kontrolleri genellikle Group Box kontrolü içinde ve kullanıcının içlerinden bir tanesini seçebileceği bir seri değeri temsil etmek üzere kullanılır.

Radio Button kontrolü, CreateWindowEx() fonksiyonunun lpClassName parametresi içinde BUTTON veya WC_BUTTON değeri ile tanımlanan bir kontroldür.

BUTTON değerini kullanırsanız programın başında windows.h başlık dosyasını dahil etmeniz yeterlidir, ancak WC_BUTTON değerini kullanırsanız commctrl.h başlık dosyasını dahil etmeniz gerekir.

Bir Radio Button kontrolü, CreateWindowEx() fonksiyonunun dwStyle parametresi içinde tanımlanan, aşağıdaki 2 tipten birine sahiptir:

BS_RADIOBUTTON : Standart tip

BS_AUTORADIOBUTTON : Otomatik tip

Her tipin işaretlenmiş (yuvarlak buton içinde bir nokta işareti) ve işaretsiz (içi noktasız yuvarlak buton) olmak üzere 2 konumu vardır.

Kullanıcı bir Radio Button'a tıkladığında klavye kontrolü Radio Button'a geçer. Sistem ana pencereye BN_CLICKED bildirim kodu içeren bir WM_COMMAND mesajı gönderir. Eğer bu mesaj otomatik bir Radio Button'dan gelirse, sistem bu tipler için check konumunu ayarlayacağından, ana pencerenin bu mesaja işlem yapması gerekmez. Eğer mesaj standart bir Radio Button'tan gelirse, ana pencerenin bu mesaja işlem yapması gerekir. Radio Button tipini dikkate almadan, sistem, konumu değiştiğinde, Radio Button penceresini yeniden boyar.

Radio Button kontrolleri gruplar içinde düzenlenir. Grup içinde yer alan Radio Buton'lardan sadece bir tanesi aynı anda check edilmiş olabilir. Eğer herhangi bir Rado Button kontrolü için WS_GROUP değeri kullanılırsa, o buton gruptaki ilk buton olarak yerini alır. Bu butonu takip eden diğer butonlar (eğer WS_GROUP değerine sahip değillerse) ise aynı grubun diğer elemanlarını oluştururlar. Eğer hiç bir Radio Button WS_GROUP değerine sahip değilse, bütün Radio Button'lar tek bir grup olarak değerlendirilir.

Group Box kontrolü, BUTTON kontrolü altında tanımlanan bir kontroldür. Group Box, dikdörtgen şeklinde, sol üst köşesinde program tarafından verilmiş bir metin değeri bulunan ve içinde Check Box ve Radio Button gibi kontroller bulunduran bir kontroldür. Group Box kontrolünün tek amacı ortak amaçlı kullanılan kontrolleri tek bir isim altında düzenlemektir. Group Box kontrolünün tek tipi BS_GROUPBOX sabiti ile tanımlanan tiptir. Group Box fare veya klavye ile seçilemeyeceğinden, üzerinde herhangi bir işlem yapılamaz.

Şimdi, programımıza BUTTON kontrol yoluyla Group Box ve Radio Button kontrolleri eklemeye çalışalım.

Aşağıdaki 5 satır programın başına global değerler olarak eklenir:


#define IDC_RADIOBUTTON01 341 /* Radio Button için tanımlayıcı makro bildirimi */
#define IDC_RADIOBUTTON02 342 /* Radio Button için tanımlayıcı makro bildirimi */
#define IDC_RADIOBUTTON03 343 /* Radio Button için tanımlayıcı makro bildirimi */
#define IDC_GROUPBOX01 361    /* Group Box için tanımlayıcı makro bildirimi */
/* Radio Button ve Group Box kontrolleri için pencere Handle değeri bildirimi */
HWND hwndRadioButton01, hwndRadioButton02, hwndRadioButton03, hwndGroupBox01;

WindowProcedure() fonksiyonu içinde renkli olarak gösterilen satırlar ile her biri ayrı tipte bir Group Box kontrolü ve bu kontrol içinde 3 adet Radio Button kontrolü oluşturulur. WM_COMMAND mesajına işlem yapılarak Radio Button kontrolleri ile ilgili işlemler belirlenir:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  { 
    case WM_CREATE:

         hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 300, 20,
                                hwnd, (HMENU) IDC_STATIC01, NULL, NULL);
	
         hwndGroupBox01 = CreateWindowEx(0, "BUTTON", "Group Box Kontrolü",
                             WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 20, 50, 250, 110,
                             hwnd, (HMENU) IDC_GROUPBOX01, NULL, NULL);

         hwndRadioButton01 = CreateWindowEx(0, "BUTTON", "İlk Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON | WS_GROUP, 
                             30, 75, 200, 20, hwnd, (HMENU) IDC_RADIOBUTTON01, NULL, NULL);

         hwndRadioButton02 = CreateWindowEx(0, "BUTTON", "İkinci Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 30, 100, 200, 20,
                             hwnd, (HMENU) IDC_RADIOBUTTON02, NULL, NULL);
							 
         hwndRadioButton03 = CreateWindowEx(0, "BUTTON", "Üçüncü Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 30, 125, 200, 20,
                             hwnd, (HMENU) IDC_RADIOBUTTON03, NULL, NULL);

         CheckRadioButton(hwnd, IDC_RADIOBUTTON01, IDC_RADIOBUTTON03, IDC_RADIOBUTTON01);
         SetWindowText(hwndStatic01, "Group Box ilk seçenek aktif");

         break;		 

    case WM_COMMAND:
	
         if (HIWORD(wParam) == BN_CLICKED) {
             CheckRadioButton(hwnd, IDC_RADIOBUTTON01, IDC_RADIOBUTTON03, LOWORD(wParam));
             switch (LOWORD(wParam)) {
                 case IDC_RADIOBUTTON01:
                     SetWindowText(hwndStatic01, "Group Box ilk seçenek aktif");
                     break;
                 case IDC_RADIOBUTTON02:
                     SetWindowText(hwndStatic01, "Group Box ikinci seçenek aktif");
                     break;
                 case IDC_RADIOBUTTON03:
                     SetWindowText(hwndStatic01, "Group Box üçüncü seçenek aktif");
                     break;
             }
         }          
	  
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

Group Box ve Radio Button kontrol pencereleri oluşturulurken, CreateWindowEx() fonksiyonunun lpClassName parametresi için sistemdeki ön tanımlı değerlerden biri olan BUTTON değeri, dwStyle parametresinde ise Group Box için BS_GROUPBOX ve Radio Button için BS_RADIOBUTTON değeri kullanılır.

Program çalıştığında:

  • Program penceresi oluşturulur oluşturulmaz WM_CREATE mesajı mesaj işlem fonksiyonuna gönderilir. switch yapısının bu seçeneği altında CreateWindowEx() fonksiyonu ile bir adet Static kontrol, bir adet Group Box ve içinde 3 adet Radio Button kontrolü oluşturulur. CheckRadioButton() fonksiyonu ile ilk Radio Group seçeneği aktif hale getirilir ve SetWindowText() fonksiyonu ile bu durum Statik kontrol penceresine yazılır.
  • Kontroller tarafından ana pencereye gönderilen bildirim mesajlarına işlem yapmak üzere ana pencere mesaj işlem fonksiyonu içinde oluşturulan WM_COMMAND seçeneği altında BN_CLICKED bildirim mesajı geldiğinde, kullanıcının Radio Button kontrolleri üzerine yaptığı tıklamaların karşılığı olan gerekli işlemler CheckRadioButton() ve SetWindowText() fonksiyonları kullanılarak yapılır:
    • Önce, CheckRadioButton() fonksiyonu yoluyla tıklanan Radio Button kontrolü aktif hale getirilir. Bu fonksiyon, diğer tüm Radio Button seçeneklerine BM_SETCHECK mesajı gönderdiğinden, diğer seçeneklerin aktif konumu iptal edilir (uncheck).
    • SetWindowText() fonksiyonu ile bu durum Statik kontrol penceresine yazılır.
  • Eğer, programda BS_RADIOBUTTON seçeneği kullanılsaydı, Radio Button durumlarının, sistem seçenek değişikliğini otomatik olarak yaptığından, WM_COMMAND seçeneği altında program tarafından değiştirilmesine gerek kalmayacaktı.

Programın çalışan en son hali aşağıdadır:


#include <windows.h>

#define IDC_STATIC01 101
#define IDC_RADIOBUTTON01 341
#define IDC_RADIOBUTTON02 342
#define IDC_RADIOBUTTON03 343
#define IDC_GROUPBOX01 361

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;

HWND hwndStatic01;
HWND hwndRadioButton01, hwndRadioButton02, hwndRadioButton03, hwndGroupBox01;

int WINAPI WinMain (HINSTANCE hThisInstance, 
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
  HWND hwndMain;         
  MSG messages;      
  WNDCLASSEX wincl;

  ghInst = hThisInstance;  

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_DBLCLKS;           
  wincl.cbSize = sizeof (WNDCLASSEX);

  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = NULL; 
  wincl.cbClsExtra = 0; 
  wincl.cbWndExtra = 0; 
  wincl.hbrBackground = GetSysColorBrush(COLOR_3DFACE);

  if (!RegisterClassEx (&wincl)) return 0;

  hwndMain = CreateWindowEx (0, szClassName, "WinAPI Temel Program", WS_OVERLAPPEDWINDOW, 
                         CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, 
                         hThisInstance, NULL);

  if (!hwndMain) return 0;

  ShowWindow (hwndMain, nCmdShow);
  UpdateWindow(hwndMain);
  
  while (GetMessage (&messages, NULL, 0, 0) > 0) {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }	
	
  return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  { 
    case WM_CREATE:

         hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 300, 20,
                                hwnd, (HMENU) IDC_STATIC01, NULL, NULL);
	
         hwndGroupBox01 = CreateWindowEx(0, "BUTTON", "Group Box Kontrolü",
                             WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 20, 50, 250, 110,
                             hwnd, (HMENU) IDC_GROUPBOX01, NULL, NULL);

         hwndRadioButton01 = CreateWindowEx(0, "BUTTON", "İlk Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON | WS_GROUP, 
                             30, 75, 200, 20, hwnd, (HMENU) IDC_RADIOBUTTON01, NULL, NULL);

         hwndRadioButton02 = CreateWindowEx(0, "BUTTON", "İkinci Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 30, 100, 200, 20,
                             hwnd, (HMENU) IDC_RADIOBUTTON02, NULL, NULL);
							 
         hwndRadioButton03 = CreateWindowEx(0, "BUTTON", "Üçüncü Radio Button",
                             WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 30, 125, 200, 20,
                             hwnd, (HMENU) IDC_RADIOBUTTON03, NULL, NULL);

         CheckRadioButton(hwnd, IDC_RADIOBUTTON01, IDC_RADIOBUTTON03, IDC_RADIOBUTTON01);
         SetWindowText(hwndStatic01, "Group Box ilk seçenek aktif");

         break;

    case WM_COMMAND:
	
         if (HIWORD(wParam) == BN_CLICKED) {
             CheckRadioButton(hwnd, IDC_RADIOBUTTON01, IDC_RADIOBUTTON03, LOWORD(wParam));
             switch (LOWORD(wParam)) {
                 case IDC_RADIOBUTTON01:
                     SetWindowText(hwndStatic01, "Group Box ilk seçenek aktif");
                     break;
                 case IDC_RADIOBUTTON02:
                     SetWindowText(hwndStatic01, "Group Box ikinci seçenek aktif");
                     break;
                 case IDC_RADIOBUTTON03:
                     SetWindowText(hwndStatic01, "Group Box üçüncü seçenek aktif");
                     break;
             }
         }          
	  
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

Program çalıştığında karşınıza gelecek ekran görüntüsü aşağıdadır: