禁用 HSCROLL 的 CListCtrl - 不能 select 最后一个可见项目

CListCtrl with HSCROLL disabled - cannot select last visible item

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

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

void CMyListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS * lpncsp)
{
    // disable horizontal scroll bar
    ModifyStyle(WS_HSCROLL, 0);

    CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
}

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

我很确定这是因为我禁用了水平滚动条,因为它几乎就是水平滚动条 应该 .[=14= 的区域]

还有其他人看过吗?有什么方法可以捕获此区域中的点击消息?

我找到了一种解决方法,方法是在 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 的情况下,他们似乎无法使其比控件更宽。