CHScrollbarListBox

本文介绍了一个自定义的滚动条列表框控件,该控件能够根据内容自动调整水平滚动条的显示与隐藏,并确保所有项目都能完整显示。文章详细展示了如何通过重写AddString和DeleteString方法来实现这一功能。

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

重点几个函数

参考 http://blog.youkuaiyun.com/god00/article/details/6783947

int CHScrollbarListBox::AddString( LPCTSTR lpszItem )
{
int nRet  = CListBox::AddString(lpszItem);


SCROLLINFO   scrollInfo; 
memset(&scrollInfo,   0,   sizeof(SCROLLINFO)); 
scrollInfo.cbSize   =   sizeof(SCROLLINFO); 
scrollInfo.fMask   =   SIF_ALL; 
GetScrollInfo(SB_VERT,   &scrollInfo,   SIF_ALL); 


int   nScrollWidth   =   0;  //vScrollwidth
if(GetCount()   >   1   &&   ((int)scrollInfo.nMax    >=   (int)scrollInfo.nPage)) 

nScrollWidth   =   GetSystemMetrics(SM_CXVSCROLL); 
  //Metrics 分辨率 宽度以分辨率为单位



RECT lRect;
GetWindowRect(&lRect);
int nBoxWidth = lRect.right - lRect.left - nScrollWidth;




SIZE   sSize; 
CClientDC   myDC(this); 
CFont*   pListBoxFont   =   GetFont(); 
if(pListBoxFont   ==   NULL) 
{
}


CFont*   pOldFont   =   
myDC.SelectObject(pListBoxFont); 
GetTextExtentPoint32(myDC.m_hDC,  lpszItem,   _tcslen(lpszItem),   &sSize); 
m_nMaxWidth   =   max(m_nMaxWidth,   (int)sSize.cx);
if (m_nMaxWidth+5 > nBoxWidth)
{
SetHorizontalExtent(m_nMaxWidth  +  4); 
}
myDC.SelectObject(pOldFont);   


return   nRet; 

}


int CHScrollbarListBox::DeleteString( UINT nIndex )
{
int nRet = CListBox::DeleteString(nIndex);


RECT lRect;
    GetWindowRect(&lRect);
SCROLLINFO   scrollInfo; 
memset(&scrollInfo,   0,   sizeof(SCROLLINFO)); 
scrollInfo.cbSize   =   sizeof(SCROLLINFO); 
scrollInfo.fMask   =   SIF_ALL; 
GetScrollInfo(SB_VERT,   &scrollInfo,   SIF_ALL); 


int   nScrollWidth   =   0;  //vScrollwidth
if(GetCount()   >   1   &&   ((int)scrollInfo.nMax   
     >=   (int)scrollInfo.nPage)) 

nScrollWidth   =   GetSystemMetrics(SM_CXVSCROLL); 



SIZE sSize;
CClientDC myDC(this);
CString lpszItem;
CFont* pListFont = GetFont();
CFont* pOldFont = myDC.SelectObject(pListFont);
    
int nBoxWidth = lRect.right  - lRect.left - nScrollWidth;
m_nMaxWidth = 0;
for (int i = 0 ; i < GetCount(); i ++)
{
CListBox::GetText(i,lpszItem);
GetTextExtentPoint32(myDC.m_hDC,lpszItem,_tcslen(lpszItem.GetBuffer()),&sSize);
lpszItem.ReleaseBuffer();
m_nMaxWidth = max(m_nMaxWidth, (int)sSize.cx);
}
myDC.SelectObject(pOldFont);


if(nBoxWidth < m_nMaxWidth +5)
{
      SetHorizontalExtent(m_nMaxWidth + 4);
}else
{
ShowScrollBar(SB_HORZ,FALSE);
  SetHorizontalExtent(0);
}
return nRet;
}


void CHScrollbarListBox::ResetContent()
{
CListBox::ResetContent();
m_nMaxWidth = 0 ;
SetHorizontalExtent(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值