效果演示
上位机MFC颜色选择组合框
当前例程实现组合框颜色选择功能,效果如上图,
可以通过组合框选择不同的颜色,
通过两个按钮可以对颜色进行操作。
主要是派生一个自己的类来实现
class CColorPickerCB : public CComboBox
实现过程
也是在自己的工程中导入集成类对应的两文件COLORPICKERCB.CPP,COLORPICKERCB.H.
包含头文件后,实例化一个组合框对象。
可以复制两文件源代码使用或直接下载例程学习:
- #if !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
- #define AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_
- #if _MSC_VER >= 1000
- #pragma once
- #endif // _MSC_VER >= 1000
- //
- // Constants...
- //
- #define CCB_MAX_COLORS 16 // Colors In List
- #define CCB_MAX_COLOR_NAME 16 // Max Chars For Color Name - 1
- //
- // Internal Structure For Color/Name Storage...
- //
- struct SColorAndName
- {
- /**/ SColorAndName()
- {
- ZeroMemory( this, sizeof( SColorAndName ) ); // Init Structure
- };
- /**/ SColorAndName( COLORREF crColor, PCSTR cpColor )
- {
- ZeroMemory( this, sizeof( SColorAndName ) ); // Init Structure
- m_crColor = crColor; // Set Color RGB Value
- strncpy( m_cColor, cpColor, CCB_MAX_COLOR_NAME ); // Set Color Name
- };
- COLORREF m_crColor; // Actual Color RGB Value
- char m_cColor[ CCB_MAX_COLOR_NAME ]; // Actual Name For Color
- };
- class CColorPickerCB : public CComboBox
- {
- // Construction
- public:
- CColorPickerCB();
- // Attributes
- private:
- bool m_bInitialized; // Control Initialized?
- CString m_sColorName; // Name Of Selected Color
- static
- SColorAndName ms_pColors[ CCB_MAX_COLORS ]; // Array Of Colors And Names
- private:
- void Initialize( void ); // Initialize Control/Colors
- public:
- COLORREF GetSelectedColorValue( void ); // Get Selected Color Value
- CString GetSelectedColorName( void ); // Get Selected Color Name
- void SetSelectedColorValue( COLORREF crClr );// Set Selected Color Value
- void SetSelectedColorName( PCSTR cpColor ); // Set Selected Color Name
- bool RemoveColor( PCSTR cpColor ); // Remove Color From List
- bool RemoveColor( COLORREF crClr ); // Remove Color From List
-
- int AddColor( PCSTR cpNam, COLORREF crClr );// Insert A New Color
- // Overrides
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CColorPickerCB)
- protected:
- virtual void PreSubclassWindow();
- //}}AFX_VIRTUAL
- virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
- // Implementation
- public:
- virtual ~CColorPickerCB();
- // Generated message map functions
- protected:
- //{{AFX_MSG(CColorPickerCB)
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- /////////////////////////////////////////////////////////////////////////////
- //{{AFX_INSERT_LOCATION}}
- // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
- #endif // !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
复制代码- #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
- }
-
复制代码
|