2016-08-18 4 views
0
Brennen

ich ein Steuerelement List-Box wie folgt erschaffe:Listbox Auswahl Ereignisse (LBN_SELCHANGE und LBN_DBLCLK) nicht

HWND hAvailable = CreateWindowEx(WS_EX_CLIENTEDGE, L"Listbox", NULL, 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | 
    LBS_DISABLENOSCROLL | LBS_SORT, 
    0, 0, 0, 0, hWnd, (HMENU)IDC_AVAILABLELIST, 
    hInst, NULL); 

und Hören für Ereignisse in meinem Callback-Funktion, unter WM_COMMAND wie folgt aus:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
int wmId, wmEvent; 

switch (message) { 
case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 

    switch (wmId) { 
    case IDC_AVAILABLELIST: 
     // We get here, with LBN_SETFOCUS and LBN_KILLFOCUS 
     if (wmEvent == LBN_SELCHANGE || wmEvent == LBN_DBLCLK) { 
      // Never gets here! 
     } 

    [ ... ] 

Das Problem ist, dass wenn ich die Auswahl ändere, ich das neue Objekt sehen kann, aber ich bekomme nicht das passende Ereignis.

Wenn ich ein Element auswähle, erhalte ich ein LBN_SETFOCUS-Ereignis, gefolgt von einem LBN_KILLFOCUS-Ereignis. Jeder Versuch, den aktuell ausgewählten Index mit int idx = SendMessage(hAvailable, LB_GETCURSEL, 0, 0); zu erhalten, gibt -1 zurück, obwohl ein Element tatsächlich ausgewählt wurde.

Antwort

1

Wenn Sie die Dokumentation für LBN_SELCHANGE und LBN_DBLCLK lesen, sie beide sagen:

Dieser Benachrichtigungscode nur durch ein Listenfeld, das den LBS_NOTIFY Stil hat gesendet wird.

Die Dokumentation für LBS_NOTIFY sagt:

LBS_NOTIFY
das Listenfeld verursacht einen Benachrichtigungscode an das übergeordnete Fenster zu senden, wenn der Benutzer ein Element im Listenfeld klickt (LBN_SELCHANGE), doppelklickt ein Element (LBN_DBLCLK), oder bricht die Auswahl ab (LBN_SELCANCEL).

Sie aktivieren diesen Stil nicht in Ihrem ListBox-Steuerelement.

Wie bei LB_GETCURSEL wird LB_ERR (-1) zurückgegeben, wenn keine Auswahl getroffen wurde.

Verwandte Themen