Windows API

Combo Box Kontrolü

► Kontroller

Combo Box, kullanıcının içinden bir seçeneği seçebileceği, bir Edit kontrolü ve bir List Box kontrolünün özelliklerini birleştiren bir kontrol penceresidir.

Combo Box kontrolü, CreateWindowEx() fonksiyonunun lpClassName parametresi içinde COMBOBOX veya WC_COMBOBOX değeri ile tanımlanan bir kontroldür.

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

Şimdi, programımıza COMBOBOX kontrolleri eklemeye çalışalım.

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

/* Combo Box kontrolleri için tanımlayıcı makro bildirimleri */
#define IDC_COMBOBOX01 501 
#define IDC_COMBOBOX02 502
#define IDC_COMBOBOX03 503

/* Combo Box kontrolü için pencere Handle değeri bildirimi */
HWND hwndComboBox01, hwndComboBox02, hwndComboBox03;

/* İsim değerleri için char dizi bildirimi */
char isim[][20] = 
{ 
  "Ahmet", "Mehmet", "Yasemin", "Faruk", "Necip", "Ayşe", " "
};

WindowProcedure() fonksiyonu içinde renkli olarak gösterilen satırlar ile bir Combo Box kontrolü oluşturulur. WM_COMMAND mesajına işlem yapılarak Combo Box kontrolü ile ilgili işlemler belirlenir:

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  int id1;
  char cdizi[20];
  
  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);
	
         hwndComboBox01 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_SIMPLE, 20, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX01, NULL, NULL);
							 
         hwndComboBox02 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 200, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX02, NULL, NULL);

         hwndComboBox03 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 380, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX03, NULL, NULL);

         for (id1=0; strcmp (isim[id1], " "); id1++) {
              SendMessage(hwndComboBox01, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
              SendMessage(hwndComboBox02, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
              SendMessage(hwndComboBox03, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
         }
		 
         SendMessage(hwndComboBox01, CB_SETCURSEL, 0, 0);
         SendMessage(hwndComboBox02, CB_SETCURSEL, 0, 0);
         SendMessage(hwndComboBox03, CB_SETCURSEL, 0, 0);
		 
         break;

    case WM_COMMAND:
	   
         if (HIWORD(wParam) == CBN_SELCHANGE) {
             SendMessage((HWND)lParam, CB_GETLBTEXT, SendMessage((HWND) lParam,
                         CB_GETCURSEL, 0, 0), (LPARAM) cdizi);
             SetWindowText(hwndStatic01, cdizi);
         }          
	  
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

Programda, aşağıda özellikleri açıklanan 3 farklı tipte Combo Box oluşturulur:

CBS_SIMPLE : Liste içinde yer alan elemanları daima ekranda gösterir. Seçili olan elemanı ise bir Edit kontrolü içinde gösterir.

CBS_DROPDOWN : Liste içinde yer alan elemanları düğmeye tıklandığında ekranda gösterir. Seçili olan elemanı ise bir Edit kontrolü içinde gösterir.

CBS_DROPDOWNLIST : Liste içinde yer alan elemanları düğmeye tıklandığında ekranda gösterir. Seçili olan elemanı ise bir Statik kontrol içinde gösterir.

Combo Box kontrol penceresi oluşturulurken, CreateWindowEx() fonksiyonunun lpClassName parametresi için sistemdeki ön tanımlı değerlerden biri olan COMBOBOX değeri, dwStyle parametresinde ise sırasıyla CBS_SIMPLE, CBS_DROPDOWN, CBS_DROPDOWNLIST değerleri 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 ve 3 farklı tipte Combo Box kontrolü oluşturulur.
  • Tüm Combo Box pencerelerine bir for döngüsü içinde CB_ADDSTRING mesajı sıra ile gönderilerek, isim adlı char dizi içindeki değerler Combo Box kontrollerine aktarılır.
  • Combo Box pencerelerine bir CB_SETCURSEL mesajı gönderilerek, kontrol içindeki ilk elemanlar seçilir.
  • 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 CBN_SELCHANGE bildirim mesajı geldiğinde, kullanıcının Combo Box kontrolü üzerine yaptığı tıklamaların karşılığı olan gerekli işlemler yapılır:
    • Önce, Combo Box kontrol penceresine CB_GETCURSEL mesajı gönderilerek seçilen elemanın sıfırdan başlamak üzere indeks değeri alınır.
    • Elde edilen değer kullanılarak, Combo Box kontrol penceresine CB_GETLBTEXT mesajı gönderilerek seçilen elemanın metin değeri elde edilir.
    • Elde edilen değer SetWindowText() fonksiyonu ile Statik kontrol penceresine yazılır.

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

#include <windows.h>

#define IDC_STATIC01 101
#define IDC_COMBOBOX01 501
#define IDC_COMBOBOX02 502
#define IDC_COMBOBOX03 503

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

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

HWND hwndStatic01;
HWND hwndComboBox01, hwndComboBox02, hwndComboBox03;

char isim[][20] = 
{ 
  "Ahmet", "Mehmet", "Yasemin", "Faruk", "Necip", "Ayşe", " "
};

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)
{
  int id1;
  char cdizi[20];
  
  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);
	
         hwndComboBox01 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_SIMPLE, 20, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX01, NULL, NULL);
							 
         hwndComboBox02 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 200, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX02, NULL, NULL);

         hwndComboBox03 = CreateWindowEx(0, "COMBOBOX", NULL,
                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 380, 50, 120, 150,
                             hwnd, (HMENU) IDC_COMBOBOX03, NULL, NULL);

         for (id1=0; strcmp (isim[id1], " "); id1++) {
              SendMessage(hwndComboBox01, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
              SendMessage(hwndComboBox02, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
              SendMessage(hwndComboBox03, CB_ADDSTRING, 0, (LPARAM) isim[id1]);
         }
		 
         SendMessage(hwndComboBox01, CB_SETCURSEL, 0, 0);
         SendMessage(hwndComboBox02, CB_SETCURSEL, 0, 0);
         SendMessage(hwndComboBox03, CB_SETCURSEL, 0, 0);
		 
         break;

    case WM_COMMAND:
	   
         if (HIWORD(wParam) == CBN_SELCHANGE) {
             SendMessage((HWND)lParam, CB_GETLBTEXT, SendMessage((HWND) lParam,
                         CB_GETCURSEL, 0, 0), (LPARAM) cdizi);
             SetWindowText(hwndStatic01, cdizi);
         }          
	  
         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: