Tab stops in a combo box
Magnus_Johannesson/FSVAB/FRONTEC.FRONTEC@notes.frontec.se
Thursday, November 07, 1996
Environment: VC++ 4.0, Win 95 (development), Win32s (target).
I want to set tab stops in a combo box, just as in a list box. Is this p=
ossible?
Magnus Johannesson
Frontec Konsulter G=F6teborg AB
Kit Kauffmann -- kitk@mudshark.sunquest.com
Friday, November 08, 1996
>Environment: VC++ 4.0, Win 95 (development), Win32s (target).
>
>I want to set tab stops in a combo box, just as in a list box. Is this
possible?
i believe the only way is via owner-draw, as the LB controlled by the combo
doesn't have the LBS_USETABSTOPS style bit - here is a portion of an MFC
tabbed combo box (use CBS_HASSTRINGS and CBS_OWNERDRAWFIXED) which should
help get you going:
const int MaxTabs = 255;
class SQTabbedComboBox : public CComboBox
{
public:
void Subclass( int ID,
CWnd* pDlg,
int firstTab,
... );
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
int m_NumTabs;
int m_TabArray[MaxTabs];
};
//
// usage might be: Subclass( ID_COMBO, this, 50, 100, -1 );
//
void SQTabbedComboBox::Subclass( int ID,
CWnd* pDlg,
int firstTab,
... )
{
SubclassDlgItem( ID, pDlg );
m_NumTabs = 0; // extract tab information
int Tab = firstTab;
va_list marker;
va_start( marker, firstTab ); // get first tab
int NumArgs = 0;
while( (NumArgs < MaxTabs) && (Tab != -1) )
{ // add tab to list
m_TabArray[m_NumTabs++] = Tab;
// get next tab
Tab = va_arg( marker, int );
NumArgs++;
}
}
void SQTabbedComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CString Text;
int CurSel = (int) lpDIS->itemID;
if( CurSel != -1 )
{
GetLBText( CurSel, Text );
}
DrawComboBoxItem( lpDIS, m_NumTabs, m_TabArray, Text );
}
//
// the fun part :)
//
void DrawComboBoxItem( LPDRAWITEMSTRUCT lpDIS,
int NumTabs,
LPINT pTabArray,
const char* pText )
{
if( lpDIS->itemAction & ODA_DRAWENTIRE )
{
CDC* pDC = CDC::FromHandle( lpDIS->hDC );
//
// combo boxes have child windows which are desktop children, not dialog
// children, so we have to clip manually
//
CRgn Region;
Region.CreateRectRgn( lpDIS->rcItem.left,
lpDIS->rcItem.top,
lpDIS->rcItem.right,
lpDIS->rcItem.bottom );
pDC->SelectClipRgn( &Region );
TabbedTextOut( lpDIS->rcItem.left,
lpDIS->rcItem.top,
pText,
strlen( pText ),
NumTabs,
pTabArray, 0 );
Region.DeleteObject();
if( (lpDIS->itemState & ODS_SELECTED) )
InvertRect( lpDIS->hDC, &lpDIS->rcItem );
if( (lpDIS->itemState & ODS_FOCUS) &&
(lpDIS->rcItem.left != 0) )
InvertRect( lpDIS->hDC, &lpDIS->rcItem );
return;
}
if( (lpDIS->itemAction & ODA_SELECT) )
InvertRect( lpDIS->hDC, &lpDIS->rcItem );
}
HTH!
kit
I saw Elvis. He sat between me and Bigfoot on the UFO.
| Вернуться в корень Архива
|