【问题标题】:Win32 listbox not updating immideately after LB_ADDSTRING messageWin32 列表框在 LB_ADDSTRING 消息后未立即更新
【发布时间】:2011-04-23 10:21:06
【问题描述】:

操作系统:Win7

列表框在

之后没有更新其区域

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

如果鼠标光标悬停在应该包含来自 szListMainBuffer 的文本的空白行上并单击,则会出现文本。我尝试使用针对 hwndListData 和父窗口的 UpdateWindow()、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); 
}

【问题讨论】:

    标签: c winapi windows-7


    【解决方案1】:

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

    【讨论】:

    • 它 280 行.. 所以没有发布 :) 它下面什么都没有,只是父客户区。当我调整它的大小时,文本会出现。
    • 嗯...对控件做了什么特别的事情(比如子类化)?
    • 是的。 WNDPROC oldListDataProcedure;如您所见,胸围仍然没有。 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); }
    • 解决了。我犯了一个错误。我正在使用带有错误窗口句柄的 UpdateWindow。相反 hwndListData 我使用了别的东西。它甚至适用于父窗口句柄。好吧,Alexander,感谢您的帮助,我们下次再见。
    【解决方案2】:

    要修复它,请转到 Listbox Control 属性并将 NoRedrawtrue 更改为 false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多