禁用 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)不会更改它的外观