為MFC中的ListBox添加水平滾動條


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

結果如下:

 

以上僅供大家參考,謝謝大家^-^!~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM