在LB_ADDSTRING消息之后,Win32列表框不会立即更新

时间:2010-10-10 10:30:12

标签: c winapi windows-7

操作系统:Win7

后,

列表框未更新其区域

SendMessage(hwndListData,LB_ADDSTRING,0,(LPARAM)szListMainBuffer);

如果鼠标光标悬停在应包含szListMainBuffer文本的空白行上并单击,则会显示文本。我已经尝试使用UpdateWindow(),针对hwndListData和父窗口的InvalidateRect()函数,但没有效果。

有人知道在插入字符串后如何解决列表框的刷新问题吗?

        hwndListData = CreateWindow(TEXT("listbox"), L"Data List", 
                                            WS_CHILDWINDOW | WS_VISIBLE | LBS_NOTIFY | WS_VSCROLL | WS_HSCROLL | WS_BORDER, 
                                            cxChar * 50, cyChar, 
                                            cxChar * 38 + GetSystemMetrics(SM_CXVSCROLL), cyChar * 26 + GetSystemMetrics(SM_CYHSCROLL), 
                                            hwnd, (HMENU) ID_LISTDATA, 
                                            (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
                                            NULL);

增加:

Global scope: WNDPROC oldListDataProcedure;

During WM_CREATE: oldListDataProcedure = (WNDPROC) SetWindowLong (hwndListData, GWL_WNDPROC, (LPARAM) ListDataProc); 

LRESULT CALLBACK ListDataProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
   return CallWindowProc(oldListDataProcedure, hwnd, message, wParam, lParam); 
}

2 个答案:

答案 0 :(得分:1)

它应该自行更新。 UpdateWindow和InvalidateRect无法正常工作的事实告诉我错误可能在您的代码中的其他位置。如果它很小,请随意发布。列表框是否位于任何其他控件之上?调整窗口大小时会发生什么?

答案 1 :(得分:0)

要解决此问题,请转到列表框控件属性,然后将 NoRedraw true 更改为 false