为MFC中的ListBox添加水平滚动条

时间:2021-03-25 17:20:26

我们知道,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") );

结果如下:

以上仅供大家参考,谢谢大家^-^!~