【发布时间】:2012-05-31 23:50:27
【问题描述】:
我在我的通用控件列表视图中插入一个项目,如下所示:
void InsertRow (HWND hWnd, char *col1, char *col2)
{
LV_ITEM lvItem;
lvItem.mask = 0;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.iItem = ListView_InsertItem (hWnd, &lvItem);
lvItem.mask = LVIF_TEXT;
lvItem.pszText = col1;
lvItem.cchTextMax = strlen (lvItem.pszText);
ListView_SetItem (hWnd, &lvItem);
lvItem.iSubItem = 1;
lvItem.pszText = col2;
lvItem.cchTextMax = strlen (lvItem.pszText);
ListView_SetItem (hWnd, &lvItem);
}
并且工作正常,但它很痛苦,因为垂直滚动会回到列表顶部,所以如果我正在观看一个项目并调用此插入函数,我会失去我的视野,并且必须手动向后滚动,使我的程序无法使用。
如何防止这种自动滚动?
我正在用 C 语言编程,直接使用 win32 API(不是 MFC)。
P.D.:列表视图样式:
LVS_SINGLESEL | WS_BORDER | WS_TABSTOP | WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_REPORT
【问题讨论】:
-
根据我使用原生列表框等的经验,我发现它们的默认行为相当粗糙。您可以尝试将列表框“子类化”,即为某些消息运行自定义windproc。在这种情况下,您可能应该寻找 WM_VSCROLL 或类似的东西。每当您向列表中添加项目时,请在程序中设置一个标志“no_scroll”。如果子类化的 windproc 在设置了“no_scroll”时收到滚动消息,则丢弃它。
标签: c winapi listview win32gui