这星河灿烂. 2024-04-30 16:28 采纳率: 15.2%
浏览 54
已结题

MFC中list控件没有竖排的滚动栏

img


如图:List控件只有下面的横排滚动条,没有竖排的滚动条。怎么回事,怎么修改
下面是我的初始化代码:


CRect rect;
m_ListCtrl.GetClientRect(rect);
m_ListCtrl.InsertColumn(0, _T("序"), LVCFMT_LEFT, 40);
m_ListCtrl.InsertColumn(1, _T("源部件"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(2, _T("项目"), LVCFMT_LEFT, 170);
m_ListCtrl.InsertColumn(3, _T("数值"), LVCFMT_LEFT, 110);
m_ListCtrl.InsertColumn(4, _T("单位"), LVCFMT_LEFT, rect.Width() -420);

m_ListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES);

//子类化列表控件的表头
CHeaderCtrl* pHeader = m_ListCtrl.GetHeaderCtrl();
if (pHeader)
    m_ListHead.SubclassWindow(pHeader->GetSafeHwnd());
HDITEM hdItem;
hdItem.mask = HDI_FORMAT;
for (int i = 0; i < m_ListHead.GetItemCount(); i++)
{
    m_ListHead.GetItem(i, &hdItem);
    hdItem.fmt |= HDF_OWNERDRAW;    //增加自绘样式
    m_ListHead.SetItem(i, &hdItem);
}

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-04-30 16:28
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    在MFC中,如果你发现List Control没有垂直滚动条,这通常是因为控件的大小设置或者其父窗口的布局管理导致的,而不是因为代码中直接控制滚动条显示的逻辑。List Control的滚动条显示是自动根据其内容和视图大小调整的。为确保垂直滚动条总是可见,可以检查以下几个方面:

    1. 确保控件有足够的空间展示内容:在对话框编辑器中,确保List Control的大小能够随着内容增加而扩展,或者它被放置在一个可以动态调整大小的容器(如CScrollDialog或带有滚动条的窗体)内。

    2. 设置正确的风格:在创建List Control时,确保它具有滚动条风格。如果你是通过资源编辑器添加的,应确保选择了“有滚动条”选项。如果是程序中动态创建,要确保风格中包含LVS_AUTOARRANGE | LVS_REPORT | WS_VISIBLE | WS_CHILD | WS_VSCROLL等,其中WS_VSCROLL特别指定了垂直滚动条。

    3. 动态调整列宽:确保列宽不会占据整个List Control的宽度,这样当行数超过可视区域时,垂直滚动条就会出现。从你提供的代码来看,你在尝试动态分配列宽,但确保剩余的空间足以触发滚动条。

    如果你的问题是列表的内容过多但滚动条未正确显示,可以尝试以下代码调整确保滚动条始终可用:

    // 假设m_ListCtrl是你的CListCtrl对象
    // 动态创建时确保风格包括WS_VSCROLL
    // 如果是在对话框资源中添加的,检查属性确保有滚动条
    
    // 确保在窗口初始化或数据填充后调用这个函数来调整大小
    void AdjustListControl()
    {
        // 获取List Control当前的客户区大小
        CRect rectClient;
        m_ListCtrl.GetClientRect(&rectClient);
    
        // 设置List Control的大小,确保考虑滚动条的存在
        // 这里假设你希望除了必要的滚动条空间外,控件充满其父窗口
        // 通常不需要手动设置大小,除非有特定布局需求
        // 以下代码仅作为示例,实际应用中可能不需要直接调整大小
        // m_ListCtrl.SetWindowPos(NULL, 0, 0, rectClient.Width(), rectClient.Height(), SWP_NOMOVE);
    
        // 确保数据已经插入,然后调整视图大小以适应内容
        m_ListCtrl.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER); // 自动调整第一列宽度
        for (int i = 1; i < m_ListCtrl.GetColumnCount(); i++)
            m_ListCtrl.SetColumnWidth(i, LVSCW_AUTOSIZE); // 其他列自动调整
    
        // 强制更新布局,确保滚动条显示正确
        m_ListCtrl.Invalidate();
        m_ListCtrl.UpdateWindow();
    }
    

    确保在数据填充之后调用AdjustListControl()函数,以便List Control能够根据其内容正确显示滚动条。如果你已经做了上述尝试但问题依旧,可能需要检查父窗口的布局管理是否阻止了List Control的自然扩展。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月10日
  • 创建了问题 4月30日