Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
Windows API Programlama

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

Ana page > Programlama > Windows API Programlama > ListBox

ListBox

► Kontroller

List Box, kullanıcının içinden bir veya daha fazla seçeneği seçebileceği basit bir liste içeren bir kontrol penceresidir.

List Box elemanları karakter dizileri, bitmap resim veya her ikisi ile temsil edilir. List Box tüm elemanlarını gösterebilecek kadar yeterli genişlik veya yüksekliğe sahip değilse, otomatik olarak kayan çubuk eklenerek elemanların ekranda gösterilmesi sağlanır. Bir List Box elemanı seçildiğinde, font rengi ve arka plan rengi değişir. Kullanıcı, bir elemanı seçtiğinde veya seçimi iptal ettiğinde, List Box'ın içinde bulunduğu ana pencereye sistem bir bildirim mesajı yollar.

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

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

Şimdi, programımıza LISTBOX kontrolü eklemeye çalışalım.

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


#define IDC_LISTBOX01 401 /* List Box için tanımlayıcı makro bildirimi */

HWND hwndListBox01;/* List Box kontrolü için pencere Handle değeri bildirimi */

/* İ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 List Box kontrolü oluşturulur. WM_COMMAND mesajına işlem yapılarak List 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);
	
         hwndListBox01 = CreateWindowEx(0, "LISTBOX", NULL,
                             WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 20, 50, 200, 200,
                             hwnd, (HMENU) IDC_LISTBOX01, NULL, NULL);

         for (id1=0; strcmp (isim[id1], " "); id1++) {
              SendMessage(hwndListBox01, LB_ADDSTRING, 0, (LPARAM) isim[id1]);
         }

         SendMessage(hwndListBox01, LB_SETCURSEL, 0, 0);

         break;

    case WM_COMMAND:

         if (HIWORD(wParam) == LBN_SELCHANGE) {
             if (LOWORD(wParam)==IDC_LISTBOX01) {
                 SendMessage(hwndListBox01, LB_GETTEXT, SendMessage(hwndListBox01, 
                             LB_GETCURSEL, 0, 0), (LPARAM) cdizi);
                 SetWindowText(hwndStatic01, cdizi);
             }
         }

         break;

    case WM_DESTROY:
         PostQuitMessage (0);
         break;

    default:
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

List Box kontrol penceresi oluşturulurken, CreateWindowEx() fonksiyonunun lpClassName parametresi için sistemdeki ön tanımlı değerlerden biri olan LISTBOX değeri, dwStyle parametresinde ise LBS_NOTIFY 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 ve bir adet List Box kontrolü oluşturulur.
  • List Box penceresine bir for döngüsü içinde LB_ADDSTRING mesajı sıra ile gönderilerek, isim adlı char dizi içindeki değerler List Box kontrolüne aktarılır.
  • List Box penceresine bir LB_SETCURSEL mesajı gönderilerek, kontrol içindeki ilk eleman 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 LBN_SELCHANGE bildirim mesajı geldiğinde, kullanıcının List Box kontrolü üzerine yaptığı tıklamaların karşılığı olan gerekli işlemler yapılır:
    • Önce, List Box kontrol penceresine LB_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, List Box kontrol penceresine LB_GETTEXT 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_LISTBOX01 401

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

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

HWND hwndStatic01;
HWND hwndListBox01;

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);

         hwndListBox01 = CreateWindowEx(0, "LISTBOX", NULL,
                             WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 20, 50, 200, 200,
                             hwnd, (HMENU) IDC_LISTBOX01, NULL, NULL);

         for (id1=0; strcmp (isim[id1], " "); id1++) {
              SendMessage(hwndListBox01, LB_ADDSTRING, 0, (LPARAM) isim[id1]);
         }

         SendMessage(hwndListBox01, LB_SETCURSEL, 0, 0);

         break;

    case WM_COMMAND:

         if (HIWORD(wParam) == LBN_SELCHANGE) {
             if (LOWORD(wParam)==IDC_LISTBOX01) {
                 SendMessage(hwndListBox01, LB_GETTEXT, SendMessage(hwndListBox01, 
                             LB_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: