开发文章

MFC中的CMFCColorButton的使用详解

MFC中CMFCColorButton是Visual Studio 2008 SP1版本或更高版本才提供的,用来对颜色的选取采集
下面介绍一下,CMFCColorButton的使用方法

1.新建对话框的工程,名称为MyColorButtonDemo
2.对话框上添加一个按钮,并将按钮绑定变量类型为CMFCColorButton,变量名为m_ColorPicker

MFC绑定变量图例.png
 

3.为按钮添加相关事件

C/C++ Code复制内容到剪贴板
  1. void CMyColorButtonDemoDlg::OnBnClickedButton1()   
  2. {   
  3.     COLORREF color = m_ColorPicker.GetColor();   
  4.     if (color == -1)   
  5.     {   
  6.         color = m_ColorPicker.GetAutomaticColor();   
  7.     }   
  8. }  

4.在对话框的OnInitDialog() 函数里面添加以下代码:

C/C++ Code复制内容到剪贴板
  1. BOOL CMyColorButtonDemoDlg::OnInitDialog()   
  2. {   
  3.     CDialog::OnInitDialog();   
  4.     //中间省略·····   
  5.    
  6.     m_ColorPicker.EnableAutomaticButton(_T("默认值"), RGB(0, 0, 0));   
  7.     m_ColorPicker.EnableOtherButton(_T("其余颜色"));   
  8.     m_ColorPicker.SetColor((COLORREF)-1);   
  9.     m_ColorPicker.SetColumnsNumber(10);       
  10.    
  11.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE   
  12. }   

.在新建工程时,都有一个InitInstance函数的,找到这个函数添加如下代码
不添加下面的代码其实编译运行就可以看到效果了,但是没有应用系统主题

C/C++ Code复制内容到剪贴板
  1. BOOL CMyColorButtonDemoApp::InitInstance()   
  2. {   
  3.     //·····   
  4.     SetRegistryKey(_T("应用程序向导生成的本地应用程序"));   
  5.     CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); //这一句   
  6.     CMyColorButtonDemoDlg dlg;   
  7.     //····   
  8. }   

运行效果图

CMFCColorButton运行效果图.png

如果要改造这个按钮,比如右边的三角下拉不是很好看,要改动话就要派生自CMFCColorButton来重写OnDraw函数,在这里我要去掉右边的三角下拉,还有去掉

那默认值的文本。重载之后的OnDraw函数如下:

C/C++ Code复制内容到剪贴板
  1. void CSkinColorButton::OnDraw(CDC* pDC, const CRect& rect, UINT uiState)  
  2. {  
  3.     ASSERT_VALID(pDC);  
  4.   
  5.     if (m_pPalette == NULL)  
  6.     {  
  7.         RebuildPalette(NULL);  
  8.     }  
  9.   
  10.     CPalette* pCurPalette = pDC->SelectPalette(m_pPalette, FALSE);  
  11.     pDC->RealizePalette();  
  12.   
  13.     CSize sizeArrow = CMenuImages::Size();  
  14.   
  15.     CRect rectColor = rect;  
  16.       
  17.     COLORREF color = m_Color;  
  18.     if (color == (COLORREF) -1) // Automatic  
  19.     {  
  20.         //---------------------------  
  21.         // Draw automatic text label:  
  22.         //---------------------------  
  23.         color = m_ColorAutomatic;  
  24.           
  25.     }  
  26.   
  27.     //----------------  
  28.     // Draw color box:  
  29.     //----------------  
  30.     rectColor.DeflateRect(2, 2);  
  31.     pDC->Draw3dRect(rectColor, afxGlobalData.clrBtnHilite, afxGlobalData.clrBtnHilite);  
  32.     rectColor.DeflateRect(1, 1);  
  33.     pDC->Draw3dRect(rectColor, afxGlobalData.clrBtnDkShadow, afxGlobalData.clrBtnDkShadow);  
  34.     rectColor.DeflateRect(1, 1);  
  35.   
  36.     if (color != (COLORREF)-1 &&(uiState & ODS_DISABLED) == 0)  
  37.     {  
  38.         if (afxGlobalData.m_nBitsPerPixel == 8) // 256 colors  
  39.         {  
  40.             ASSERT_VALID(m_pPalette);  
  41.             color =  PALETTEINDEX(m_pPalette->GetNearestPaletteIndex(color));  
  42.         }  
  43.   
  44.         CBrush br(color);  
  45.         pDC->FillRect(rectColor, &br);  
  46.     }     
  47.   
  48.     if (pCurPalette != NULL)  
  49.     {  
  50.         pDC->SelectPalette(pCurPalette, FALSE);  
  51.     }  
  52. }  

还有重载OnDrawFocusRect函数,这是获得焦点时的矩形,重载后如下

C/C++ Code复制内容到剪贴板
  1. void CSkinColorButton::OnDrawFocusRect(CDC* pDC, const CRect& rectClient)  
  2. {  
  3.     CSize sizeArrow = CMenuImages::Size();  
  4.   
  5.     CRect rectColor = rectClient;     
  6.   
  7.     CMFCButton::OnDrawFocusRect(pDC, rectColor);  
  8. }  

重绘后的效果图

重绘CMFCColorButton运行效果图.png

参考资料
http://msdn.microsoft.com/en-us/library/bb983854.aspx

文章信息

发布时间:2014-01-24

发布者:aquwcw

浏览次数: