注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙粒的博客

 
 
 

日志

 
 

MFC : 定时器控制仪表指针动起来  

2014-12-19 23:13:17|  分类: MFC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、功能:

1、绘制仪表面板

2、参数控制面板圆心,半径,指针位置

3、设定时器,指针动起来

二、关键代码:

1、创建MFC单文档工程instrument

2、变量、函数设置

int cy; //圆心坐标

     int cx; //圆心坐标

     BOOL m_btimer; // 定时器设置标志

     int radius; //半径

     static int value;  //指示值

     int range;  //量程

     void drawhandle(int);  //画指针

     void drawcircle(CDC*,int,int,int,int);  //画面板

     void clock(CDC* pDC);  //

2OnDraw函数代码

void CInstrumentView::OnDraw(CDC* pDC)

{

     CInstrumentDoc* pDoc = GetDocument();

     ASSERT_VALID(pDoc);

     // TODO: add draw code for native data here

     clock(pDC);

}

3clock函数代码

void CInstrumentView::clock(CDC* pDC)

{

     //

     CRect rect;

     GetClientRect(&rect);

 

     //设置量程,

     range=10;

    

 

     //半径

     radius=0.45*rect.bottom;

 

     //

     cx=0.5*rect.right;

     cy=0.5*rect.bottom;

     int length=radius;

 

     //画圆(指针,圆心(x,y),半径r,量程)

     drawcircle(pDC,cx,cy,length,range);

 

     //控制指针(参数为 指示值 )

     drawhandle(value);

 

}

4drawcircle函数代码

//参数(指针,圆心x,y, 半径r,量程length)

void CInstrumentView::drawcircle(CDC* pDC,int x, int y, int r,int length)

{

     //圆的参数

     int cx=x;

     int cy=y;

     int cr=r;

     int cm=0.07*r;

 

     //量程

     int cleng=length;

 

     //选笔

     CPen pen(PS_SOLID,3,RGB(0,0,0));

     CPen* poldpen=pDC->SelectObject(&pen);

 

     //选画刷

     CBrush* pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

     CBrush* poldbrush=pDC->SelectObject(pbrush);

 

 

     //画圆

     pDC->Ellipse(cx-cr,cy-cr,cx+cr,cy+cr);

 

     //释放笔

     pDC->SelectObject(poldpen);

 

     //释放画刷

     pDC->SelectObject(poldbrush);

 

 

 

     //----画宽度

     //等分角

     double angle=2*3.14159/cleng;

     int ax,ay;

 

     for(int i=0;i<cleng;i++)

     {

            //计算每个刻度的角度

            ax=cx+cr*sin(angle*i);

            ay=cy-cr*cos(angle*i);

 

            //绘制刻度

            pDC->Ellipse(ax-cm,ay-cm,ax+cm,ay+cm);

 

            //标记数字

            CString str;

            str.Format("%d",i);

            pDC->TextOut(ax-6,ay-6,str);

     }

    

}

5drawhandle函数代码

//绘制仪表指针,参数表示(指示值)

void CInstrumentView::drawhandle(int value)

{

 

     //设定指针系数

#define k 0.85

 

     CClientDC dc(this);

     dc.SetROP2(R2_NOTXORPEN);

 

     //设指针宽度

     int width=10;

 

     //计算指针角度

     double angle=2*3.14159*value/range;

 

     //计算指针端点

     int xend=cx+k*radius*sin(angle);

     int yend=cy-k*radius*cos(angle);

 

     CPen pen(PS_SOLID,width,RGB(255,0,0));

 

     CPen* oldpen=dc.SelectObject(&pen);

 

     //画线

     dc.MoveTo(cx,cy);

     dc.LineTo(xend,yend);

 

     dc.SelectObject(oldpen);

}

6、菜单按键start响应函数

void CInstrumentView::Onstart()

{

     // TODO: Add your command handler code here

     if(m_btimer==0)

     {

 

     SetTimer(1,1000,NULL);

     m_btimer=1;

     }

}

7、菜单按键stop响应函数

void CInstrumentView::Onstop()

{

     // TODO: Add your command handler code here

 

     if(m_btimer==1)

     {

 

     KillTimer(1 );

     m_btimer=0;

     }

 

    

}

  评论这张
 
阅读(277)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017