2013-05-30 24 views
1

我正在使用Windows和C語言中的默認LISTBOX類創建一個LISTBOX。
列表框正確繪製到主窗口上,但是當我嘗試隨後使用任何數據填充它時,它會靜默失敗。 SendMessage()每次都返回0。列表框的句柄已被證實是正確的,LB_ADDSTRING的定義是0x0180(我認爲這也是正確的)。
我試過char *wchar_t *和文字字符串,它們都不會出現,它們都會從SendMessage()返回0,不管它被調用多少次。我留下來假設也許我的消息處理程序,或者我的類和窗口創建不正確。下面是最近的相關代碼的版本:Win32運行時創建LISTBOX和LB_ADDSTRING錯誤

LRESULT CALLBACK DBWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_CREATE: 
      break; 
     case WM_PAINT: 
      break; 
     case WM_DESTROY: 
      break; 
     default: 
      return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 

void DBClassBuilder() 
{ 
    WNDCLASSEX wc; 

    memset(&wc, 0, sizeof(wc)); 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.lpfnWndProc = DBWinProc; 
    wc.hInstance = g_pi.hInstance; 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wc.lpszClassName = TEXT("LISTBOX"); 

    if (!RegisterClassEx(&wc)) 
     return; 

    g_pi.hb.hDBListBox = CreateWindowEx(
     0, TEXT("LISTBOX"), 
     TEXT(""), 
     WS_CHILD | LBS_HASSTRINGS | LBS_STANDARD, 
     0, 0, 100, 300, 
     g_pi.hWnd, NULL, g_pi.hInstance, NULL); 

    if (g_pi.hb.hDBListBox == NULL) 
     return; 

    SendMessage(g_pi.hb.hDBListBox, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(FALSE,0)); 

    ShowWindow(g_pi.hb.hDBListBox, g_pi.nCmdShow); 
    UpdateWindow(g_pi.hb.hDBListBox); 
} 

LRESULT CALLBACK MainWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    g_pi.hWnd = hWnd; 
    switch (uMsg) 
    { 
     case WM_CREATE: 
      SaveMainPos(); 
      DBClassBuilder(); 
      SendMessage(g_pi.hb.hDBListBox, LB_ADDSTRING, 0, (LPARAM)"test"); 
      break; 
     case WM_PAINT: 
      SaveMainPos(); 
      UpdateChildren(); 
      break; 
     case WM_CLOSE: 
      DestroyWindow(hWnd); 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 
+0

您是否在創建窗口後嘗試過使用'SendMessage'? 'UpdateWindow()'後? –

+0

我原來在DBWinProc()WM_CREATE節中調用了SendMessage()。我認爲這可能是問題的一部分,但無論我移動電話的位置,它仍然產生相同的結果。 MSDN指出SendMessage()調用應該返回項目添加位置的索引。所以,我不確定它爲什麼不返回LB_ERR之類的東西,但也不顯示該項目,並且不管SendMessage()被調用多少次,返回總是0. –

+0

作爲一個快速測試,我複製/粘貼SendMessage()在DBCLassBuilder()中的UpdateWindow()調用之後立即調用,並且返回0而不將項添加到列表框。 –

回答

2

正如你註冊一個「LISTBOX」級,你的窗口是類,而不是標準的ListBox控件類的。因此,標準列表框窗口過程永遠不會被調用。

您可能想要實現的功能稱爲子類化,使用現有的windowclass並調整行爲。網絡搜索應該給你很多正確的子類化的例子。

+0

我很害怕這可能是發生了什麼事。我不確定如何確定我自己。謝謝你的澄清。我會進一步研究子類,看看它是否真的是我想要的。我認爲,如果事實證明我只是想要一個標準的,我應該調用CreateWindowEx()沒有自定義WNDCLASSEX結構被傳遞? –

+0

是的,要獲得標準的,你不需要RegisterWindowClass [Ex],你可以在CreateWindow中使用標準的類名[Ex] –