我們知道,MFC中的水平滾動條並不像垂直滾動條那樣的智能。當文字超出ListBox的寬度時,水平滾動條並不會自己出現,我們需要手動的調用CListBox中的函數SetHorizontalExtent設置寬度,單位為像素。
我們可以自己添加智能水平滾動條,現在我們首先隨便創建一個ListBox控件,並將它的HorizontalScrollbar屬性設置為True,如下:
這樣,控件的創建就完成了,然后就需要添加代碼來實現智能水平滾動條了。
首先,我們創建一個類,這里,我命名為CIHListBox,該類需要繼承CListBox類,以便添加水平滾動條。
然后我們需要覆蓋CListBox類的AddString和InsertString接口以便添加水平滾動條。
最后自然就是我們主要的計算智能水平滾動條的方法了,這里命名為RefushHorizontalScrollBar。
整個類的聲明如下:
#ifndef _IHLISTBOX_H_
#define _IHLISTBOX_H_
class CIHListBox: public CListBox
{
public:
CIHListBox(void);
~CIHListBox(void);
// 覆蓋該方法以便添加水平滾動條
int AddString( LPCTSTR lpszItem );
int InsertString( int nIndex, LPCTSTR lpszItem );
// 計算水平滾動條寬度
void RefushHorizontalScrollBar( void );
};
#endif
首先,AddString和InsertString沒有什么懸念,就是調用基類的方法后重新計算下水平滾動條的寬度,代碼如下:
int CIHListBox::AddString( LPCTSTR lpszItem )
{
int nResult = CListBox::AddString( lpszItem );
RefushHorizontalScrollBar();
return nResult;
}
int CIHListBox::InsertString( int nIndex, LPCTSTR lpszItem )
{
int nResult = CListBox::InsertString( nIndex, lpszItem );
RefushHorizontalScrollBar();
return nResult;
}
然后就是RefushHorizontalScrollBar方法了,該方法的實質是計算ListBox中每項的寬度,然后將最大寬度設置為水平寬度。實現代碼如下:
void CIHListBox::RefushHorizontalScrollBar( void )
{
CDC *pDC = this->GetDC();
if ( NULL == pDC )
{
return;
}
int nCount = this->GetCount();
if ( nCount < 1 )
{
this->SetHorizontalExtent( 0 );
return;
}
int nMaxExtent = 0;
CString szText;
for ( int i = 0; i < nCount; ++i )
{
this->GetText( i, szText );
CSize &cs = pDC->GetTextExtent( szText );
if ( cs.cx > nMaxExtent )
{
nMaxExtent = cs.cx;
}
}
this->SetHorizontalExtent( nMaxExtent );
}
然后,我們在獲取ListBox控件的時候,只需要使用子類的方法就可以實現智能水平滾動條了。
我的嘗試代碼如下:
#define DLG_LIST_TEST ((CIHListBox*)(GetDlgItem(IDC_LISTTEST)))
DLG_LIST_TEST->AddString( TEXT("This is lenth tes") );
DLG_LIST_TEST->AddString( TEXT("This is lenth test test test") );
DLG_LIST_TEST->AddString( TEXT("This is lenth test test test test test11111") );
結果如下:
以上僅供大家參考,謝謝大家^-^!~