QQ登录

只需一步,快速开始

上位机MFC颜色选择组合框

[ 复制链接 ]
效果演示

上位机MFC颜色选择组合框

上位机MFC颜色选择组合框

当前例程实现组合框颜色选择功能,效果如上图,
可以通过组合框选择不同的颜色,
通过两个按钮可以对颜色进行操作。
主要是派生一个自己的类来实现
class CColorPickerCB : public CComboBox

实现过程
也是在自己的工程中导入集成类对应的两文件COLORPICKERCB.CPP,COLORPICKERCB.H.
包含头文件后,实例化一个组合框对象。
可以复制两文件源代码使用或直接下载例程学习:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:上位机MFC颜色选择组合框.rar 
文件大小:35.31 KB  售价:1金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  1. #if !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
  2. #define AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_

  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000

  6. //
  7. //        Constants...
  8. //
  9. #define                CCB_MAX_COLORS                        16                                                        // Colors In List
  10. #define                CCB_MAX_COLOR_NAME                16                                                        // Max Chars For Color Name - 1


  11. //
  12. //        Internal Structure For Color/Name Storage...
  13. //
  14. struct        SColorAndName
  15. {
  16.         /**/        SColorAndName()
  17.         {
  18.                 ZeroMemory( this, sizeof( SColorAndName ) );                // Init Structure
  19.         };
  20.         /**/        SColorAndName( COLORREF crColor, PCSTR cpColor )
  21.         {
  22.                 ZeroMemory( this, sizeof( SColorAndName ) );                // Init Structure
  23.                 m_crColor = crColor;                                                                // Set Color RGB Value
  24.                 strncpy( m_cColor, cpColor, CCB_MAX_COLOR_NAME );        // Set Color Name
  25.         };
  26.         COLORREF        m_crColor;                                                                        // Actual Color RGB Value
  27.         char                m_cColor[ CCB_MAX_COLOR_NAME ];                                // Actual Name For Color
  28. };



  29. class CColorPickerCB : public CComboBox
  30. {
  31. // Construction
  32. public:
  33.         CColorPickerCB();

  34. // Attributes
  35. private:
  36.         bool                        m_bInitialized;                                                        // Control Initialized?
  37.         CString                        m_sColorName;                                                        // Name Of Selected Color
  38.         static
  39.         SColorAndName        ms_pColors[ CCB_MAX_COLORS ];                        // Array Of Colors And Names

  40. private:

  41.         void                        Initialize( void );                                                // Initialize Control/Colors

  42. public:
  43.         COLORREF                GetSelectedColorValue( void );                        // Get Selected Color Value
  44.         CString                        GetSelectedColorName( void );                        // Get Selected Color Name

  45.         void                        SetSelectedColorValue( COLORREF crClr );// Set Selected Color Value
  46.         void                        SetSelectedColorName( PCSTR cpColor );        // Set Selected Color Name

  47.         bool                        RemoveColor( PCSTR cpColor );                        // Remove Color From List
  48.         bool                        RemoveColor( COLORREF crClr );                        // Remove Color From List
  49.        
  50.         int                                AddColor( PCSTR cpNam, COLORREF crClr );// Insert A New Color

  51. // Overrides
  52.         // ClassWizard generated virtual function overrides
  53.         //{{AFX_VIRTUAL(CColorPickerCB)
  54.         protected:
  55.         virtual void PreSubclassWindow();
  56.         //}}AFX_VIRTUAL
  57.         virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

  58. // Implementation
  59. public:
  60.         virtual        ~CColorPickerCB();

  61.         // Generated message map functions
  62. protected:
  63.         //{{AFX_MSG(CColorPickerCB)
  64.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  65.         //}}AFX_MSG

  66.         DECLARE_MESSAGE_MAP()
  67. };

  68. /////////////////////////////////////////////////////////////////////////////

  69. //{{AFX_INSERT_LOCATION}}
  70. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  71. #endif // !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
