【问题标题】:How to determine if a scrollbar for a CListCtrl is displaying?如何确定 CListCtrl 的滚动条是否正在显示?
【发布时间】:2018-07-31 11:10:56
【问题描述】:

我有一个派生自 CListCtrl 的类。我希望所有列的宽度总和显示窗口的宽度,这样我就不会得到底部滚动条。我可以通过GetSystemMetrics(SM_CXVSCROLL) 调用获得标准滚动条的宽度,但我不知道如何判断垂直滚动条是否处于活动状态。我试过用:

auto pScrollbar = GetScrollBarCtrl(SB_VERT);
auto is_visible = pScrollbar && pScrollbar->IsWindowVisible();

pScrollbar 始终是nullptr。我环顾四周,有些人说滚动条并不总是窗口,可能是手动绘制的(呃!),可能根本不是窗口。这将使我的生活更加困难。想法?

【问题讨论】:

  • 列表控件的细节我不知道,但是There are two types of scrollbars.
  • 您必须使用客户端矩形并根据所需的列宽度对其进行划分并设置最后一列剩余宽度

标签: mfc clistctrl


【解决方案1】:

根据我的链接问题 (How to stop the bottom scrollbar from a CListCtrl from displaying?),我使用的是:

void CMyListCtrl::ResizeLastColumn()
{
    LVCOLUMN column;
    column.mask = LVCF_WIDTH;
    LONG maxWidth = 0;
    for (int i = 0; i < lastColumnIndex; ++i)
    {
        GetColumn(i, &column);
        maxWidth += column.cx;
    }
    CRect wndRect;
    GetWindowRect(&wndRect);

    SetColumnWidth(lastColumnIndex, wndRect.Width() - maxWidth - 4);
}

将列的大小调整为客户区的宽度。事实证明,通过使用 GetClientRect() 代替,我不必减去 -4 或垂直滚动​​条宽度,这不再是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多