zoukankan      html  css  js  c++  java
  • MFC之模拟时钟

    最近在学习MFC,程序设计老师布置”画板“和”模拟时钟“作为实验来实践,由于没去上课,网上搜索的很多教程几乎都是以VC6.0为基础的,而身边几乎都是VS2008以上,对于初学者来说,有时仿照VC6.0的教程在VS2008或更高的环境上难免会出现一些困难,特此将模拟时钟程序在VS2008环境下的开发过程总结如下:

    1.新建项目

    项目类型选择“MFC”,模板选择“MFC应用程序”,名称自拟,这里命名为”Clock"。选择好以后效果如下:

    2.MFC应用程序向导设置

    选择“下一步"

    这里有两个更改,一是”应用程序类型”选择“基于对话框”,同时取消选中“使用Unicode库”。完成以上两步之后,直接单击“完成”即可。

    三、核心部分

    1.首先打开“类视图”,选择"CClockDlg"

    在该类的头文件中,找到如下代码:

    紧接着后面添加三个变量用于临时保存时间的秒、分、时。

    int m_Sec, m_Min, m_Hour;

    插入后的效果如下:

    2.手动添加一个消息映射函数,完成时间的获取和指针的绘制。

    在CClockDlg类的头文件中找到如下代码:

    在其中增加一行如下:

    afx_msg void OnTimer(UINT nIDEvent); 

    增加后显示效果如下:

    接着在资源管理器中找到CClockDlg类的cpp文件来实现刚才的函数声明

    需要添加的代码如下:

     1 void CClockDlg::OnTimer(UINT nIDEvent) 
     2 {
     3     // TODO: Add your message handler code here and/or call default
     4     CTime time = CTime::GetCurrentTime();                //获得系统时间
     5     m_Sec = time.GetSecond();
     6     m_Min = time.GetMinute();
     7     m_Hour = time.GetHour();
     8 
     9     CDC* pDC = GetDC();
    10     CRect rect;
    11     GetClientRect(&rect);                                //获取客户区域
    12     CBitmap bitmap;                                      //定义图片类
    13     bitmap.LoadBitmap(IDB_BITMAP1);                      //加载位图
    14     CDC memdc;                                           //定义临时画布
    15     memdc.CreateCompatibleDC(pDC);                       //创建画布
    16     memdc.SelectObject(&bitmap);                         //关联图片
    17 
    18     int x = rect.Width()/2;
    19      int y = rect.Height()/2;
    20     
    21     CPen MinutePen(PS_SOLID,2,RGB(0,0,0));               //设置分针画笔
    22     memdc.SelectObject(&MinutePen);
    23     memdc.MoveTo(x,y);
    24     //绘制分针
    25     memdc.LineTo(x+(long)40*cos(PI/2-2*PI*m_Min/60.0),y-(long)40*sin(PI/2-2*PI*m_Min/60.0)); 
    26     CPen HourPen(PS_SOLID,3,RGB(0,0,0));                 //设置时针画笔
    27     memdc.SelectObject(&HourPen);
    28     memdc.MoveTo(x,y);    
    29     //绘制时针
    30     memdc.LineTo(x+(long)30*cos(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0))
    31         ,y-(long)30*sin(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0)));
    32     CPen SecondPen(PS_SOLID,1,RGB(255,0,0));            //设置秒针画笔
    33     memdc.SelectObject(&SecondPen);
    34     memdc.MoveTo(x,y);
    35     memdc.LineTo(x+(long)50*cos(PI/2-2*PI*m_Sec/60.0),y-(long)50*sin(PI/2-2*PI*m_Sec/60.0));//绘制秒针
    36     memdc.MoveTo(x,y);
    37     memdc.LineTo(x+(long)10*cos(PI/2-2*PI*(m_Sec+30)/60.0),y-(long)10*sin(PI/2-2*PI*(m_Sec+30)/60.0));//绘制秒针
    38     SecondPen.DeleteObject();
    39     MinutePen.DeleteObject();
    40     HourPen.DeleteObject();
    41     pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY);                    //复制图片
    42     memdc.DeleteDC();                                   //复制临时画布到预览窗口
    43     bitmap.DeleteObject();                              //删除图片
    44     ReleaseDC(pDC);
    45     CDialog::OnTimer(nIDEvent);
    46 }

    3.设置时钟位图

    打开“资源视图”

    在“资源视图”中添加资源

    资源类型选择“Bitmap",然后选择”导入”,把实现准备好的BMP文件导入。

    可以发现“资源视图”多了“Bitmap"文件夹,展开该文件夹

    IDB_BITMAP1即为该资源的ID,用于唯一标识。

    4.在资源管理器中打开CClockDlg.cpp,找到函数OnInitDialog的实现。并在

    增加一行代码完成钟表指针的初始化

    SetTimer(1,1,NULL);

    添加后效果如下:

    然后在该cpp文件中找到以下代码:

    增加一行代码:

    ON_WM_ONTIMER()

    添加后显示效果如下:

    最后在CClockDlg.cpp中增加头文件“math.h"和定义常量PI

    四、调整对话框

    打开“资源视图”,选择”Dialog"->"IDD_CLOCK_DIALOG"

    删除对话框中的“确定”、“取消”、“TODO:再次防止对话框控件”

    调整对话框大小,反复运行程序,直至显示效果合适,表针位于位图的中心。

    如此一来就大功告成啦!(虽然有很多值得改进的地方,比如最后一步。。。)

  • 相关阅读:
    Kubernetes实战:高可用集群的搭建和部署
    华为云MVP程云:知识化转型,最终要赋能一线
    支持60+数据传输链路,华为云DRS链路商用大盘点
    关于单元测试的那些事儿,Mockito 都能帮你解决
    深入原生冰山安全体系,详解华为云安全服务如何构筑全栈安全
    云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用
    FLINK重点原理与机制:内存(1)task之间的数据传输
    FLINK重点原理与机制:内存(2)网络流控及反压机制剖析(一)
    FLINK重点原理与机制:状态(3)两阶段提交
    FLINK重点原理与机制:状态(2)Flink的检查点算法CHECKPOINT
  • 原文地址:https://www.cnblogs.com/anthozoan77/p/3668240.html
Copyright © 2011-2022 走看看