QQ登录

只需一步,快速开始

上位机MFC高亮单选按钮实例

[ 复制链接 ]

效果演示

上位机MFC高亮单选按钮实例

上位机MFC高亮单选按钮实例

例程与Web页面中弹出按钮相似,鼠标上移会高亮。
使用用到一个集成类,类的头文件与源文件源代码在尾部,可以复制使用,
或下载工程源代码学习:
请点击此处下载

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

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

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



实现过程:
1.新建一个基于对话框的应用程序,并按上图添加按钮控件,并排版。
2.将工程根目录两文件HOVERBUTTON.CPP,HOVERBUTTON.G复制到自己工程目录中,
并载入到项目中,这样工程中就多出一个集成类,如图:

上位机MFC高亮单选按钮实例

上位机MFC高亮单选按钮实例


3.在主对话框类中包含头文件#include "HoverButton.h",
并添加按钮对象,初始初始化
        CHoverButton        m_button4;
        CHoverButton        m_button3;
        CHoverButton        m_button2;
        CHoverButton        m_button1;


void CCBtnDlg:oDataExchange(CDataExchange* pDX)
{
        CDialog:oDataExchange(pDX);
        //{{AFX_DATA_MAP(CCBtnDlg)
                // NOTE: the ClassWizard will add DDX and DDV calls here
        DDX_Control(pDX, IDC_BUTTON4, m_button4);
        DDX_Control(pDX, IDC_BUTTON3, m_button3);
        DDX_Control(pDX, IDC_BUTTON2, m_button2);
        DDX_Control(pDX, IDC_BUTTON1, m_button1);
        //}}AFX_DATA_MAP
}

初始化按钮图标
        m_button4.LoadBitmaps(IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX);
        m_button3.LoadBitmaps(IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX);
        m_button2.LoadBitmaps(IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX);
        m_button1.LoadBitmaps(IDB_RBU, IDB_RBD, IDB_RBF, IDB_RBX);

使用的一些图标,可以使用目录内的,也可以自己创建,图标ID要一致
IDB_RBD
IDB_RBF
IDB_RBU
IDB_RBX

4.编译运行就可以看到效果,下面可以进一步实现按钮单选效果
添加函数与变量
        int m_nSelected;
        int RefreshButtons(int nSelected);

int CHovbuttDlg::RefreshButtons(int nSelected /*=0*/ )
{
        m_button1.SetButtonState(BUTTON_OFF);
        m_button2.SetButtonState(BUTTON_OFF);
        m_button3.SetButtonState(BUTTON_GREYED);
        m_button4.SetButtonState(BUTTON_OFF);

        switch(nSelected)
        {
        case 2:
                m_button2.SetButtonState(BUTTON_ON);
                break;
        case 3:
                m_button3.SetButtonState(BUTTON_ON);
                break;
        case 4:
                m_button4.SetButtonState(BUTTON_ON);
                break;
        default:
                m_button1.SetButtonState(BUTTON_ON);
                nSelected = 1;
                m_nSelected = nSelected;
                break;
        }

        return nSelected;
}

并在初始化时调用函数与初始变量
        m_nSelected = 1;
        // Redraw the buttons in their various states
        RefreshButtons(m_nSelected);

然后是按钮的点击函数的实现
  1. void CCBtnDlg::OnButton1()
  2. {
  3.         m_nSelected        = 1;
  4.         RefreshButtons(m_nSelected);
  5.         // Do some process (1)
  6. }

  7. void CCBtnDlg::OnButton2()
  8. {
  9.         m_nSelected        = 2;
  10.         RefreshButtons(m_nSelected);
  11.         // Do some process (2)
  12. }

  13. void CCBtnDlg::OnButton3()
  14. {
  15.         m_nSelected        = 3;
  16.         RefreshButtons(m_nSelected);
  17.         // Do some process (3)
  18. }

  19. void CCBtnDlg::OnButton4()
  20. {
  21.         m_nSelected        = 4;
  22.         RefreshButtons(m_nSelected);
  23.         // Do some process (4)
  24. }
复制代码


