QQ登录

只需一步,快速开始

52上位机VC MF实现多边形不规则按钮

[ 复制链接 ]

52上位机VC MF实现多边形不规则按钮

52上位机VC MF实现多边形不规则按钮
52上位机VC MF实现多边形不规则按钮
功能展示
VC提供的系统默认按钮都是方形的矩形按钮,如果我们想实现多边形按钮,10边形按钮等不规则按钮呢?多边形的不规则按钮是给程序界面添加了一定的效果,我们当前例程就实现了任意边数的按钮,效果如图
要点提示
和我上一例程【51上位机VC MFC实现自绘的图文按钮】一样,个性化的按钮控件,我们是通过自绘方法实现,自绘方法是通过DrawItem()函数来完成;绘制多边开得用函数Polygon()来完成;BOOL Polygon( LPPOINT lpPoints, int nCount ); lpPoints为顶点数组指针, nCount 为数组中顶点数
实现功能
1.新建基于对话框的应用程序
2.从Cbutton派生一个自己的类classCPolygonBtn : public Cbutton,添加几个变量private:
int m_nNum;//按钮的边数标识 BOOLm_bSetToPol; //标识 多边效果有效 COLORREF m_color;
CPointm_arrays[10]; BOOL   m_bIsPressed; //按钮是否被按下标识,并在构造函数中初始化 m_bSetToPol = TRUE; m_bIsPressed =FALSE; m_nNum = 4; m_color = RGB(255,255,255);
3.添加鼠标按下,放开,及移动处理函数,参数设置函数及DrawItem()函数
  1. void CPolygonBtn::OnLButtonDown(UINT nFlags, CPoint point)
  2. {m_bIsPressed = TRUE; CButton::OnLButtonDown(nFlags, point);
  3. }
  4. void CPolygonBtn::OnLButtonUp(UINT nFlags, CPoint point)
  5. {m_bIsPressed = FALSE; CButton::OnLButtonUp(nFlags, point);
  6. }
  7. void CPolygonBtn::OnMouseMove(UINT nFlags, CPoint point)
  8. {
  9.         CRect rect;
  10.         GetClientRect(rect);
  11.         if(rect.PtInRect(point))//判断当前鼠标点是否在按钮区域内
  12.         {
  13.                 if(m_bIsPressed)//如果鼠标不在按钮的区域内,并且按钮处于按下状态,将按钮设置为正常状态
  14.                         m_bIsPressed = FALSE;
  15.         }
  16.         CButton::OnMouseMove(nFlags, point);
  17. }
复制代码
  1. void CPolygonBtn::SetEffect(int num, COLORREF bkColor,BOOL bSetToPol)
  2. {
  3.         m_nNum = num;
  4.         m_nNum=m_nNum>10?10:m_nNum;//保证最大边数在10内
  5.         m_bSetToPol = bSetToPol;
  6.         m_color = bkColor;
  7. }
  8. void CPolygonBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  9. {
  10.         CRect rect;
  11.         GetClientRect(rect);
  12.         CDC dc;
  13.         dc.Attach(lpDrawItemStruct->hDC);
  14.         int x,y,r;
  15.         x = rect.Width()/2;
  16.         y = rect.top;
  17.         r = rect.Height()/2;
  18.         double lpi=0;
  19.         m_arrays[0] = CPoint(x,y);
  20.         if(m_bSetToPol)
  21.         {
  22.                 for(int i=1;i<m_nNum;i++)
  23.                 {lpi+=(2*PI/m_nNum);
  24.                         if(lpi<=2*PI/4)
  25.                         {m_arrays[i] = CPoint(x+r*sin(2*i*PI/m_nNum),r-r*cos(2*i*PI/m_nNum));
  26.                         }
  27.                         if(lpi>2*PI/4 && lpi<=2*PI/2)
  28.                         {m_arrays[i] = CPoint(x+r*sin(PI-2*i*PI/m_nNum),r+r*cos(PI-2*i*PI/m_nNum));
  29.                         }
  30.                         if(lpi>2*PI/2 && lpi<=2*PI*3/4)
  31.                         {m_arrays[i] = CPoint(x-r*sin(2*i*PI/m_nNum-2*PI/2),r+r*cos(2*i*PI/m_nNum-2*PI/2));
  32.                         }
  33.                         if(lpi>2*PI*3/4 && lpi<=2*PI)
  34.                         {m_arrays[i] = CPoint(x-r*sin(2*PI-2*i*PI/m_nNum),r-r*cos(2*PI-2*i*PI/m_nNum));
  35.                         }
  36.                 }
  37.         }
复制代码
  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.         
复制代码
4.最后添加我们类中计算要用到的头文件#include<cmath>,及添加一个宏定义#define PI 2.0*asin(1.0)
完成类的编程
5.类的使用,在对话框中添加几个按钮,关联我们的类变量。进行效果设置便可如我们例程中的设置;m_Btn.SetEffect(3,RGB(255,0,0),TRUE);

我们来演示下实现的整个过程
请点击此处下载

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

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

文件名称:52.上位机VC MF实现多边形不规则按钮.rar 
文件大小:135.1 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

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

  

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

  

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


回复

使用道具 举报

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