2016-08-22 2 views
0

オーナー描画リストボックスを作成しました。なぜあなたは知っていますかWM_DRAWITEMメッセージ、私は(LPDRAWITEMSTRUCT)lParam->itemID = -1を受け取るだけですか?オーナーの引き出しリストボックスいつも戻る(LPDRAWITEMSTRUCT) - > itemID = -1

私は、リストボックスを作成し、設定スクロール情報

VS 2010 C++ ExpressとのWin 7でコーディングしています:

lbHWND = CreateWindowExW(NULL, WC_LISTBOX, NULL, 
    WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_NODATA | 
    LBS_OWNERDRAWFIXED | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT, 
    0, 0, 400, 400, tkHWND, (HMENU)IDC_LISTBOX_ENTRY, hInstance, 0); 

SCROLLINFO lbSi = { 0 }; 
lbSi.cbSize = sizeof(SCROLLINFO); 
lbSi.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; 
lbSi.nMin = 0; 
lbSi.nMax = 1000; 
lbSi.nPage = 20; 
lbSi.nPos = 0; 
SetScrollInfo(lbHWND, SB_VERT, &lbSi, TRUE); 

WINPROC:私が持っている

LRESULT CALLBACK WndProc(HWND phwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_MEASUREITEM: 
     { 
      MEASUREITEMSTRUCT* lpmis = (LPMEASUREITEMSTRUCT)lParam; 
      switch (lpmis->CtlID) 
      { 
       case IDC_LISTBOX_ENTRY: 
        lpmis->itemHeight = 20; 
        break; 
       default: 
        break; 
      } 
      return TRUE; 
     } 
     case WM_DRAWITEM: 
     { 
      DRAWITEMSTRUCT* lpdis = (LPDRAWITEMSTRUCT)lParam; 

      // Check lpdis->itemID, for test purpose only 
      FILE *f; 
      if (!_wfopen_s(&f, L"E:\\lb.txt", L"ab")) 
      { 
       fprintf(f,"%d\r\n", lpdis->itemID); 
       fclose(f); 
      } 
      // lpdis->itemID always = -1 
      return TRUE; 
     } 
    } 
} 
+1

リストボックスに項目を追加しましたか?スクロールバーの範囲を調整していて、リストボックスの描画項目につながると思っているようですが、そのようには動作しません。リストボックスは、スクロールバーの範囲を計算するために項目数を使用しますが、その逆もありません。 –

+0

@JonathanPotterあなたは正しいです、私はagaintをチェックし、それが 'LBS_NODATA'リストボックスであることを確認し、' LB_SETCOUNT'メッセージを呼び出すのを忘れました。あなたが答えとしてあなたのコメントを投稿すれば、私はそれを受け入れるでしょう!大いに感謝する :) – Sakura

答えて

0

答えを見つけてください:LBS_NODATAスタイルのオーナー描画リストボックスでは、リストボックスの番号を教えてくださいそれが持っているアイテムの数

SendMessage(lbHWND, LB_RESETCONTENT, 0, 0); // Remove all items, if have any 
SendMessage(lbHWND, LB_SETCOUNT, 1000, 0);  // Set number of items (here is 1000) 
関連する問題