Obsługa List Boxa w WinAPI

0

Witam, mam problem z ListBoxem. Nie umiem obsługiwać zdarzeń na tym elemencie. Chce zrobić coś takiego po kliknięciu na element w liście chce aby jakaś zmienna globalna ustawiała swoja wartość na 1,2,3,4 .Moje Elementy kodu z tym związane.

listbox = CreateWindowEx( 0, "Listbox", "BLUE", WS_CHILD | WS_VISIBLE ,
                10, 110, 100, 100, hwnd, (HMENU) ID_LISTBOX, hThisInst,NULL );

    SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)"1"); 
        SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)"2");
        SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)"3"); 
        SendMessage(listbox, LB_ADDSTRING, 0, (LPARAM)"4");

Co dalej trzeba zrobić i w jakiej części kodu aby obsłużyć te zdażenia.

if (LPARAM == "1")
{int zmienna = 1}
if (LPARAM == "2")
{int zmienna = 2}
if (LPARAM == "3")
{int zmienna = 3}

Chodzi mi o coś w tym stylu bede wdzięczny za pomoc,porade

0

w funkcji okna łapiesz wm_command, z id = id_list, i notifycode = LBN_SELCHANGE;

i tam LB_GETCURSEL itd.

0

Fajnie by było jakiś przykład kawałek kodu który mógł bym wykorzystać do tego.

0
 case WM_COMMAND:
           
            case ID_LISTBOX:
              
                switch(HIWORD(wParam))
                {
                    case LBN_SELCHANGE:
                      
                    break;
                }
            break;
          
        }
    break;

Mam coś takiego tylko jakoś nie bardzo mogę pojąć po czym mam rozpoznawać te messege

1

Nie wiem z czym masz problem:

	case WM_CREATE:
		hListBox = CreateWindowEx(0, L"Listbox", L"BLUE", WS_CHILD | WS_VISIBLE | LBS_NOTIFY, //ważne musi być w stylu LBS_NOTIFY
			10, 110, 100, 100, hWnd, (HMENU)ID_LISTBOX, hInst, NULL);

		SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"1");
		SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"2");
		SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"3");
		SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"4");
		break;
	case WM_COMMAND:
		if ((LOWORD(wParam) == ID_LISTBOX) && (HIWORD(wParam) == LBN_SELCHANGE)) {
                //ewentualnie mozne byc jak niżej wykomentowane oczywicie jezeli obslugujesz wiecej komunikatów lepiej zastosować switch zamiast if'a
                //if (((HWND)lParam == hListBox) && (HIWORD(wParam) == LBN_SELCHANGE)) { 
			wchar_t buf[30];
			int item = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
			wsprintf(buf, L"Wybrano Item: %d", item);
			MessageBox(0, buf, NULL, 0);
		}
		break;
2
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"1");

w nagłówku windowsx.h są makra ułatwiające wiele rzeczy w WinAPI:

ListBox_AddString(hListBox, "1");

obsługa komunikatów:

switch(Msg)
{
    HANDLE_MSG(hwnd, WM_COMMAND, OnCommand); // zamiast case
    ...
}

...

void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
   if (id == ID_LISTBOX && codeNotify == LBN_SELCHANGE)
   {
      int item = ListBox_GetCurSel(hwndCtl);
   }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1