复制代码
  1. #include "stdafx.h"
  2. #include "ColorPickerCB.h"

  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif


  8. //
  9. //        Load Standard Colors...
  10. //        (If You Change This, Be Sure To Load CCB_MAX_COLORS Colors...)
  11. //
  12. SColorAndName        CColorPickerCB::ms_pColors[ CCB_MAX_COLORS ] =
  13. {
  14.         SColorAndName( RGB( 0x00, 0x00, 0x00 ),        "Black" ),
  15.         SColorAndName( RGB( 0x80, 0x00, 0x00 ),        "Maroon" ),
  16.         SColorAndName( RGB( 0x00, 0x80, 0x00 ),        "Green" ),
  17.         SColorAndName( RGB( 0x80, 0x80, 0x00 ),        "Olive" ),
  18.         SColorAndName( RGB( 0x00, 0x00, 0x80 ),        "Navy" ),
  19.         SColorAndName( RGB( 0x80, 0x00, 0x80 ),        "Purple" ),
  20.         SColorAndName( RGB( 0x00, 0x80, 0x80 ),        "Teal" ),
  21.         SColorAndName( RGB( 0x80, 0x80, 0x80 ),        "Grey" ),
  22.         SColorAndName( RGB( 0xC0, 0xC0, 0xC0 ),        "Silver" ),
  23.         SColorAndName( RGB( 0xFF, 0x00, 0x00 ),        "Red" ),
  24.         SColorAndName( RGB( 0x00, 0xFF, 0x00 ),        "Lime" ),
  25.         SColorAndName( RGB( 0xFF, 0xFF, 0x00 ),        "Yellow" ),
  26.         SColorAndName( RGB( 0x00, 0x00, 0xFF ),        "Blue" ),
  27.         SColorAndName( RGB( 0xFF, 0x00, 0xFF ),        "Fushcia" ),
  28.         SColorAndName( RGB( 0x00, 0xFF, 0xFF ),        "Aqua" ),
  29.         SColorAndName( RGB( 0xFF, 0xFF, 0xFF ),        "White" ),
  30. };


  31. CColorPickerCB::CColorPickerCB()
  32. {
  33.         m_bInitialized = false;
  34. }


  35. CColorPickerCB::~CColorPickerCB()
  36. {
  37. }


  38. BEGIN_MESSAGE_MAP(CColorPickerCB, CComboBox)
  39.         //{{AFX_MSG_MAP(CColorPickerCB)
  40.         ON_WM_CREATE()
  41.         //}}AFX_MSG_MAP
  42. END_MESSAGE_MAP()

  43. /////////////////////////////////////////////////////////////////////////////
  44. // CColorPickerCB message handlers

  45. int CColorPickerCB::OnCreate( LPCREATESTRUCT pCStruct )
  46. {
  47.         if( CComboBox::OnCreate( pCStruct ) == -1 )                                // If Create Failed
  48.                 return( -1 );                                                                                // Return Failure
  49.        
  50.         Initialize();                                                                                        // Initialize Contents
  51.         SetCurSel( 0 );                                                                                        // Select First Item By Default

  52.         return( 0 );                                                                                        // Done!
  53. }


  54. void CColorPickerCB::PreSubclassWindow()
  55. {
  56.         Initialize();                                                                                        // Initialize Contents
  57.        
  58.         CComboBox::PreSubclassWindow();                                                        // Subclass Control

  59.         SetCurSel( 0 );                                                                                        // Select First Item By Default

  60.         return;                                                                                                        // Done!
  61. }


  62. void CColorPickerCB::Initialize( void )
  63. {
  64.         int                iAddedItem = -1;

  65.         if( m_bInitialized )                                                                        // If Already Initialized
  66.                 return;                                                                                                // Return

  67.         for( int iColor = 0; iColor < CCB_MAX_COLORS; iColor++ )// For All Colors
  68.         {
  69.                 iAddedItem = AddString(        ms_pColors[
  70.                                         iColor ].m_cColor );                                        // Set Color Name/Text
  71.                 if( iAddedItem == CB_ERRSPACE )                                                // If Not Added
  72.                         break;                                                                                        // Stop
  73.                 else                                                                                                // If Added Successfully
  74.                         SetItemData( iAddedItem, ms_pColors[
  75.                                         iColor ].m_crColor );                                        // Set Color RGB Value
  76.         }
  77.         m_bInitialized = true;                                                                        // Set Initialized Flag
  78. }


  79. void                CColorPickerCB::DrawItem( LPDRAWITEMSTRUCT pDIStruct )
  80. {
  81.         static                CString        sColor;                                                                // No Need To Reallocate Each Time

  82.         CDC                        dcContext;
  83.         CRect                rItemRect( pDIStruct -> rcItem );
  84.         CRect                rBlockRect( rItemRect );
  85.         CRect                rTextRect( rBlockRect );
  86.         CBrush                brFrameBrush;
  87.         int                        iFourthWidth = 0;
  88.         int                        iItem = pDIStruct -> itemID;
  89.         int                        iAction = pDIStruct -> itemAction;
  90.         int                        iState = pDIStruct -> itemState;
  91.         COLORREF        crColor = 0;
  92.         COLORREF        crNormal = GetSysColor( COLOR_WINDOW );
  93.         COLORREF        crSelected = GetSysColor( COLOR_HIGHLIGHT );
  94.         COLORREF        crText = GetSysColor( COLOR_WINDOWTEXT );

  95.         if( !dcContext.Attach( pDIStruct -> hDC ) )                                // Attach CDC Object
  96.                 return;                                                                                                // Stop If Attach Failed

  97.         iFourthWidth = ( rBlockRect.Width() / 4 );                                // Get 1/4 Of Item Area
  98.         brFrameBrush.CreateStockObject( BLACK_BRUSH );                        // Create Black Brush

  99.         if( iState & ODS_SELECTED )                                                                // If Selected
  100.         {                                                                                                                // Set Selected Attributes
  101.                 dcContext.SetTextColor(
  102.                                 ( 0x00FFFFFF & ~( crText ) ) );                                // Set Inverted Text Color (With Mask)
  103.                 dcContext.SetBkColor( crSelected );                                        // Set BG To Highlight Color
  104.                 dcContext.FillSolidRect( &rBlockRect, crSelected );        // Erase Item
  105.         }
  106.         else                                                                                                        // If Not Selected
  107.         {                                                                                                                // Set Standard Attributes
  108.                 dcContext.SetTextColor( crText );                                        // Set Text Color
  109.                 dcContext.SetBkColor( crNormal );                                        // Set BG Color
  110.                 dcContext.FillSolidRect( &rBlockRect, crNormal );        // Erase Item
  111.         }
  112.         if( iState & ODS_FOCUS )                                                                // If Item Has The Focus
  113.                 dcContext.DrawFocusRect( &rItemRect );                                // Draw Focus Rect

  114.         //
  115.         //        Calculate Text Area
  116.         //
  117.         rTextRect.left += ( iFourthWidth + 2 );                                        // Set Start Of Text
  118.         rTextRect.top += 2;                                                                                // Offset A Bit

  119.         //
  120.         //        Calculate Color Block Area
  121.         //
  122.         rBlockRect.DeflateRect( CSize( 2, 2 ) );                                // Reduce Color Block Size
  123.         rBlockRect.right = iFourthWidth;                                                // Set Width Of Color Block

  124.         //
  125.         //        Draw Color Text And Block
  126.         //
  127.         if( iItem != -1 )                                                                                // If Not An Empty Item
  128.         {
  129.                 GetLBText( iItem, sColor );                                                        // Get Color Text
  130.                 if( iState & ODS_DISABLED )                                                        // If Disabled
  131.                 {
  132.                         crColor = GetSysColor( COLOR_INACTIVECAPTIONTEXT );
  133.                         dcContext.SetTextColor( crColor );                                // Set Text Color
  134.                 }
  135.                 else                                                                                                // If Normal
  136.                         crColor = GetItemData( iItem );                                        // Get Color Value

  137.                 dcContext.SetBkMode( TRANSPARENT );                                        // Transparent Background
  138.                 dcContext.TextOut( rTextRect.left, rTextRect.top,
  139.                                 sColor );                                                                        // Draw Color Name

  140.                 dcContext.FillSolidRect( &rBlockRect, crColor );        // Draw Color
  141.                                
  142.                 dcContext.FrameRect( &rBlockRect, &brFrameBrush );        // Draw Frame
  143.         }
  144.         dcContext.Detach();                                                                                // Detach DC From Object
  145. }


  146. COLORREF        CColorPickerCB::GetSelectedColorValue( void )
  147. {
  148.         int                iSelectedItem = GetCurSel();                                        // Get Selected Item

  149.         if( iSelectedItem == CB_ERR )                                                        // If Nothing Selected
  150.                 return( RGB( 0, 0, 0 ) );                                                        // Return Black

  151.         return( GetItemData( iSelectedItem ) );                                        // Return Selected Color
  152. }


  153. CString                CColorPickerCB::GetSelectedColorName( void )
  154. {
  155.         int                iSelectedItem = GetCurSel();                                        // Get Selected Item

  156.         if( iSelectedItem == CB_ERR )                                                        // If Nothing Selected
  157.                 return( m_sColorName = afxEmptyString );                        // Return Nothing (Not "Black!")

  158.         GetLBText( iSelectedItem, m_sColorName );                                // Store Name Of Color

  159.         return( m_sColorName );                                                                        // Return Selected Color Name
  160. }


  161. void                CColorPickerCB::SetSelectedColorValue( COLORREF crClr )
  162. {
  163.         int                iItems = GetCount();
  164.        
  165.         for( int iItem = 0; iItem < iItems; iItem++ )
  166.         {
  167.                 if( crClr == GetItemData( iItem ) )                                        // If Match Found
  168.                         SetCurSel( iItem );                                                                // Select It
  169.         }
  170.         return;                                                                                                        // Done!
  171. }


  172. void                CColorPickerCB::SetSelectedColorName( PCSTR cpColor )
  173. {
  174.         int                iItems = GetCount();
  175.         CString        sColorName;

  176.         for( int iItem = 0; iItem < iItems; iItem++ )
  177.         {
  178.                 GetLBText( iItem, sColorName );                                                // Get Color Name

  179.                 if( !sColorName.CompareNoCase( cpColor ) )                        // If Match Found
  180.                         SetCurSel( iItem );                                                                // Select It
  181.         }
  182.         return;                                                                                                        // Done!
  183. }


  184. bool                CColorPickerCB::RemoveColor( PCSTR cpColor )
  185. {
  186.         int                iItems = GetCount();
  187.         CString        sColor;
  188.         bool        bRemoved = false;

  189.         for( int iItem = 0; iItem < iItems; iItem++ )
  190.         {
  191.                 GetLBText( iItem, sColor );                                                        // Get Color Name
  192.                 if( !sColor.CompareNoCase( cpColor ) )                                // If Match Found
  193.                 {
  194.                         DeleteString( iItem );                                                        // Remove It
  195.                         bRemoved = true;                                                                // Set Flag
  196.                         break;                                                                                        // Stop Checking
  197.                 }
  198.         }
  199.         return( bRemoved );                                                                                // Done!
  200. }


  201. bool                CColorPickerCB::RemoveColor( COLORREF crClr )
  202. {
  203.         int                iItems = GetCount();
  204.         bool        bRemoved = false;

  205.         for( int iItem = 0; iItem < iItems; iItem++ )
  206.         {
  207.                 if( crClr == GetItemData( iItem ) )                                        // If Desired Color Found
  208.                 {
  209.                         DeleteString( iItem );                                                        // Remove It
  210.                         bRemoved = true;                                                                // Set Flag
  211.                         break;                                                                                        // Stop Checking
  212.                 }
  213.         }
  214.         return( bRemoved );                                                                                // Done!
  215. }


  216. int                        CColorPickerCB::AddColor( PCSTR cpName, COLORREF crColor )
  217. {
  218.         int                iItem = -1;

  219.         iItem = InsertString( -1, cpName );                                                // Insert String
  220.         if( iItem != LB_ERR )                                                                        // If Insert Good
  221.                 SetItemData( iItem, crColor );                                                // Set Color Value

  222.         return( iItem );                                                                                // Done! Return Location
  223. }


  224.        
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索