//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include #include "IconComboBox.h" // memdbgon must be the last include file in a .cpp file!!! #include //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CIconComboBox::CIconComboBox() { } //----------------------------------------------------------------------------- // Purpose: Deconstructor //----------------------------------------------------------------------------- CIconComboBox::~CIconComboBox() { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CIconComboBox::Init( void ) { // initialize the icon size m_IconSize.cx = GetSystemMetrics( SM_CXICON ); m_IconSize.cy = GetSystemMetrics( SM_CYICON ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::AddIcon( LPCTSTR pIconName ) { // // create/load an icon from file // // NULL - no icons in file // 1 - not a proper icon file // HICON hIcon = ExtractIcon( AfxGetInstanceHandle(), pIconName, 0 ); if( ( hIcon == ( HICON )1 ) || !hIcon ) return CB_ERR; // // add the icon to the combo box - returning the index // // CB_ERR - general error adding icon // CB_ERRSPACE - insufficient space necessary to add icon // int ndx = CComboBox::AddString( pIconName ); if( ( ndx == CB_ERR ) || ( ndx == CB_ERRSPACE ) ) return ndx; // // associate the icon with the index // // CB_ERR - general error // int result = SetItemData( ndx, ( DWORD )hIcon ); if( result == CB_ERR ) return result; // return the icon index return ndx; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::InsertIcon( LPCTSTR pIconName, int ndx ) { // // create an icon from file // // NULL - no icons in file // 1 - not a proper icon file // HICON hIcon = ExtractIcon( AfxGetInstanceHandle(), pIconName, 0 ); if( ( hIcon == ( HICON )1 ) || !hIcon ) return CB_ERR; // // insert the icon into the combo box -- returning the index // // CB_ERR - general error adding icon // CB_ERRSPACE - insufficient space necessary to add icon // int result = CComboBox::InsertString( ndx, pIconName ); if( ( result == CB_ERR ) || ( result == CB_ERRSPACE ) ) return result; // // associate the icon with the index // // CB_ERR - general error // result = SetItemData( ndx, ( DWORD )hIcon ); if( result == CB_ERR ) return result; // return the icon index return ndx; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::SelectIcon( LPCTSTR pIconName ) { // // search the combo box list for the given string, -1 = search the whole list // // CB_ERR - unsuccessful search // int ndx = CComboBox::FindStringExact( -1, pIconName ); if( ndx == CB_ERR ) return CB_ERR; // set the selection current return CComboBox::SetCurSel( ndx ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::SelectIcon( int ndx ) { // set the selection current return CComboBox::SetCurSel( ndx ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::DeleteIcon( LPCTSTR pIconName ) { // // search the combo box list for the given string, -1 = search the whole list // // CB_ERR - unsuccessful search // int ndx = CComboBox::FindStringExact( -1, pIconName ); if( ndx == CB_ERR ) return CB_ERR; // remove the icon from the combo box return CComboBox::DeleteString( ndx ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CIconComboBox::DeleteIcon( int ndx ) { // remove the icon from the combo box return CComboBox::DeleteString( ndx ); } //----------------------------------------------------------------------------- // Purpose: don't allow the icon combo box to "AddString" //----------------------------------------------------------------------------- int CIconComboBox::AddString( LPCTSTR lpszString ) { assert( FALSE ); return CB_ERR; } //----------------------------------------------------------------------------- // Purpose: don't allow the icon combo box to "InsertString" //----------------------------------------------------------------------------- int CIconComboBox::InsertString( int nIndex, LPCTSTR lpszString ) { assert( FALSE ); return CB_ERR; } //----------------------------------------------------------------------------- // Purpose: don't allow the icon combo box to "DeleteString" //----------------------------------------------------------------------------- int CIconComboBox::DeleteString( int nIndex ) { assert( FALSE ); return CB_ERR; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CIconComboBox::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) { lpMeasureItemStruct->itemWidth = m_IconSize.cx; lpMeasureItemStruct->itemHeight = m_IconSize.cy + 1; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CIconComboBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) { CBrush *pOldBrush = NULL; CPen *pOldPen = NULL; // // the icon is "disabled" // if( !IsWindowEnabled() ) { SetDisabledBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen ); OnDrawIcon( lpDrawItemStruct ); ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen ); return; } // // the icon is "selected" // if( ( lpDrawItemStruct->itemState & ODS_SELECTED ) && ( lpDrawItemStruct->itemAction & ( ODA_SELECT | ODA_DRAWENTIRE ) ) ) { SetSelectedBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen ); OnDrawIcon( lpDrawItemStruct ); ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen ); } // // the icon is "un-selected" // if( !( lpDrawItemStruct->itemState & ODS_SELECTED ) && ( lpDrawItemStruct->itemAction & ( ODA_SELECT | ODA_DRAWENTIRE ) ) ) { SetUnSelectedBrushAndPen( lpDrawItemStruct, &pOldBrush, &pOldPen ); OnDrawIcon( lpDrawItemStruct ); ResetBrushAndPen( lpDrawItemStruct, pOldBrush, pOldPen ); } // // icon gains focus // if( lpDrawItemStruct->itemAction & ODA_FOCUS ) { // get the device context CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // render the focus rectangle pDC->DrawFocusRect( &lpDrawItemStruct->rcItem ); } } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CIconComboBox::OnDrawIcon( LPDRAWITEMSTRUCT lpDrawItemStruct ) { // any items to draw? if( GetCount() == 0 ) return; // get the device context - to draw CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // get the current icon to render HICON hIcon = ( HICON )lpDrawItemStruct->itemData; if( !hIcon ) return; // calculate the icon's upper left corner int UpperLeftX = lpDrawItemStruct->rcItem.left + ( ( lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left ) / 2 ) - ( m_IconSize.cx / 2 ); int UpperLeftY = lpDrawItemStruct->rcItem.top + ( ( lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top ) / 2 ) - ( m_IconSize.cy / 2 ); // render the icon pDC->DrawIcon( UpperLeftX, UpperLeftY, hIcon ); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CIconComboBox::ResetBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct, CBrush *pBrush, CPen *pPen ) { // get the device context CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // reset brush and pen pDC->SelectObject( pBrush ); pDC->SelectObject( pPen ); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CIconComboBox::SetDisabledBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct, CBrush **ppOldBrush, CPen **ppOldPen ) { // get the device context CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // set brush and pen to light gray CBrush brushDisabled( RGB( 192, 192, 192 ) ); CPen penDisabled( PS_SOLID, 1, RGB( 192, 192, 192 ) ); // set the brush and pen current -- saving the old brush and pen state *ppOldBrush = pDC->SelectObject( &brushDisabled ); *ppOldPen = pDC->SelectObject( &penDisabled ); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CIconComboBox::SetUnSelectedBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct, CBrush **ppOldBrush, CPen **ppOldPen ) { // get the device context CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // set the brush and pen "un-highlighted" CBrush brushUnSelected( GetSysColor( COLOR_WINDOW ) ); CPen penUnSelected( PS_SOLID, 1, GetSysColor( COLOR_WINDOW ) ); // set the brush and pen current -- saving the old brush and pen state *ppOldBrush = pDC->SelectObject( &brushUnSelected ); *ppOldPen = pDC->SelectObject( &penUnSelected ); // // set some addition render state - background and text color // pDC->Rectangle( &lpDrawItemStruct->rcItem ); pDC->SetBkColor( GetSysColor( COLOR_WINDOW ) ); pDC->SetTextColor( GetSysColor( COLOR_WINDOWTEXT ) ); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CIconComboBox::SetSelectedBrushAndPen( LPDRAWITEMSTRUCT lpDrawItemStruct, CBrush **ppOldBrush, CPen **ppOldPen ) { // get the device context CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC ); // set the brush and pen "highlighted" CBrush brushSelected( GetSysColor( COLOR_HIGHLIGHT ) ); CPen penSelected( PS_SOLID, 1, GetSysColor( COLOR_HIGHLIGHT ) ); // set the brush and pen current -- saving the old brush and pen state *ppOldBrush = pDC->SelectObject( &brushSelected ); *ppOldPen = pDC->SelectObject( &penSelected ); // // set some addition render state - background and text color // pDC->Rectangle( &lpDrawItemStruct->rcItem ); pDC->SetBkColor( GetSysColor( COLOR_HIGHLIGHT ) ); pDC->SetTextColor( GetSysColor( COLOR_HIGHLIGHTTEXT ) ); }