QQ登录

只需一步,快速开始

53上位机VC MF实现热点效果按钮

[ 复制链接 ]

53上位机VC MF实现热点效果按钮

53上位机VC MF实现热点效果按钮

53上位机VC MF实现热点效果按钮


功能展示

一般我们人眼会追随动态的东西,当鼠标没过热点按钮时,按钮发生变化,就可以引起用户的注意,所以我们当前例程就来实现热点按钮功能,效果如图
要点提示
热点按钮的实现关键点用到了GetCursorPos()和PtInRect();
BOOL GetCursorPos( LPPOINT lpPoint // address of structure for cursorposition ); lpPoint 是一个指向[url=]POINT[/url] 结构体的指针,接收相对于桌面的鼠标位置
BOOL PtInRect( POINT point ) const;判断指定的point 是否在矩形范围内;
实现功能
1.新建基于对话框的应用程序
2.首先创建自己的按钮类;从Cbutton派生一个自己的类classCHotBtn : public CButton ,添加几个变量UINTm_nDownPic; //鼠标按下时显示的图片 UINT  m_nNomalPic;  //正常情况下显示的图片
UINT  m_nDisablePic;    //按钮失效时显示的图片 UINT  m_nMovePic;  //鼠标经过按钮时显示的图片 BOOL m_bIsInRect;    //鼠标是否在按钮内;并在构造函数中初始化m_nDownPic   = 0; m_nNomalPic  = 0;  m_nDisablePic = 0;    m_nMovePic   = 0; m_bIsInRect  = FALSE;

3.添加函数PreTranslateMessage()reSubclassWindow(); OnTimer(); DrawItem();
  1. BOOL CHotBtn::PreTranslateMessage(MSG* pMsg)
  2. {
  3.         if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYDOWN && pMsg->wParam==13)
  4.         {
  5.                 pMsg->lParam  = 0;
  6.                 pMsg->message = WM_LBUTTONDOWN;
  7.         }
  8.         if(pMsg->hwnd==this->GetSafeHwnd()&&pMsg->message==WM_KEYUP && pMsg->wParam==13)
  9.         {
  10.                 pMsg->lParam  = 0;
  11.                 pMsg->message = WM_LBUTTONUP;
  12.         }
  13.         return CButton::PreTranslateMessage(pMsg);
复制代码
  1. void CHotBtn::PreSubclassWindow()
  2. {
  3.         ModifyStyle(0,BS_OWNERDRAW,0);
  4.         SetTimer(1,10,NULL); //设置定时器
  5.         CButton::PreSubclassWindow();
  6. }
  7. void CHotBtn::OnTimer(UINT nIDEvent)
  8. {
  9.         CPoint point;                                                //声明Cpoint变量
  10.         GetCursorPos(&point);                                 //获得鼠标位置
  11.         CRect rcWnd;                                                //声明区域对象
  12.         GetWindowRect(&rcWnd);                         //获得按钮区域
  13.         if(rcWnd.PtInRect(point))                                 //判断鼠标是否在按钮上
  14.         {
  15.                 if(m_bIsInRect == TRUE)                         //判断鼠标是否一直在按钮上
  16.                         goto END;                                        //跳转到标记
  17.                 else                                                        //鼠标移动到按钮上
  18.                 {
  19.                         m_bIsInRect = TRUE;                        //设置m_IsInRect变量值
  20.                         Invalidate();                                 //重绘按钮
  21.                 }
  22.         }
  23.         else //不在按钮区域内
  24.         {
  25.                 if(m_bIsInRect == FALSE) //判断鼠标一直在按钮外
  26.                  goto END;                                                                                                //跳转到标记
  27.                 else                                                                                                                //鼠标移动到按钮外
  28.                 {
  29.                         Invalidate();                                                                                         //重绘按钮
  30.                         m_bIsInRect = FALSE;                                                                                //设置m_IsInRect变量值
  31.                 }
  32.         }
  33. END:        CButton::OnTimer(nIDEvent);         //设置标记,调用基类方法
  34. }
复制代码
  1. //设置背景透明
  2.         dc.SetBkMode(TRANSPARENT);
  3.         //创建一个位图画刷
  4.         CBrush brush(m_color);
  5.         dc.SelectObject(&brush);
  6.         CPen pen(PS_NULL,1,m_color);
  7.         dc.SelectObject(&pen);
  8.         if(m_bSetToPol)  dc.Polygon(m_arrays,m_nNum);
  9.         else  dc.Ellipse(0,0,rect.Width(),rect.Height());
  10.         if(m_bIsPressed)
  11.         {
  12.                 CPen pen(PS_DASHDOTDOT,2,RGB(0,0,0));
  13.                 dc.SelectObject(&pen);
  14.                 if(m_bSetToPol)
  15.                 {
  16.                         dc.MoveTo(m_arrays[0]);
  17.                         for(int i=1;i<m_nNum;i++)
  18.                         { dc.LineTo(m_arrays[i]);
  19.                         }
  20.                         dc.LineTo(m_arrays[0]);
  21.                 }
  22.                 else dc.Ellipse(0,0,rect.Width(),rect.Height());
  23.         }
  24.         else
  25.         {
  26.                 CPen pen(PS_DASHDOTDOT,2,m_color);
  27.                 dc.SelectObject(&pen);
  28.                 if(m_bSetToPol)
  29.                 {
  30.                         dc.MoveTo(m_arrays[0]);
  31.                         for(int i=1;i<m_nNum;i++)
  32.                         { dc.LineTo(m_arrays[i]);
  33.                         }
  34.                         dc.LineTo(m_arrays[0]);
  35.                 }
  36.                 else dc.Ellipse(0,0,rect.Width(),rect.Height());
  37.         }

  38.         
复制代码
  1. void CHotBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  2. {
  3.         CDC dc;        
  4.         dc.Attach(lpDrawItemStruct->hDC);                                                                        
  5.         UINT state = lpDrawItemStruct->itemState;                                                         
  6.         CRect rect;                                                                                                        //声明区域对象
  7.         GetClientRect(rect);                                                                                
  8.         CString text;
  9.         GetWindowText(text);
  10.         
  11.         if(state & ODS_DISABLED)
  12.         {
  13.                 DrawBK(&dc,m_nDisablePic);
  14.                 dc.SetTextColor(RGB(0,0,0));
  15.         }
  16.         else if(state&ODS_SELECTED)
  17.         {
  18.                 DrawBK(&dc,m_nDownPic);
  19.                 dc.SetTextColor(RGB(0,0,255));
  20.         }
  21.         else if(m_bIsInRect==TRUE)
  22.         {
  23.                 DrawBK(&dc,m_nMovePic);
  24.                 dc.SetTextColor(RGB(255,0,0));
  25.         }
  26.         else         //默认情况下
  27.         {
  28.                 DrawBK(&dc,m_nNomalPic);
  29.                 dc.SetTextColor(RGB(0,0,0));
  30.         }
  31.         if(state&ODS_FOCUS)
  32.         {
  33.                 CRect FocTect(rect);
  34.                 FocTect.DeflateRect(2,2,2,2);
  35.                 dc.DrawFocusRect(&FocTect);
  36.                 lpDrawItemStruct->itemAction = ODA_FOCUS ;
  37.         }
  38.         dc.SetBkMode(TRANSPARENT);
  39.         dc.DrawText(text,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);        
  40. }
复制代码
  1. <div style="text-align: center;"><font size="4">4再添加背景自绘函数DrawBK() 及对外接口函数SetBkBitmap()</font></div>void CHotBtn::DrawBK(CDC *pDC, UINT ResID)
  2. {
  3.         if(m_nDownPic&&m_nNomalPic&&m_nDisablePic&&m_nMovePic)
  4.         {
  5.         
  6.         CDC memDC;
  7.         memDC.CreateCompatibleDC(pDC);
  8.         CRect rect;                                                                                                        //声明区域对象
  9.         GetClientRect(rect);                                                                                //获得编辑框客户区域
  10.         CBitmap bitmap;
  11.         BITMAP bitStruct;
  12.         bitmap.LoadBitmap(ResID);
  13.         bitmap.GetBitmap(&bitStruct);
  14.         memDC.SelectObject(&bitmap);
  15.         pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bitStruct.bmWidth
  16.                 ,bitStruct.bmHeight,SRCCOPY);
  17.         memDC.DeleteDC();
  18.         bitmap.DeleteObject();
  19.         }
  20. }
  21. void CHotBtn::SetBkBitmap(UINT nDownPic,UINT nNomalPic,UINT nDisablePic,UINT nMovePic)
  22. {
  23.         m_nDownPic = nDownPic;                //鼠标按下时显示的图片
  24.         m_nNomalPic = nNomalPic;        //正常情况下显示的图片
  25.         m_nDisablePic = nDisablePic; //按钮失效时显示的图片
  26.         m_nMovePic = nMovePic;                //鼠标经过按钮时显示的图片
  27. }
复制代码
5.最后是在对话框中添加按钮资源,关联变量,并进行背景位图设置如我们例程m_Btn.SetBkBitmap(IDB_BUTTONDOWN,IDB_BUTTONMOVE,IDB_BUTTONMOVE,IDB_BUTTONUP);


我们来实现功能实现过程

请点击此处下载

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

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

文件名称:53.上位机VC MF实现热点效果按钮.rar 
文件大小:246.26 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!



回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索