ColorPickerCB.cpp
上传用户:aokegd
上传日期:2009-12-14
资源大小:1276k
文件大小:7k
- #include "stdafx.h"
- #include "ColorPickerCB.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- // 给颜色和名称结构数组赋值
- 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 )
- return( -1 );
- return( 0 );
- }
- void CColorPickerCB::PreSubclassWindow()
- {
- // Initialize Contents
- Initialize();
-
- // Subclass Control
- CComboBox::PreSubclassWindow();
- // Select First Item By Default
- SetCurSel( 0 );
- return;
- }
- //初始化列表框,将颜色值和名称赋给它
- void CColorPickerCB::Initialize( void )
- {
- int iAddedItem = -1;
- // If Already Initialized
- if( m_bInitialized )
- return;
- // For All Colors
- for( int iColor = 0; iColor < CCB_MAX_COLORS; iColor++ )
- {
- // Set Color Name/Text
- iAddedItem = AddString( ms_pColors[iColor].m_cColor );
- if( iAddedItem == CB_ERRSPACE )
- break;
- else
- // Set Color RGB Value
- SetItemData( iAddedItem, ms_pColors[
- iColor ].m_crColor );
- }
- // Set Initialized Flag
- m_bInitialized = true;
- }
- //按照列表项的颜色值和名称重画列表框
- void CColorPickerCB::DrawItem( LPDRAWITEMSTRUCT pDIStruct )
- {
- static CString sColor;
- 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 );
- // 联系 CDC对象
- if( !dcContext.Attach( pDIStruct -> hDC ) )
- return;
- //获得1/4的列表项宽度
- iFourthWidth = ( rBlockRect.Width() / 4 );
- //创建黑色画刷
- brFrameBrush.CreateStockObject( BLACK_BRUSH );
- //如果该条目被选择
- if( iState & ODS_SELECTED )
- {
-
- dcContext.SetTextColor(
- ( 0x00FFFFFF & ~( crText ) ) );
- dcContext.SetBkColor( crSelected );
- dcContext.FillSolidRect( &rBlockRect, crSelected );
- }
- else//如果没有被选择
- {
- dcContext.SetTextColor( crText );
- dcContext.SetBkColor( crNormal );
- dcContext.FillSolidRect( &rBlockRect, crNormal );
- }
- //如果该项出于焦点状态
- if( iState & ODS_FOCUS )
- dcContext.DrawFocusRect( &rItemRect );
- //计算文字区域
- rTextRect.left += ( iFourthWidth + 2 );
- rTextRect.top += 2;
-
- //计算图像区域
- rBlockRect.DeflateRect( CSize( 2, 2 ) );
- rBlockRect.right = iFourthWidth;
-
- //显示文字(颜色名)
- if( iItem != -1 )
- {
- GetLBText( iItem, sColor );
- //如果处于不可用状态
- if( iState & ODS_DISABLED )
- {
- crColor = GetSysColor( COLOR_INACTIVECAPTIONTEXT );
- dcContext.SetTextColor( crColor );
- }
- else //如果处于一般状态
- crColor = GetItemData( iItem );
- dcContext.SetBkMode( TRANSPARENT );
- dcContext.TextOut( rTextRect.left, rTextRect.top,sColor );
- //填充颜色区域
- dcContext.FillSolidRect( &rBlockRect, crColor );
-
- //画边框
- dcContext.FrameRect( &rBlockRect, &brFrameBrush );
- }
- //分离CDC对象
- dcContext.Detach();
- }
- //获得选择项的颜色值
- COLORREF CColorPickerCB::GetSelectedColorValue( void )
- {
- //获得选择的条目索引
- int iSelectedItem = GetCurSel();
- //如果没有被选择
- if( iSelectedItem == CB_ERR )
- return( RGB( 0, 0, 0 ) ); // Return Black
- return( GetItemData( iSelectedItem ) );
- }
- //获得选择项的颜色名称
- CString CColorPickerCB::GetSelectedColorName( void )
- {
- //获得选择的条目索引
- int iSelectedItem = GetCurSel();
- //如果没有被选择
- if( iSelectedItem == CB_ERR )
- return( m_sColorName = afxEmptyString );
- GetLBText( iSelectedItem, m_sColorName );
- return( m_sColorName );
- }
- //设定指定颜色值对应的列表项的颜色值
- void CColorPickerCB::SetSelectedColorValue( COLORREF crClr )
- {
- int iItems = GetCount();
-
- for( int iItem = 0; iItem < iItems; iItem++ )
- {
- if( crClr == GetItemData( iItem ) )
- SetCurSel( iItem );
- }
- return;
- }
- //设定指定颜色名称对应列表项的名称
- void CColorPickerCB::SetSelectedColorName( PCSTR cpColor )
- {
- int iItems = GetCount();
- CString sColorName;
- for( int iItem = 0; iItem < iItems; iItem++ )
- {
- GetLBText( iItem, sColorName );
- if( !sColorName.CompareNoCase( cpColor ) )
- SetCurSel( iItem );
- }
- }
- //删除指定颜色名称对应的列表项
- bool CColorPickerCB::RemoveColor( PCSTR cpColor )
- {
- int iItems = GetCount();
- CString sColor;
- bool bRemoved = false;
- for( int iItem = 0; iItem < iItems; iItem++ )
- {
- GetLBText( iItem, sColor );
- if( !sColor.CompareNoCase( cpColor ) )
- {
- DeleteString( iItem );
- bRemoved = true;
- break;
- }
- }
- return( bRemoved );
- }
- //删除指定颜色值对应的列表项
- bool CColorPickerCB::RemoveColor( COLORREF crClr )
- {
- int iItems = GetCount();
- bool bRemoved = false;
- for( int iItem = 0; iItem < iItems; iItem++ )
- {
- if( crClr == GetItemData( iItem ) )
- {
- DeleteString( iItem );
- bRemoved = true;
- break;
- }
- }
- return( bRemoved );
- }
- //增加指定颜色名称和颜色值的列表项
- int CColorPickerCB::AddColor( PCSTR cpName, COLORREF crColor )
- {
- int iItem = -1;
- iItem = InsertString( -1, cpName );
- if( iItem != LB_ERR )
- SetItemData( iItem, crColor );
- return( iItem );
- }
-