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 © 1996-2005, 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 ) );
|
|
}
|
|
|
|
|