2016-08-18 24 views
0

を発射ません:リストボックスの選択イベント(LBN_SELCHANGEとLBN_DBLCLK)私はこのようなリストボックスコントロールを作成してい

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

と、このようなWM_COMMANDの下で私のコールバック関数内のイベントのためのリスニング:

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! 
     } 

    [ ... ] 

問題は、選択を変更すると、新しいアイテムが選択されていることがわかりますが、適切なイベントを受信できません。

アイテムを選択すると、LBN_SETFOCUSイベントの後にLBN_KILLFOCUSイベントが表示されます。 int idx = SendMessage(hAvailable, LB_GETCURSEL, 0, 0);で現在選択されているインデックスを取得しようとすると、実際にアイテムが選択されていても-1が返されます。

答えて

1

あなたはLBN_SELCHANGELBN_DBLCLKのドキュメントを読んでいる場合、それらの両方は言う:

この通知コードだけLBS_NOTIFYスタイルを持って、リストボックスで送信されます。

LBS_NOTIFYのドキュメントは言う:

LBS_NOTIFY
は、ユーザーがリストボックスの項目(LBN_SELCHANGE)をクリックするたびに親ウィンドウに通知コードを送信するために、リストボックスを引き起こし、ダブル・クリックします項目(LBN_DBLCLK)を選択するか、選択をキャンセルします(LBN_SELCANCEL)。

ListBoxコントロールでこのスタイルを有効にしていません。

LB_GETCURSELは、選択がなければLB_ERR(-1)を返します。

関連する問題