VC CListCtrl 第一列列宽自适应

今天用VC写工具的时候用到CListView,并且ListCtrl的第一列需要自动拉伸,以占满空白区域

Delphi做这个设置是很容易的,只要将Column的AutoSize设置为True就可以了

不过VC/SDK的AutoSize其实是根据Item的文本长度来自动设置Column Width,跟我的要求不符,只好自己实现了

其实很简单,就是觉得麻烦...

 

void  CMyView::AdjustColumnWidth()
{
    RECT rc;
    CListCtrl
&  list  =  GetListCtrl();
    CHeaderCtrl
*  pHeader  =  list.GetHeaderCtrl();
    
if  ( ! pHeader)
        
return ;

    
//  客户区域
    list.GetClientRect( & rc);
    
int  nColCount  =  pHeader -> GetItemCount();
    
//  去掉其他列占用的宽度
     for  ( int  i  =   1 ; i  <  nColCount; i ++ )
    {
        rc.right 
-=  list.GetColumnWidth(i);
    }

    
//  去掉滚动条占用的宽度
    SCROLLBARINFO sbi;
    
if  (list.GetScrollBarInfo(OBJID_VSCROLL,  & sbi))
    {
        rc.right 
-=  sbi.rcScrollBar.right  -  sbi.rcScrollBar.left;
    }

    
//  修改列宽
    list.SetColumnWidth( 0 , rc.right  >  rc.left  ?  rc.right  -  rc.left : LVSCW_AUTOSIZE_USEHEADER);
}

 

使用方法:在OnSize消息中调用一下AdjustColumnWidth就好了

void  CMyView::OnSize(UINT nType,  int  cx,  int  cy)
{
    CListView::OnSize(nType, cx, cy);

    
if  (GetListCtrl().GetSafeHwnd())
        AdjustColumnWidth();
}

 

你可能感兴趣的:(VC CListCtrl 第一列列宽自适应)