QQ登录

只需一步,快速开始

上位机MFC彩色按钮实例

[ 复制链接 ]
效果演示

上位机MFC彩色按钮实例

上位机MFC彩色按钮实例

例程实现不同颜色按钮显示功能,效果如图。
可以通过下面代码复制使用,或直接下载源代码使用:
请点击此处下载

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

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

文件名称:CBtn.rar 
文件大小:35.51 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



实现过程:
1.新建基于对话框工程,如上图添加几个按钮按钮用于测试。
2.将工程根目录两文件,复制到自己工程,并加载到自己工程。
这样就多出一新类

上位机MFC彩色按钮实例

上位机MFC彩色按钮实例

3.在主对话框中包含类CColorButton的头文件
#include "colorbtn.h"
添加变量
        CColorButton m_btnCancel;
        CColorButton m_btnOK;
        CColorButton m_btnUp;
        CColorButton m_btnDown;
        CColorButton m_btnDelete;
        CColorButton m_btnAdd;

初始初始化,注意按钮控件ID的对应
        VERIFY(m_btnOK.Attach(IDOK, this, CYAN, BLUE, DKCYAN));
        VERIFY(m_btnCancel.Attach(IDCANCEL, this, BLUE, WHITE, DKBLUE));
        VERIFY(m_btnUp.Attach(IDC_BUTTON1, this, RED, WHITE, DKRED));
        VERIFY(m_btnDown.Attach(IDC_BUTTON2, this, GREEN, BLUE, DKYELLOW));
        VERIFY(m_btnDelete.Attach(IDC_BUTTON3, this, YELLOW, BLUE, GREEN));
        VERIFY(m_btnAdd.Attach(IDC_BUTTON4, this, MAGENTA, WHITE, DKMAGENTA));


这样简单的操作后,就可以运行例程了。
下面是两文件的代码,可以复制使用
  1. #ifndef __COLORBTN_H__
  2. #define __COLORBTN_H__


  3. const COLORREF CLOUDBLUE = RGB(128, 184, 223);
  4. const COLORREF WHITE = RGB(255, 255, 255);
  5. const COLORREF BLACK = RGB(1, 1, 1);
  6. const COLORREF DKGRAY = RGB(128, 128, 128);
  7. const COLORREF LTGRAY = RGB(192, 192, 192);
  8. const COLORREF YELLOW = RGB(255, 255, 0);
  9. const COLORREF DKYELLOW = RGB(128, 128, 0);
  10. const COLORREF RED = RGB(255, 0, 0);
  11. const COLORREF DKRED = RGB(128, 0, 0);
  12. const COLORREF BLUE = RGB(0, 0, 255);
  13. const COLORREF DKBLUE = RGB(0, 0, 128);
  14. const COLORREF CYAN = RGB(0, 255, 255);
  15. const COLORREF DKCYAN = RGB(0, 128, 128);
  16. const COLORREF GREEN = RGB(0, 255, 0);
  17. const COLORREF DKGREEN = RGB(0, 128, 0);
  18. const COLORREF MAGENTA = RGB(255, 0, 255);
  19. const COLORREF DKMAGENTA = RGB(128, 0, 128);

  20. class CColorButton : public CButton
  21. {
  22. DECLARE_DYNAMIC(CColorButton)
  23. public:
  24.         CColorButton();
  25.         virtual ~CColorButton();

  26.         BOOL Attach(const UINT nID, CWnd* pParent,
  27.                 const COLORREF BGColor = RGB(192, 192, 192),                // gray button
  28.                 const COLORREF FGColor = RGB(1, 1, 1),                                // black text
  29.                 const COLORREF DisabledColor = RGB(128, 128, 128),        // dark gray disabled text
  30.                 const UINT nBevel = 2
  31.         );

  32.        
  33. protected:
  34.         virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
  35.         void DrawFrame(CDC *DC, CRect R, int Inset);
  36.         void DrawFilledRect(CDC *DC, CRect R, COLORREF color);
  37.         void DrawLine(CDC *DC, CRect EndPoints, COLORREF color);
  38.         void DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color);
  39.         void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);

  40.         COLORREF GetFGColor() { return m_fg; }       
  41.         COLORREF GetBGColor() { return m_bg; }
  42.     COLORREF GetDisabledColor() { return m_disabled; }
  43.         UINT GetBevel() { return m_bevel; }

  44. private:
  45.         COLORREF m_fg, m_bg, m_disabled;
  46.         UINT m_bevel;

  47. };
  48. #endif
