1

我在我的公共控件列表视图中插入一个项目,如下所示:

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)。

PD:列表视图样式: LVS_SINGLESEL | WS_BORDER | WS_TABSTOP | WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_REPORT

4

3 回答 3

3

一种方法是获取当前顶部位置,插入新项目,然后(以编程方式)滚动回保存的顶部位置。

于 2012-05-25T11:37:03.940 回答
0
  1. 调用 ListView_GetItem 获取要观看的项目的索引
  2. 每次插入新行时调用 ListView_EnsureVisible(hWnd, index_you_want_to_watch, TRUE)。
于 2012-05-25T15:08:33.250 回答
0

如果您可以将 ListView 切换到虚拟模式(应用LVS_OWNERDATA样式,然后LVN_GETDISPINFO在请求时使用通知将您的数据提供给 ListView),那么您可以使用ListView_SetItemCountEx()添加/插入/删除项目。它有一个LVSICF_NOSCROLL标志来防止滚动。

于 2012-05-28T20:05:01.577 回答