【问题标题】:CListCtrl with HSCROLL disabled - cannot select last visible item禁用 HSCROLL 的 CListCtrl - 无法选择最后一个可见项目
【发布时间】: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 消息来捕捉选择更改,但由于某种原因,单击列表中最后一个可见项时不会调用此消息。垂直滚动条的底部箭头最初也不可见,当我单击它时它也不滚动。基本上,红色方块中的所有内容都没有收到点击消息。

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

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

【问题讨论】:

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

标签: c++ scrollbar clistctrl


【解决方案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 后,他们似乎无法使其比控件更宽。

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多