www.pudn.com > mod_rssim6.zip > ColorPickerCB.cpp
// ColorPickerCB.cpp
//
// (c) 1998 James R. Twine
//
// Based On Code That Was Found On www.codeguru.com, And Was
// © 1997 Baldvin Hansson
//
// Bug Fixes And Additions:
//
// Bug Fix From Marcel Galem:
// Added Masking Of Inverted COLORREF Value.
//
#include "stdafx.h"
#include "ColorPickerCB.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Load Standard Colors...
// (If You Change This, Be Sure To Load CCB_MAX_COLORS Colors...)
//
SColorAndName CColorPickerCB::ms_pColors[ CCB_MAX_COLORS ] =
{
SColorAndName( RGB( 0x00, 0x00, 0x00 ), "Black" ),
SColorAndName( RGB( 0x80, 0x00, 0x00 ), "Maroon" ),
SColorAndName( RGB( 0x00, 0x80, 0x00 ), "Green" ),
SColorAndName( RGB( 0x80, 0x80, 0x00 ), "Olive" ),
SColorAndName( RGB( 0x00, 0x00, 0x80 ), "Navy" ),
SColorAndName( RGB( 0x80, 0x00, 0x80 ), "Purple" ),
SColorAndName( RGB( 0x00, 0x80, 0x80 ), "Teal" ),
SColorAndName( RGB( 0x80, 0x80, 0x80 ), "Grey" ),
SColorAndName( RGB( 0xC0, 0xC0, 0xC0 ), "Silver" ),
SColorAndName( RGB( 0xFF, 0x00, 0x00 ), "Red" ),
SColorAndName( RGB( 0x00, 0xFF, 0x00 ), "Lime" ),
SColorAndName( RGB( 0xFF, 0xFF, 0x00 ), "Yellow" ),
SColorAndName( RGB( 0x00, 0x00, 0xFF ), "Blue" ),
SColorAndName( RGB( 0xFF, 0x00, 0xFF ), "Fushcia" ),
SColorAndName( RGB( 0x00, 0xFF, 0xFF ), "Aqua" ),
SColorAndName( RGB( 0xFF, 0xFF, 0xFF ), "White" ),
};
CColorPickerCB::CColorPickerCB()
{
m_bInitialized = false;
}
CColorPickerCB::~CColorPickerCB()
{
}
BEGIN_MESSAGE_MAP(CColorPickerCB, CComboBox)
//{{AFX_MSG_MAP(CColorPickerCB)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorPickerCB message handlers
int CColorPickerCB::OnCreate( LPCREATESTRUCT pCStruct )
{
if( CComboBox::OnCreate( pCStruct ) == -1 ) // If Create Failed
return( -1 ); // Return Failure
Initialize(); // Initialize Contents
SetCurSel( 0 ); // Select First Item By Default
return( 0 ); // Done!
}
void CColorPickerCB::PreSubclassWindow()
{
Initialize(); // Initialize Contents
CComboBox::PreSubclassWindow(); // Subclass Control
SetCurSel( 0 ); // Select First Item By Default
return; // Done!
}
void CColorPickerCB::Initialize( void )
{
int iAddedItem = -1;
if( m_bInitialized ) // If Already Initialized
return; // Return
for( int iColor = 0; iColor < CCB_MAX_COLORS; iColor++ )// For All Colors
{
iAddedItem = AddString( ms_pColors[
iColor ].m_cColor ); // Set Color Name/Text
if( iAddedItem == CB_ERRSPACE ) // If Not Added
break; // Stop
else // If Added Successfully
SetItemData( iAddedItem, ms_pColors[
iColor ].m_crColor ); // Set Color RGB Value
}
m_bInitialized = true; // Set Initialized Flag
}
void CColorPickerCB::DrawItem( LPDRAWITEMSTRUCT pDIStruct )
{
static CString sColor; // No Need To Reallocate Each Time
CDC dcContext;
CRect rItemRect( pDIStruct -> rcItem );
CRect rBlockRect( rItemRect );
CRect rTextRect( rBlockRect );
CBrush brFrameBrush;
int iFourthWidth = 0;
int iItem = pDIStruct -> itemID;
int iAction = pDIStruct -> itemAction;
int iState = pDIStruct -> itemState;
COLORREF crColor = 0;
COLORREF crNormal = GetSysColor( COLOR_WINDOW );
COLORREF crSelected = GetSysColor( COLOR_HIGHLIGHT );
COLORREF crText = GetSysColor( COLOR_WINDOWTEXT );
if( !dcContext.Attach( pDIStruct -> hDC ) ) // Attach CDC Object
return; // Stop If Attach Failed
iFourthWidth = ( rBlockRect.Width() / 4 ); // Get 1/4 Of Item Area
brFrameBrush.CreateStockObject( BLACK_BRUSH ); // Create Black Brush
if( iState & ODS_SELECTED ) // If Selected
{ // Set Selected Attributes
dcContext.SetTextColor(
( 0x00FFFFFF & ~( crText ) ) ); // Set Inverted Text Color (With Mask)
dcContext.SetBkColor( crSelected ); // Set BG To Highlight Color
dcContext.FillSolidRect( &rBlockRect, crSelected ); // Erase Item
}
else // If Not Selected
{ // Set Standard Attributes
dcContext.SetTextColor( crText ); // Set Text Color
dcContext.SetBkColor( crNormal ); // Set BG Color
dcContext.FillSolidRect( &rBlockRect, crNormal ); // Erase Item
}
if( iState & ODS_FOCUS ) // If Item Has The Focus
dcContext.DrawFocusRect( &rItemRect ); // Draw Focus Rect
//
// Calculate Text Area
//
rTextRect.left += ( iFourthWidth + 2 ); // Set Start Of Text
rTextRect.top += 2; // Offset A Bit
//
// Calculate Color Block Area
//
rBlockRect.DeflateRect( CSize( 2, 2 ) ); // Reduce Color Block Size
rBlockRect.right = iFourthWidth; // Set Width Of Color Block
//
// Draw Color Text And Block
//
if( iItem != -1 ) // If Not An Empty Item
{
GetLBText( iItem, sColor ); // Get Color Text
if( iState & ODS_DISABLED ) // If Disabled
{
crColor = GetSysColor( COLOR_INACTIVECAPTIONTEXT );
dcContext.SetTextColor( crColor ); // Set Text Color
}
else // If Normal
crColor = GetItemData( iItem ); // Get Color Value
dcContext.SetBkMode( TRANSPARENT ); // Transparent Background
dcContext.TextOut( rTextRect.left, rTextRect.top,
sColor ); // Draw Color Name
dcContext.FillSolidRect( &rBlockRect, crColor ); // Draw Color
dcContext.FrameRect( &rBlockRect, &brFrameBrush ); // Draw Frame
}
dcContext.Detach(); // Detach DC From Object
}
COLORREF CColorPickerCB::GetSelectedColorValue( void )
{
int iSelectedItem = GetCurSel(); // Get Selected Item
if( iSelectedItem == CB_ERR ) // If Nothing Selected
return( RGB( 0, 0, 0 ) ); // Return Black
return( GetItemData( iSelectedItem ) ); // Return Selected Color
}
CString CColorPickerCB::GetSelectedColorName( void )
{
int iSelectedItem = GetCurSel(); // Get Selected Item
if( iSelectedItem == CB_ERR ) // If Nothing Selected
return( m_sColorName = afxEmptyString ); // Return Nothing (Not "Black!")
GetLBText( iSelectedItem, m_sColorName ); // Store Name Of Color
return( m_sColorName ); // Return Selected Color Name
}
void CColorPickerCB::SetSelectedColorValue( COLORREF crClr )
{
int iItems = GetCount();
for( int iItem = 0; iItem < iItems; iItem++ )
{
if( crClr == GetItemData( iItem ) ) // If Match Found
SetCurSel( iItem ); // Select It
}
return; // Done!
}
void CColorPickerCB::SetSelectedColorName( PCSTR cpColor )
{
int iItems = GetCount();
CString sColorName;
for( int iItem = 0; iItem < iItems; iItem++ )
{
GetLBText( iItem, sColorName ); // Get Color Name
if( !sColorName.CompareNoCase( cpColor ) ) // If Match Found
SetCurSel( iItem ); // Select It
}
return; // Done!
}
bool CColorPickerCB::RemoveColor( PCSTR cpColor )
{
int iItems = GetCount();
CString sColor;
bool bRemoved = false;
for( int iItem = 0; iItem < iItems; iItem++ )
{
GetLBText( iItem, sColor ); // Get Color Name
if( !sColor.CompareNoCase( cpColor ) ) // If Match Found
{
DeleteString( iItem ); // Remove It
bRemoved = true; // Set Flag
break; // Stop Checking
}
}
return( bRemoved ); // Done!
}
bool CColorPickerCB::RemoveColor( COLORREF crClr )
{
int iItems = GetCount();
bool bRemoved = false;
for( int iItem = 0; iItem < iItems; iItem++ )
{
if( crClr == GetItemData( iItem ) ) // If Desired Color Found
{
DeleteString( iItem ); // Remove It
bRemoved = true; // Set Flag
break; // Stop Checking
}
}
return( bRemoved ); // Done!
}
int CColorPickerCB::AddColor( PCSTR cpName, COLORREF crColor )
{
int iItem = -1;
iItem = InsertString( -1, cpName ); // Insert String
if( iItem != LB_ERR ) // If Insert Good
SetItemData( iItem, crColor ); // Set Color Value
return( iItem ); // Done! Return Location
}