5.执行编译,就可以运行例程查看效果了。下面是集成类文件的源代码
  1. #if !defined(AFX_HOVERBUTTON_H__1155737E_628E_11D2_81B5_0020AFC24C58__INCLUDED_)
  2. #define AFX_HOVERBUTTON_H__1155737E_628E_11D2_81B5_0020AFC24C58__INCLUDED_

  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. // HoverButton.h : header file
  7. //

  8. /////////////////////////////////////////////////////////////////////////////
  9. // CHoverButton window
  10. enum BUTTON_STATE{ BUTTON_OFF, BUTTON_ON, BUTTON_OVER, BUTTON_GREYED};

  11. class CHoverButton : public CBitmapButton
  12. {
  13. // Construction
  14. public:
  15.         // Constructor: default is to use buttons defined in our resources
  16.         CHoverButton();
  17. // Attributes
  18. public:
  19.         // The only way of accessing data from outside this class is to call these 2 functions
  20.         BUTTON_STATE GetButtonState(void) {        return(m_ButtonState);};
  21.         BUTTON_STATE SetButtonState(BUTTON_STATE nState);

  22. private:
  23.         BOOL                        m_bMouseTracking;
  24.         BUTTON_STATE        m_ButtonState;
  25.         CBitmap                        m_bmpButtonDown;
  26.         CBitmap                        m_bmpButtonFocussed;
  27.         CBitmap                        m_bmpButtonUp;
  28.         CBitmap                        m_bmpButtonDisabled;
  29.         HWND                        m_hWndOld;

  30. // Operations
  31. public:

  32. // Overrides
  33.         // ClassWizard generated virtual function overrides
  34.         //{{AFX_VIRTUAL(CHoverButton)
  35.         public:
  36.         virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  37.         //}}AFX_VIRTUAL
  38. private:
  39.         // Called by OnMouseMove() when entering/leaving the button
  40.         void OnMouseLeave(void);
  41.         void OnMouseEnter(void);

  42. // Implementation
  43. public:
  44.         virtual ~CHoverButton();
  45.         BOOL LoadBitmaps(UINT nBitmapUp, UINT nBitmapDown, UINT nBitmapFocus, UINT nBitmapDisabled);
  46.         BOOL LoadBitmaps(LPCSTR lpszBitmapUp, LPCSTR lpszBitmapDown, LPCSTR lpszBitmapFocus, LPCSTR lpszBitmapDisabled);

  47.         // Generated message map functions
  48. protected:
  49.         //{{AFX_MSG(CHoverButton)
  50.         afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  51.         afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  52.         //}}AFX_MSG
  53.         DECLARE_MESSAGE_MAP()
  54. };

  55. /////////////////////////////////////////////////////////////////////////////

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

  58. #endif // !defined(AFX_HOVERBUTTON_H__1155737E_628E_11D2_81B5_0020AFC24C58__INCLUDED_)

