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.
#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ı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: