You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
11 KiB
381 lines
11 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include <stdafx.h> |
|
#include "IconComboBox.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
//----------------------------------------------------------------------------- |
|
// 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 ) ); |
|
} |
|
|
|
|
|
|