The following code illustrates how to implement Horizonal Extent handling
for a CListBox. For more information you can look at Q66370.
This class implements a derived CListBox which automatically sets the
horizontal extent.
CListBoxEx.h
//
// CListBoxEx.h v1.1
//
#ifndef _LISTBOX_EX_H
#define _LISTBOX_EX_H
#include
class CListBoxEx : public CListBox
{
public:
//virtual functions
virtual int AddString( LPCTSTR sString );
virtual int DeleteString( UINT nIndex );
virtual int InsertString( int nIndex, LPCTSTR lpszItem );
virtual void ResetContent();
virtual int Dir( UINT attr, LPCTSTR lpszWildCard );
private:
//helpers
LONG GetExtentForString( LPCTSTR sText );
long GetExtentForEntireControl();
};
#endif
CListBoxEx.cpp
// CListBoxEx.cpp v1.0
//
#include "stdafx.h"
#include "listboxex.h"
//
// see Q66370 for more information
//
///////////////////////////////////////////////////////////////////////////
///////
//
//override functions
///////////////////////////////////////////////////////////////////////////
///////
int CListBoxEx::AddString(LPCTSTR lpszItem)
{
LONG lStringExtent = GetExtentForString(lpszItem);
if(GetHorizontalExtent() < lStringExtent)
SetHorizontalExtent(lStringExtent);
return CListBox::AddString(lpszItem);
}
int CListBoxEx::DeleteString( UINT nIndex )
{
int nCountLeft=CListBox::DeleteString(nIndex);
if (nCountLeft== LB_ERR)
return LB_ERR;
LONG lMaxExtent=GetExtentForEntireControl();
SetHorizontalExtent(lMaxExtent);
return nCountLeft;
}
int CListBoxEx::InsertString( int nIndex, LPCTSTR lpszItem )
{
int nInsertPos=InsertString(nIndex, lpszItem);
if (nInsertPos== LB_ERR)
return LB_ERR;
LONG lStringExtent=GetExtentForString(lpszItem);
if(GetHorizontalExtent() < lStringExtent)
SetHorizontalExtent(lStringExtent);
return nInsertPos;
}
void CListBoxEx::ResetContent()
{
SetHorizontalExtent(0);
CListBox::ResetContent(); return;
}
int CListBoxEx::Dir( UINT attr, LPCTSTR lpszWildCard )
{
int nReturn=Dir(attr, lpszWildCard );
if (nReturn== LB_ERR || nReturn== LB_ERRSPACE)
return nReturn;
LONG lMaxExtent=GetExtentForEntireControl();
SetHorizontalExtent(lMaxExtent);
return nReturn;
}
//////////////////////////////////////////////////////////////////////////////////
//helper functions
//////////////////////////////////////////////////////////////////////////////////
LONG CListBoxEx::GetExtentForString(LPCTSTR lpszItem)
{
CDC* cdc=this->GetDC();
CFont* font = this->GetFont();
CFont* pOldFont;
if (font)
{
pOldFont = cdc->SelectObject(font);
TEXTMETRIC tm;
cdc->GetTextMetrics(&tm);
CSize size = cdc->GetTextExtent(lpszItem, lstrlen(lpszItem) );
size.cx += tm.tmAveCharWidth;
cdc->SelectObject(pOldFont);
this->ReleaseDC(cdc);
return (LONG) size.cx;
}
this->ReleaseDC(cdc);
return 0L;
}
long CListBoxEx::GetExtentForEntireControl()
{
CDC* cdc = this->GetDC();
CFont* font = this->GetFont();
CFont* pOldFont;
if (font)
{
pOldFont = cdc->SelectObject(font);
TEXTMETRIC tm;
cdc->GetTextMetrics(&tm);
CString sText;
LONG max_cx = 0;
/****----------------C H A N G E---REY--8/29/98----------****
**** for(int n = 0; n<=GetCount(); n++)
****----------------------------------------------------****/
for(int n = 0; n<GetCount(); n++)
/****--------------------END CHANGE----------------------****/
{
this->GetText(n, sText);
if (sText == "")
continue;
CSize size = cdc->GetTextExtent(sText, sText.GetLength());
size.cx += tm.tmAveCharWidth;
if(max_cx <= size.cx)
max_cx = size.cx;
}
cdc->SelectObject(pOldFont);
this->ReleaseDC(cdc);
return max_cx;
}
this->ReleaseDC(cdc);
return 0L;
}
BUGFIX (28 June 1998): In function GetExtentForEntireControl()
changed SText = "" ro SText == "".
BUGFIX (4 Oct. 1998): In function GetExtentForEntireControl()
modify for loop statement to fix Assertion error that occurs when
you delete a string from the listbox.
Last updated: 11 November 1998
Comments:
- Bug in Dir – Ken Sutherland (2000/01/06)
- Bug in InsertString – Catherine Pelham (1999/11/18)
- MUCH EASIER !!! – Use CListCtrl control instead. – Etti Malka (1999/08/12)
- Only recalculate when deleting longest string – Glenn Brude (1999/05/19)
- Cache longest value – Andrew Lazarus (1998/11/18)
- BUG: incorrect calculating of text extent – Daniel Bernhard (1998/10/21)
- BUG: GetExtentForEntireControl() does not work – Lin Sebastian Kayser (1998/10/08)
- BUG when using tabstop – Michal Levi (1998/09/27)