CListCtrl自适应宽度

 

void CListCtrlExDlg::AdjustColumnWidth()
{
// SetRedraw(FALSE);
int nColumnCount = GetColumnCount();

for (int i = 0; i < nColumnCount; i++)
{
   m_wndList.SetColumnWidth(i, LVSCW_AUTOSIZE);
   int nColumnWidth = m_wndList.GetColumnWidth(i);
   m_wndList.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
   int nHeaderWidth = m_wndList.GetColumnWidth(i);
   m_wndList.SetColumnWidth(i, max(nColumnWidth, nHeaderWidth));
}
// SetRedraw(TRUE);

}

int CListCtrlExDlg::GetColumnCount()
{
CHeaderCtrl* pHeaderCtrl = m_wndList.GetHeaderCtrl();
    return (pHeaderCtrl->GetItemCount());
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 MFC 的 CListCtrl 控件中,可以通过使用 SetColumnWidth 函数来设置列的宽度。但是如果要实现列宽度自适应,需要使用一些其他的技巧。 一种常用的方法是在列表控件绘制之前,先计算出每个列的最大宽度,然后根据最大宽度设置列宽。具体步骤如下: 1. 获取列表控件的列数。 2. 遍历每一列,对于每列,遍历所有行,计算该列中所有单元格文本的最大宽度,取出最大值。 3. 根据最大宽度设置该列的宽度。 下面是示例代码: ```C++ void CMyListCtrl::AutoSizeColumns() { int cxClient = GetClientRect().Width(); int nColumnCount = GetHeaderCtrl()->GetItemCount(); // 遍历每一列 for (int i = 0; i < nColumnCount; i++) { int nMaxWidth = 0; // 遍历该列的所有单元格 for (int j = 0; j < GetItemCount(); j++) { CString strText = GetItemText(j, i); CSize size = GetTextExtent(strText); if (size.cx > nMaxWidth) nMaxWidth = size.cx; } // 计算列宽度 int nColWidth = nMaxWidth + 20; if (nColWidth > cxClient) nColWidth = cxClient; SetColumnWidth(i, nColWidth); cxClient -= nColWidth; } } ``` 在上述代码中,我们使用 GetTextExtent 函数获取单元格文本的宽度。需要注意的是,GetTextExtent 函数返回的大小是以逻辑单位为单位,因此需要将其转换为像素单位才能进行比较。 另外,我们在计算列宽时加上了一个固定的值 20,这是为了保证列宽不会太小,从而导致文本显示不全。你可以根据实际情况调整这个值。 最后,我们在设置列宽之前,判断当前剩余的客户区大小是否足够容纳该列,如果不足,则将该列的宽度设置为客户区大小。这样可以防止列宽过大导致列表控件出现横向滚动条。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值