我们知道,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") );
结果如下:
以上仅供大家参考,谢谢大家^-^!~