我正在使用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;
}
您是否在創建窗口後嘗試過使用'SendMessage'? 'UpdateWindow()'後? –
我原來在DBWinProc()WM_CREATE節中調用了SendMessage()。我認爲這可能是問題的一部分,但無論我移動電話的位置,它仍然產生相同的結果。 MSDN指出SendMessage()調用應該返回項目添加位置的索引。所以,我不確定它爲什麼不返回LB_ERR之類的東西,但也不顯示該項目,並且不管SendMessage()被調用多少次,返回總是0. –
作爲一個快速測試,我複製/粘貼SendMessage()在DBCLassBuilder()中的UpdateWindow()調用之後立即調用,並且返回0而不將項添加到列表框。 –