复制代码


  1. #include "stdafx.h"
  2. #include "colorbtn.h"
  3.   
  4. #ifdef _DEBUG
  5. #undef THIS_FILE
  6. static char BASED_CODE THIS_FILE[] = __FILE__;
  7. #endif

  8. // no automatic class substitution for this file!
  9. #ifdef CColorButton
  10. #undef CColorButton      CColorButton
  11. #endif

  12. // CColorButton
  13. IMPLEMENT_DYNAMIC(CColorButton, CButton)

  14. CColorButton::CColorButton()
  15. {  
  16. #if (_MFC_VER < 0x0250)
  17.   hwndOwner = NULL;  // initialize hwndOwner for GetOwner() and SetOwner() support in MFC < 2.5
  18. #endif
  19. }



  20. CColorButton::~CColorButton()
  21. {
  22. }



  23. BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor, const COLORREF DisabledColor, const UINT nBevel)
  24. {
  25.         if (!SubclassDlgItem(nID, pParent))
  26.                 return FALSE;

  27.         m_fg = FGColor;
  28.         m_bg = BGColor;
  29.         m_disabled = DisabledColor;
  30.         m_bevel = nBevel;

  31.         return TRUE;
  32. }


  33. void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  34. {
  35.         CDC* pDC = CDC::FromHandle(lpDIS->hDC);

  36.         UINT state = lpDIS->itemState;
  37.         CRect focusRect, btnRect;
  38.         focusRect.CopyRect(&lpDIS->rcItem);
  39.         btnRect.CopyRect(&lpDIS->rcItem);

  40.         //
  41.         // Set the focus rectangle to just past the border decoration
  42.         //
  43.         focusRect.left += 4;
  44.     focusRect.right -= 4;
  45.     focusRect.top += 4;
  46.     focusRect.bottom -= 4;
  47.       
  48.         //
  49.         // Retrieve the button's caption
  50.         //
  51.     const int bufSize = 512;
  52.     TCHAR buffer[bufSize];
  53.     GetWindowText(buffer, bufSize);
  54.        

  55.         //
  56.         // Draw and label the button using draw methods
  57.         //
  58.     DrawFilledRect(pDC, btnRect, GetBGColor());
  59.     DrawFrame(pDC, btnRect, GetBevel());
  60.           DrawButtonText(pDC, btnRect, buffer, GetFGColor());


  61.         //
  62.         // Now, depending upon the state, redraw the button (down image) if it is selected,
  63.         // place a focus rectangle on it, or redisplay the caption if it is disabled
  64.         //
  65.         if (state & ODS_FOCUS) {
  66.                 DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);
  67.                 if (state & ODS_SELECTED){
  68.                     DrawFilledRect(pDC, btnRect, GetBGColor());
  69.                     DrawFrame(pDC, btnRect, -1);
  70.                           DrawButtonText(pDC, btnRect, buffer, GetFGColor());
  71.                         DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);
  72.                 }
  73.         }
  74.         else if (state & ODS_DISABLED) {
  75.             //COLORREF disabledColor = bg ^ 0xFFFFFF; // contrasting color
  76.                   DrawButtonText(pDC, btnRect, buffer, GetDisabledColor());
  77.     }
  78. }


  79. void CColorButton::DrawFrame(CDC *DC, CRect R, int Inset)
  80. {
  81.         COLORREF dark, light, tlColor, brColor;
  82.         int i, m, width;
  83.         width = (Inset < 0)? -Inset : Inset;
  84.        
  85.         for (i = 0; i < width; i += 1) {
  86.                 m = 255 / (i + 2);
  87.                 dark = PALETTERGB(m, m, m);
  88.                 m = 192 + (63 / (i + 1));
  89.                 light = PALETTERGB(m, m, m);
  90.                   
  91.                   if ( width == 1 ) {
  92.                         light = RGB(255, 255, 255);
  93.                         dark = RGB(128, 128, 128);
  94.                 }
  95.                
  96.                 if ( Inset < 0 ) {
  97.                         tlColor = dark;
  98.                         brColor = light;
  99.                 }
  100.                 else {
  101.                         tlColor = light;
  102.                         brColor = dark;
  103.                 }
  104.                
  105.                 DrawLine(DC, R.left, R.top, R.right, R.top, tlColor);                                                        // Across top
  106.                 DrawLine(DC, R.left, R.top, R.left, R.bottom, tlColor);                                                        // Down left
  107.           
  108.                 if ( (Inset < 0) && (i == width - 1) && (width > 1) ) {
  109.                         DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));// Across bottom
  110.                         DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1));        // Down right
  111.                 }
  112.                   else {
  113.                         DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, brColor);                // Across bottom
  114.                         DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, brColor);                // Down right
  115.                 }
  116.                   InflateRect(R, -1, -1);
  117.         }
  118. }



  119. void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)
  120. {
  121.         CBrush B;
  122.         B.CreateSolidBrush(color);
  123.         DC->FillRect(R, &B);
  124. }


  125. void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color)
  126. {
  127.         CPen newPen;
  128.         newPen.CreatePen(PS_SOLID, 1, color);
  129.         CPen *oldPen = DC->SelectObject(&newPen);
  130.         DC->MoveTo(EndPoints.left, EndPoints.top);
  131.         DC->LineTo(EndPoints.right, EndPoints.bottom);
  132.         DC->SelectObject(oldPen);
  133.     newPen.DeleteObject();
  134. }

  135. void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color)
  136. {
  137.         CPen newPen;
  138.         newPen.CreatePen(PS_SOLID, 1, color);
  139.         CPen *oldPen = DC->SelectObject(&newPen);
  140.         DC->MoveTo(left, top);
  141.         DC->LineTo(right, bottom);
  142.         DC->SelectObject(oldPen);
  143.     newPen.DeleteObject();
  144. }


  145. void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)
  146. {
  147.     COLORREF prevColor = DC->SetTextColor(TextColor);
  148.     DC->SetBkMode(TRANSPARENT);
  149.         DC->DrawText(Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  150.         DC->SetTextColor(prevColor);
  151. }


  152.                







复制代码


回复

使用道具 举报

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