【问题标题】:Disable autoscrolling when inserting in List View (win32 API, C)在列表视图中插入时禁用自动滚动(win32 API,C)
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • ListView_EnsureVisible 会为您完成繁重的工作
  • 由于某种原因,它不起作用。我首先调用 topItem = ListView_GetTopIndex(GetDlgItem(hwnd, IDC_LISTA)) 并获取第一个可见项目,然后插入该项目,最后我调用 ListView_EnsureVisible(GetDlgItem(hwnd, IDC_LISTA), topItem, TRUE),但这不起作用。但是 EnsureVisible 返回 TRUE。
  • 这个和我用的方法差不多,但是我要实际设置选中项。滚动让他很痛苦,但这是我能找到的最好的方法。
  • @JoseLuis:发生了什么事?您使用它的方式,ListView_EnsureVisible 只会确保旧的顶部项目变得可见。它不一定会恢复旧的滚动位置。
  • @jamesdlin: 使旧的顶部项目可见后,您可以使用ListView_GetItemRect()ListView_GetTopIndex() 轻松计算该项目是否位于控件顶部,如果不是则滚动ListView 有多少像素将项目再次放置在顶部。
【解决方案2】:
  1. 调用 ListView_GetItem 获取要观看的项目的索引
  2. 每次插入新行时调用 ListView_EnsureVisible(hWnd, index_you_want_to_watch, TRUE)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 2011-11-28
      • 2017-09-23
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多