解决了CListCtrl控件当字体改变后,自动调整每行的宽度的问题.

本文介绍了一种方法,用于解决在CListCtrl控件中,当字体大小改变后,如何自动调整每一列的宽度,确保内容显示完整。通过遍历各列并设置不同的宽度类型,结合图片和缩进处理,实现控件的自适应布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 void CReportCtrl::AutoSizeColumns()
{
       bool bFitWidth=true;

 ShowWindow(SW_HIDE);//避免闪烁
 SetRedraw(FALSE);

 //自动调整宽度
 for(int k=0;k<GetColumnCount();k++)
 {
 
  // Call this after your list control is filled
  if(!GetHeaderCtrl())
   return;
  if(!bFitWidth)//如果不自动调整最后一列宽度,使得总列宽等于控件宽度,
     InsertColumn(GetColumnCount(),"");

  int col=k;
  int mincol = col < 0 ? 0 : col;
  int maxcol = col < 0 ? GetColumnCount()-1 : col;
  
  for (col = mincol; col <= maxcol; col++)
  {
   SetColumnWidth(col,LVSCW_AUTOSIZE);
   int wc1 = GetColumnWidth(col);
   SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER);

   int wc2 = GetColumnWidth(col);
   int iFrom=GetTopIndex();
   int nCountPerpage=GetCountPerPage();

   if(nCountPerpage<=0)
    nCountPerpage=GetItemCount();

   int iTo=iFrom+nCountPerpage;
   int nImgWidth=0;
   int iIndent=0;
   LVITEM li;
   li.mask=LVIF_IMAGE|LVIF_INDENT;
   IMAGEINFO ImageInfo;
   for(int iItem=iFrom;iItem<iTo;iItem++)
   {
    li.iItem=iItem;
    GetItem(&li);
    iIndent=max(li.iIndent,iIndent);
    if(li.iImage!=-1)
    {
     CImageList* pImageList=CListCtrl::GetImageList(LVSIL_SMALL);
     if(pImageList->GetSafeHandle())
     {
      pImageList->GetImageInfo(li.iImage,&ImageInfo);
      nImgWidth=max(nImgWidth,ImageInfo.rcImage.right-ImageInfo.rcImage.left);
     }
    }
   }
   int wc = max(20,max(wc1,wc2));
   if(col==0)
    wc+=nImgWidth*(iIndent+1);
   else
    wc+=nImgWidth;
   SetColumnWidth(col,wc);
  }

  if(!bFitWidth)
   DeleteColumn(GetColumnCount()-1);
  
 }
 SetRedraw(TRUE);
 ShowWindow(SW_SHOW);
 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值