Menambahkan ListBox

Untuk menambahkan listbox, nama class Window yang kita gunakan dalam CreateWindow atau CreateWindowEx adalah "LISTBOX". Untuk menambahkan isi listbox, kita bisa menggunakan SendMessage dengan LB_ADDSTRING sebagai argumen dari parameter keduanya. Untuk menghapus isi listbox pada posisi tertentu, gunakan SendMessage dengan LB_DELETESTRING. Contoh SendMessage lainnya untuk listbox bisa dilihat dibawah ini.

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

#define nkolom 4
#define nbaris 5
#define tombol_AC 200
#define tombol_BS 202

HWND lstbox;
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, 290, 0, 0, hinst, 0);
    lstbox=CreateWindowEx(0, TEXT("LISTBOX"), "", WS_VISIBLE | WS_CHILD | WS_BORDER , 4, 4, 170, 180, wind, 0, hinst, 0);
    //Buat textbox, static text dan tombol
  
    for(int i=0;i<10;i++){
        SendMessage(lstbox, LB_ADDSTRING, 0, (LPARAM)stombol[i]);
    }

    SendMessage(lstbox, LB_SETCURSEL, 0, 0);
    CreateWindowEx(0, TEXT("BUTTON"), "HAPUS", WS_VISIBLE | WS_CHILD | WS_BORDER , 4, 190, 170, 20, wind, (HMENU)100, 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){
    switch(pesan){
        case WM_COMMAND:
            if(LOWORD(wParam)==100){
                if(SendMessage(lstbox, LB_GETCOUNT, 0, 0)>3){
                    SendMessage(lstbox, LB_DELETESTRING, 1, 0);
                    SendMessage(lstbox, LB_SETCURSEL, 1, 0);
                }
            }
            break;
        case WM_CLOSE:
            PostQuitMessage(0);
            break;

    }

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



Windows message yang digunakan untuk listbox dalam SendMessage umumnya diawali dengan LB. Beberapa "window message" khusus yang bisa digunakan untuk listbox, yaitu :
  1. LB_GETCOUNT : Mendapatkan jumlah isi dari listbox
  2. LB_GETCURSEL : Mendapatkan posisi yang dipilih dalam listbox
  3. LB_ADDSTRING : Menambah isi ListBox
  4. LB_DELETESTRING : Menghapus isi ListBox di posisi tertentu
  5. LB_RESETCONTENT : Menghapus semua isi ListBox
  6. LB_SETCURSEL : menentukan posisi pilihan dalam listbox
  7. LB_GETTEXT : Mendapatkan isi listbox di posisi tertentu
Argumen berupa angka biasanya ada di parameter wparam, sedangkan yang berupa string umumnya ada di parameter lparam. Hasil dari GETCOUNT dan GETCURSEL ada di kembalian dari SendMessage. "window message" lainnya bisa dilihat di dokumentasi dari microsoft.