复制代码

  1. #include "stdafx.h"
  2. #include "HoverButton.h"

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

  8. /////////////////////////////////////////////////////////////////////////////
  9. // CHoverButton

  10. BEGIN_MESSAGE_MAP(CHoverButton, CBitmapButton)
  11.         //{{AFX_MSG_MAP(CHoverButton)
  12.         ON_WM_MOUSEMOVE()
  13.         ON_WM_LBUTTONUP()
  14.         //}}AFX_MSG_MAP
  15. END_MESSAGE_MAP()

  16. /////////////////////////////////////////////////////////////////////////////
  17. // CHoverButton construction / destruction

  18. CHoverButton::CHoverButton()
  19. {
  20.         // To start with, the button is switched off and we are NOT tracking the mouse
  21.         m_ButtonState                = BUTTON_OFF;
  22.         m_bMouseTracking        = FALSE;
  23. }

  24. CHoverButton::~CHoverButton()
  25. {
  26. }

  27. /////////////////////////////////////////////////////////////////////////////
  28. // CHoverButton message handlers

  29. void CHoverButton::OnMouseMove(UINT nFlags, CPoint point)
  30. {
  31.         CBitmapButton::OnMouseMove(nFlags, point);

  32.         // 1. Mouse has moved and we are not tracking this button, or
  33.         // 2. mouse has moved and the cursor was not above this window
  34.         // == Is equivalent to WM_MOUSEENTER (for which there is no message)
  35.         if((!m_bMouseTracking || GetCapture()!=this) && (m_ButtonState == BUTTON_OFF))
  36.         {
  37.                 OnMouseEnter();
  38.         }
  39.         else
  40.         {
  41.                 if(m_ButtonState == BUTTON_OVER)
  42.                 {
  43.                         CRect rc;
  44.                         GetClientRect(&rc);
  45.                         if(!rc.PtInRect(point))        // The mouse cursor is no longer above this button
  46.                                 OnMouseLeave();
  47.                 }
  48.         }
  49. }

  50. void CHoverButton::OnMouseEnter(void)
  51. {
  52.         // We are now tracking the mouse, OVER this button
  53.         m_bMouseTracking = TRUE;
  54.         m_ButtonState = BUTTON_OVER;

  55.         // Ensure that mouse input is sent to the button
  56.         SetCapture();
  57.         Invalidate();
  58.         UpdateWindow();
  59. }

  60. void CHoverButton::OnMouseLeave(void)
  61. {
  62.         // We are not tracking the mouse, this button is OFF.
  63.         m_ButtonState = BUTTON_OFF;
  64.         m_bMouseTracking = FALSE;

  65.         // Release mouse capture from the button and restore normal mouse input
  66.         Invalidate();
  67.         UpdateWindow();
  68.         ReleaseCapture();
  69. }


  70. void CHoverButton::OnLButtonUp(UINT nFlags, CPoint point)
  71. {
  72.         SetButtonState(BUTTON_ON);                        // Highlight button
  73.         CBitmapButton::OnLButtonUp(nFlags, point);
  74. }

  75. // Purpose:                Set the new state of the button
  76. // Return:                Returns the old state of the button
  77. // Parameters:        nState = Either ON or OFF. The default is OFF. This is NOT tri-state button!
  78. BUTTON_STATE CHoverButton::SetButtonState(BUTTON_STATE nState)
  79. {
  80.         BUTTON_STATE nOldState = (BUTTON_STATE)GetCheck();
  81.        
  82.         m_ButtonState = nState;
  83.         switch(m_ButtonState)
  84.         {
  85.         case BUTTON_ON:
  86.                 EnableWindow(TRUE);
  87.                 SetState(BUTTON_ON);
  88.                 break;
  89.         case BUTTON_GREYED:
  90.                 EnableWindow(FALSE);
  91.                 break;
  92.         case BUTTON_OVER:
  93.                 EnableWindow(TRUE);
  94.                 SetState(BUTTON_OVER);
  95.                 break;
  96.         default:
  97.                 EnableWindow(TRUE);
  98.                 SetState(BUTTON_OFF);
  99.                 m_ButtonState = BUTTON_OFF;
  100.                 break;
  101.         }
  102.         return(nOldState);
  103. }

  104. // Draws the buttons in their relevant state, and text labels
  105. void CHoverButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  106. {
  107.         CDC                        memDC;
  108.         CBitmap*        pOld=NULL;
  109.         CBitmap*        pBitmap=NULL;
  110.         CDC*                pDC;
  111.         CRect                rc;
  112.         int                        iSaveDC;

  113.         pDC= CDC::FromHandle(lpDrawItemStruct->hDC);
  114.         memDC.CreateCompatibleDC(pDC);
  115.         VERIFY(pDC);
  116.         iSaveDC=pDC->SaveDC();
  117.         rc.CopyRect(&lpDrawItemStruct->rcItem);
  118.         pDC->SetBkMode(TRANSPARENT);
  119.         pDC->SetTextColor(GetSysColor(COLOR_WINDOWFRAME));// Black text color

  120.         switch(m_ButtonState)
  121.         {
  122.         case BUTTON_ON:
  123.                 pBitmap=&m_bmpButtonDown;
  124.                 break;
  125.         case BUTTON_OVER:
  126.                 pBitmap=&m_bmpButtonFocussed;
  127.                 break;
  128.         case BUTTON_GREYED:
  129.                 pBitmap=&m_bmpButtonDisabled;
  130.                 break;
  131.         default:
  132.                 pBitmap=&m_bmpButtonUp;
  133.                 break;
  134.         }

  135.         CString                strTitle;
  136.         GetWindowText(strTitle);

  137.         if (pBitmap->m_hObject)
  138.         {
  139.                 CRect        rcBitmap(rc);
  140.                 BITMAP        bmpInfo;                       
  141.                 CSize        size;

  142.                 // Text
  143.                 size = pDC->GetTextExtent(strTitle);
  144.                 rcBitmap.OffsetRect(size.cx+5,0);

  145.                 // Draw bitmap
  146.                 if(!pBitmap->GetBitmap(&bmpInfo))
  147.                         return;
  148.                 pOld=memDC.SelectObject((CBitmap*) pBitmap);
  149.                 if (pOld==NULL)
  150.                         return; //Destructors will clean up

  151.                 if(!pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY))
  152.                         return;
  153.                 memDC.SelectObject(pOld);       
  154.                 if(memDC==NULL)
  155.                         return;
  156.         }

  157.         CRect        rcText(rc);
  158.         UINT nFormat = DT_CENTER;

  159.         if(m_ButtonState == BUTTON_GREYED)
  160.         {
  161.                 rcText.OffsetRect(1,1);
  162.                 pDC->SetTextColor(GetSysColor(COLOR_BTNHIGHLIGHT));
  163.                 pDC->DrawText(strTitle,rcText,nFormat);
  164.                 rcText.OffsetRect(-1,-1);
  165.                 pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW));
  166.                 pDC->DrawText(strTitle,rcText,nFormat);
  167.         }
  168.         else
  169.                 pDC->DrawText(strTitle,rcText,nFormat);

  170.         pDC->RestoreDC(iSaveDC);
  171. }

  172. BOOL CHoverButton::LoadBitmaps(UINT nBitmapUp, UINT nBitmapDown,
  173.                                                            UINT nBitmapFocus, UINT nBitmapDisabled)
  174. {
  175.         return LoadBitmaps(MAKEINTRESOURCE(nBitmapUp),
  176.                                                 MAKEINTRESOURCE(nBitmapDown),
  177.                                                 MAKEINTRESOURCE(nBitmapFocus),
  178.                                                 MAKEINTRESOURCE(nBitmapDisabled));
  179. }

  180. BOOL CHoverButton::LoadBitmaps(LPCSTR lpszBitmapUp, LPCSTR lpszBitmapDown,
  181.                                                            LPCSTR lpszBitmapFocus, LPCSTR lpszBitmapDisabled)
  182. {
  183.         BOOL bAllLoaded=TRUE;

  184.         //Delete old ones
  185.         m_bmpButtonDown.DeleteObject();
  186.         m_bmpButtonFocussed.DeleteObject();
  187.         m_bmpButtonUp.DeleteObject();
  188.         m_bmpButtonDisabled.DeleteObject();
  189.        
  190.         if (!m_bmpButtonUp.LoadBitmap(lpszBitmapUp))
  191.         {
  192.                 TRACE0("Failed to load up bitmap of bitmap button\n");
  193.                 return FALSE;
  194.         }

  195.         if (lpszBitmapDown!=NULL)
  196.         {
  197.                 if (!m_bmpButtonDown.LoadBitmap(lpszBitmapDown))
  198.                 {
  199.                         TRACE0("Failed to load down bitmap of bitmap button\n");
  200.                         return bAllLoaded=FALSE;
  201.                 }
  202.         }
  203.        
  204.         if (lpszBitmapFocus!=NULL)
  205.         {
  206.                 if (!m_bmpButtonFocussed.LoadBitmap(lpszBitmapFocus))
  207.                 {
  208.                         TRACE0("Failed to load focussed bitmap of bitmap button\n");
  209.                         return bAllLoaded=FALSE;
  210.                 }
  211.         }
  212.        
  213.         if (lpszBitmapDisabled!=NULL)
  214.         {
  215.                 if (!m_bitmapDisabled.LoadBitmap(lpszBitmapDisabled))
  216.                 {
  217.                         TRACE0("Failed to load disabled bitmap of bitmap button\n");
  218.                         return bAllLoaded=FALSE;
  219.                 }
  220.         }
  221.         return bAllLoaded;
  222. }
复制代码


回复

使用道具 举报

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