📄 colorpickercb.cpp
字号:
#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 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -