mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 09:49:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,381 @@
|
||||
//========= 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 ) );
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user