(6条消息) MFC颜色组合框

1、实现效果如下:

2、基于ComboBox控件进行重绘,以便达到如上效果,添加一个派生类如下:

ColorComboBox.h

  1. #pragma once
  2. // CColorComboBox
  3. class CColorComboBox : public CComboBox
  4. {
  5. DECLARE_DYNAMIC(CColorComboBox)
  6. public:
  7. CColorComboBox();
  8. virtual ~CColorComboBox();
  9. protected:
  10. DECLARE_MESSAGE_MAP()
  11. public:
  12. int AddItem(LPCTSTR lpszText, COLORREF clrValue);
  13. COLORREF GetCurColor();
  14. virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
  15. };


ColorComboBox.cpp

  1. // ColorComboBox.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "ColorComboBox.h"
  5. // CColorComboBox
  6. IMPLEMENT_DYNAMIC(CColorComboBox, CComboBox)
  7. CColorComboBox::CColorComboBox()
  8. {
  9. }
  10. CColorComboBox::~CColorComboBox()
  11. {
  12. }
  13. BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)
  14. END_MESSAGE_MAP()
  15. // CColorComboBox 消息处理程序
  16. int CColorComboBox::AddItem(LPCTSTR lpszText, COLORREF clrValue)
  17. {
  18. int nIndex = AddString(lpszText);
  19. SetItemData(nIndex, clrValue);
  20. return nIndex;
  21. }
  22. COLORREF CColorComboBox::GetCurColor()
  23. {
  24. int nIndex = GetCurSel();
  25. if (nIndex != -1)
  26. {
  27. return GetItemData(nIndex);
  28. }
  29. else
  30. {
  31. return -1;
  32. }
  33. }
  34. void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  35. {
  36. // TODO: 添加您的代码以绘制指定项
  37. //验证是否为组合框控件
  38. ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);
  39. CDC dc ;
  40. dc.Attach(lpDrawItemStruct->hDC);
  41. //获取项目区域
  42. CRect itemRC (lpDrawItemStruct->rcItem);
  43. //定义显示颜色的区域
  44. CRect clrRC = itemRC;
  45. //定义文本区域
  46. CRect textRC = itemRC;
  47. //获取系统文本颜色
  48. COLORREF clrText = GetSysColor(COLOR_WINDOWTEXT);
  49. //选中时的文本颜色
  50. COLORREF clrSelected = GetSysColor(COLOR_HIGHLIGHT);
  51. //获取窗口背景颜色
  52. COLORREF clrNormal = GetSysColor(COLOR_WINDOW);
  53. //获取当前项目索引
  54. int nIndex = lpDrawItemStruct->itemID;
  55. //判断项目状态
  56. int nState = lpDrawItemStruct->itemState;
  57. if(nState & ODS_SELECTED)//处于选中状态
  58. {
  59. dc.SetTextColor((0x00FFFFFF & ~(clrText)));//文本颜色取反
  60. dc.SetBkColor(clrSelected);//设置文本背景颜色
  61. dc.FillSolidRect(&clrRC, clrSelected);//填充项目区域为高亮效果
  62. }
  63. else
  64. {
  65. dc.SetTextColor(clrText);//设置正常的文本颜色
  66. dc.SetBkColor(clrNormal);//设置正常的文本背景颜色
  67. dc.FillSolidRect(&clrRC, clrNormal);
  68. }
  69. if(nState & ODS_FOCUS)//如果项目获取焦点,绘制焦点区域
  70. {
  71. dc.DrawFocusRect(&itemRC);
  72. }
  73. //计算文本区域
  74. int nclrWidth =itemRC.Width()/4;
  75. textRC.left = nclrWidth + 55;
  76. //计算颜色显示区域
  77. clrRC.DeflateRect(2, 2);
  78. clrRC.right = nclrWidth+50;
  79. //绘制颜色文本并且填充颜色区域
  80. if (nIndex != -1)//项目不为空
  81. {
  82. //获取项目颜色
  83. COLORREF clrItem = GetItemData(nIndex);
  84. dc.SetBkMode(TRANSPARENT);
  85. //获取文本
  86. CString szText;
  87. GetLBText(nIndex, szText);
  88. //输出文本
  89. dc.DrawText(szText, textRC, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
  90. dc.FillSolidRect(&clrRC, clrItem);
  91. //输出颜色
  92. dc.FrameRect(&clrRC, &CBrush(RGB(0, 0, 0)) );
  93. }
  94. dc.Detach();
  95. }


3、拖放一个Combo Box控件,修改以下三个属性:

(1)Type(类型):Drop List(下拉列表)

(2)Owner Draw:Fixed(固定)

(3)Has Strings:True

4、为该控件绑定一个CColorComboBox型的控制变量:

(1)声明:CColorComboBox m_colorComboBox;(先包含头文件)

(2)绑定:在DoDataExchange函数中(IDC_COMBO1为控件ID):

DDX_Control(pDX, IDC_COMBO1, m_colorComboBox);

(2)在OnInitDialog函数中初始化控件:

m_colorComboBox.AddItem(_T("淡紫"), RGB(202, 111, 255));
m_colorComboBox.AddItem(_T("淡蓝"), RGB(202,224,245));
m_colorComboBox.AddItem(_T("天蓝"), RGB(68,159,245));
m_colorComboBox.AddItem(_T("红色"), RGB(255, 0, 0));
m_colorComboBox.AddItem(_T("蓝色"), RGB(0, 0, 255));
m_colorComboBox.AddItem(_T("绿色"), RGB(0, 255, 0));
m_colorComboBox.AddItem(_T("黄色"), RGB(255, 255, 0));
m_colorComboBox.AddItem(_T("粉色"), RGB(255, 0, 255));
m_colorComboBox.AddItem(_T("棕色"), RGB(255, 128, 64));
m_colorComboBox.SetCurSel(0);

5、OK,现在就能达到开篇的 图片效果了,可以调用GetCurColor函数获取用户选择的颜色;

(0)

相关推荐