禁用 HSCROLL 的 CListCtrl - 无法选择最后一个可见项目

Posted

技术标签:

【中文标题】禁用 HSCROLL 的 CListCtrl - 无法选择最后一个可见项目【英文标题】:CListCtrl with HSCROLL disabled - cannot select last visible item 【发布时间】:2018-07-23 10:26:50 【问题描述】:

我有一个带有 CListCtrl 的简单对话框。列表控件在报表视图中,并且只有一列。

我通过重写 OnNcCalcSize() 函数禁用了列表的水平滚动

void CMyListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS * lpncsp)

    // disable horizontal scroll bar
    ModifyStyle(WS_HSCROLL, 0);

    CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);

我通过处理 NM_CLICK 消息来捕捉选择更改,但由于某种原因,单击列表中最后一个可见项时不会调用此消息。垂直滚动条的底部箭头最初也不可见,当我单击它时它也不滚动。基本上,红色方块中的所有内容都没有收到点击消息。

我很确定这是因为我禁用了水平滚动条,因为它几乎是水平滚动条应该在的区域

还有其他人看过吗?有什么方法可以捕捉到该区域的点击消息?

【问题讨论】:

我找到了解决我的问题的方法,但如果有人能解释原始问题,我会很想知道。像我一样禁用垂直滚动条是我在网上找到的唯一解决方案,所以我相信其他人之前也遇到过。 【参考方案1】:

我找到了一种解决方法,方法是在 OnNcCalcSize() 中将列的大小调整为列表控件客户区的宽度

void CMyListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS * lpncsp)

    // disable horizontal scroll bar
    ModifyStyle(WS_HSCROLL, 0);

    CRect rect;
    GetClientRect(&rect);
    SetColumnWidth(0, rect.Width());

    CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);

这是因为客户端矩形不包括垂直滚动条。

用户仍然可以自己调整列的大小,但是在禁用 HSCROLL 后,他们似乎无法使其比控件更宽。

【讨论】:

以上是关于禁用 HSCROLL 的 CListCtrl - 无法选择最后一个可见项目的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中的 CListCtrl 中禁用多项选择项上的按钮

区分 CListCtrl 中的用户单击和 SetChecked()

CListCtrl的EnableWindow(FALSE)不会更改它的外观

有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)

MFC - 如何禁用列表项?

clistctrl怎么用,有例子吗?