MFC案例:利用SetTimer函数编写一个“计时器”程序

news2024/11/15 9:12:34

一、希望达成效果
       利用基于对话框的MFC项目,做一个一方面能够显示当前时间;另一方面在点击开始按钮时进行读秒计时,计时结果动态显示,当点击结束时读秒结束并保持最后结果。
二、编程步骤及相关代码、注释
      1、启动VS->创建新项目->MFC应用-项目名称:MFCtimer->创建->在应用程序类型中选择:基于对话框->完成。启动后,将"TODO:"、“确定”、"取消"等删去。
      2、从工具箱先拖入一些静态文本框,用于显示提示文字,选择这些控件,右键属性后更改ID、右键添加变量后添加变量。具体包括:
       属性ID: IDC_CTIME    变量名: m_CTIME      显示:当前时间("当前时间"在更改写入)
       属性ID: IDC_YEAR      变量名: m_YEAR        显示:年
       属性ID: IDC_MONTH  变量名: m_MONTH   显示:月
       属性ID: IDC_DAY        变量名:  m_DAY        显示:日
       属性ID: IDC_HOUR     变量名: m_HOUR      显示:时
       属性ID: IDC_MINUTE  变量名: m_MINUTE   显示:分
       属性ID:IDC_TITLE                                           显示:计时器
       上面IDC_TITLE以及下面介绍的一些控件,没有添加变量名,目的是为了在程序中介绍如何使用变量,以及仅使用ID调用成员函数的方法;在这个程序中,加不加变量名无所谓。
       3、从工具箱拖入文本编辑框:5个用于显示当前时间;2个用于显示读秒。使用与静态文本框相似的方法,为这些文本编辑框更改ID。
      属性ID:IDC_SHOW_YEAR  显示:年(不是“年”字,指2024,下同)
      属性ID:IDC_SHOW_MONTH 显示:月
      属性ID:IDC_SHOW_DAY  显示:日
      属性ID:IDC_SHOW_HOUR 显示:时
      属性ID:IDC_SHOW_MINUTE  显示:分
      属性ID:IDC_SHOW_TIMER1 变量名:m_showTimer1 显示:读秒  注:这里只有它加了变量名
      属性ID:IDC_SHOW_TIMER2 显示:读秒(化成"__分__秒"格式)
       4、拖入两个按钮,ID不改了,就用缺省的:IDC_BUTTON1、IDC_BUTTON2。右键这两个按钮,选择属性,ID不改了,但要把文字描述改成“开始计时”、“结束及时”。并分别给这两个按钮添加处理程序void CMFCtimerDlg::OnBnClickedButton1()、void CMFCtimerDlg :: OnBnClickedButton2(),后边要用到。
       5、至此,除了已经自动生成的代码,我们还没有写过代码。下面开始添加代码工作:

       a.在MFCtimerDlg.h中声明几个变量:

public:
         CFont cfont[4]; //声明静态文本框等控件需用到的字形字号
         time_t startTime, endTime; //声明开始时刻、结束时刻变量
         BOOL isStart=FALSE; //声明是否计时的逻辑变量

       b.CMFCtimerDlg::OnInitDialog()程序中,在//TODO:语句后添加代码:

//设置字体
	for (int i = 0; i < 4; i++)
	{
		int choice;
		if (i == 0)choice = 40; //大标题字体使用
		if (i == 1)choice = 25; //年月日等提示字字体使用
		if (i == 2)choice = 20; //文本编辑框显示字体使用
		if (i == 3)choice = 80; //显示跳秒
		cfont[i].CreateFont
		(choice, // nHeight//25
			0, // nWidth
			0, // nEscapement
			0, // nOrientation
			FW_BOLD, // nWeight
			FALSE, // bItalic
			FALSE, // bUnderline
			0, // cStrikeOut
			UNICODE, // nCharSet
			OUT_DEFAULT_PRECIS, // nOutPrecision
			CLIP_DEFAULT_PRECIS, // nClipPrecision
			DEFAULT_QUALITY, // nQuality
			DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
			_T("黑体")); // lpszFac
	}
//利用函数、控件变量等方法设置控件字体、字形
	GetDlgItem(IDC_TITLE)->SetFont(&cfont[0]);  //“计时器”三字
	m_CTIME.SetFont(&cfont[1]); //“当前时间”四字
	m_YEAR.SetFont(&cfont[1]);  //“年”字
	m_MONTH.SetFont(&cfont[1]); //“月”字
	m_DAY.SetFont(&cfont[1]); //“日”字
	m_HOUR.SetFont(&cfont[1]); //“时”字
	m_MINUTE.SetFont(&cfont[1]); //“分”字
//设置系统计时器(消息函数机制)
	SetTimer(1, 1000, NULL); //设置系统及时器(利用它实现周期性变化显示)
//设置控件焦点到"开始计时"按钮(注意:本函数的返回值要改成FALSE)
	GetDlgItem(IDC_BUTTON1)->SetFocus();

       c.由于我们在OnInitDialog()程序中添加了系统计时器语句,接着进行:项目->类向导->消息->选择:WM_TIMER->添加处理程序,在MFCtimerDlg.cpp可以找到下面的函数:
       Void CMFCtimerDlg::OnTimer(UINT_PTR nIDEvent),添加下列代码:

	SYSTEMTIME currentTime; //声明时间结构体
	GetLocalTime(&currentTime); // 获得当地时间
	TCHAR temp[12];
	//给年月日时分编辑框设置字形字号并显示当前时间
	wsprintf(temp,L"%d",currentTime.wYear);
	GetDlgItem(IDC_SHOW_YEAR)->SetFont(&cfont[2]);
	GetDlgItem(IDC_SHOW_YEAR)->SetWindowTextW(temp);
	wsprintf(temp, L"%d", currentTime.wMonth);
	GetDlgItem(IDC_SHOW_MONTH)->SetFont(&cfont[2]);
	GetDlgItem(IDC_SHOW_MONTH)->SetWindowTextW(temp);
                wsprintf(temp, L"%d", currentTime.wDay);
	GetDlgItem(IDC_SHOW_DAY)->SetFont(&cfont[2]);
	GetDlgItem(IDC_SHOW_DAY)->SetWindowTextW(temp);
                wsprintf(temp, L"%d", currentTime.wHour);
	GetDlgItem(IDC_SHOW_HOUR)->SetFont(&cfont[2]);
	GetDlgItem(IDC_SHOW_HOUR)->SetWindowTextW(temp);
                wsprintf(temp, L"%d", currentTime.wMinute);
	GetDlgItem(IDC_SHOW_MINUTE)->SetFont(&cfont[2]);
	GetDlgItem(IDC_SHOW_MINUTE)->SetWindowTextW(temp);
	GetDlgItem(IDC_BUTTON1)->SetFont(&cfont[2]);
	GetDlgItem(IDC_BUTTON2)->SetFont(&cfont[2]);
	GetDlgItem(IDC_S)->SetFont(&cfont[1]);
               //以两个编辑框显示读秒
	if (isStart == TRUE) //TRUE读秒 FALSE停止读秒
	{
		time(&endTime);
		TCHAR buf[128];
		wsprintf(buf, L"%d", int(endTime-startTime));
		m_showTime1.SetFont(&cfont[3]);
		m_showTime1.SetWindowTextW(buf);
		GetDlgItem(IDC_SHOWTIME2)->SetFont(&cfont[1]);
		int second = (endTime - startTime) % 60;
		int minute = (endTime - startTime) / 60;
               wsprintf(buf, L"   %d 分 %d 秒", minute,second);
		GetDlgItem(IDC_SHOWTIME2)->SetWindowTextW(buf);
	}
	Circle(); //在“当前时间”后边闪烁一个圆圈,表示屏幕非静止

       说明:由于当前时间显示到分,所以不读秒时,程序给人的感觉是静止画面,所以写一个Circle程序,在“当前时间”四字后边以深灰、浅灰不断变化闪烁,给人动感。这里先调用,后边实现程序。在写这个函数之前,先到MFCtimerDlg.h中声明一个变量:

      BOOL myBool = TRUE; //声明绘制圆圈用的逻辑变量

      d.我们直接在MFCtimerDlg.cpp内声明并实现 void CMFCtimerDlg::Circle()函数,在这个函数中写上下面代码:

	CDC* pDC=GetDC();//获取当前窗口设备上下文指针
	CRect rect;//这是一个关于视图窗口数据的类,这里定义一个CRect类对象
	GetClientRect(rect);//GetClientRect得到的是相对于窗口客户区左上角的坐标。
	int r = rect.Height() / 20;//设置圆半径
	int x = rect.Height() * 0.4, y = rect.Height() * 0.27;//设置圆心坐标
	CPen grayPen(PS_SOLID, 3, 0x404040);//设置深色圆线型线宽颜色
	CPen whitePen(PS_SOLID, 3, 0xC0C0C0);//设置浅色圆线型线宽颜色
	if (myBool == TRUE) //画深色圆
	{
	 CPen* pOldPen = pDC->SelectObject(&grayPen);
	 pDC->Ellipse(x, y, x + r, y + r);
	 pDC->SelectObject(pOldPen);
	 myBool = !myBool;
   	}
	else //画浅色圆
	{
	CPen* pOldPen = pDC->SelectObject(&whitePen);
	pDC->Ellipse(x, y, x + r, y + r);
	pDC->SelectObject(pOldPen);
	myBool = !myBool;
	}
	ReleaseDC(pDC);

      e.在给按钮添加的程序CMFCtimerDlg::OnBnClickedButton1()中写上语句:

	isStart = TRUE; //开始计时
	time(&startTime);

      f.在给按钮添加的程序CMFCtimerDlg::OnBnClickedButton2()中写上语句:

	isStart = FALSE; //停止计时

      g.到这里,这个小案例基本就完成了。关于程序退出,右键对话框->类向导->点击消息->选择WM_CLOSE->添加处理程序(点击对话框右上角叉的消息)。在MFCtimerDlg.cpp中出现函数:
void CMFCtimerDlg::OnClose()  在TODO:后添加:

	KillTimer(1); //关闭系统计时器
	MessageBox(L"程序即将关闭 。。。");

      程序运行效果截图如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OA协同办公系统 iWebPDF插件安装

1、下载压缩文件 iweboffice&#xff0c;并进行解压 链接&#xff1a;https://pan.baidu.com/s/1GQd7000PTZ771ifL5KEflg 提取码&#xff1a;hb56 2、安装iWenpdf2018.exe 3、安装金格中间件外部应用 4、测试了谷歌、360安全&#xff0c;发现安装插件后&#xff0c;只有360极…

BP8519C非隔离降压型恒压芯片

BP8519封装和丝印 BP8519封装和丝印 注意&#xff1a; 该芯片为非隔离ACDC电源芯片&#xff0c;非专业人员请勿使用。专业人员在使用时必须注意防护&#xff0c;避免触电。 非隔离ACDC电源芯片&#xff0c;国内有多家半导体厂商生产&#xff0c;在部分追求低价格的低端仪表、灯…

vivado HW_SIO_GTGROUP、HW_SIO_IBERT

HW_SIO.GTGROUP 描述 GT组与硬件设备上的GT IO组相关&#xff0c;具有可用的数量 GT引脚和组由目标Xilinx FPGA确定。在Kintex-7 xc7k325部件上&#xff0c;用于 例如&#xff0c;有四个GT组&#xff0c;每个组包含四个差分GT引脚对。每个GT pin有自己的接收器hw_sio_rx和发射器…

人工智能GPT-4o?

对比分析 在讨论GPT-4o时&#xff0c;我们首先需要了解其前身&#xff0c;即GPT-4&#xff0c;以及其之前的版本。GPT系列从GPT-1到GPT-4经历了多次迭代&#xff0c;每一次都带来了显著的进步。 GPT-4 vs GPT-4o&#xff1a; 1. **参数规模&#xff1a;** GPT-4o在参数规模上…

PyTorch 张量数据类型

【数据类型】Python 与 PyTorch 常见数据类型对应&#xff1a; 用 a.type() 获取数据类型&#xff0c;用 isinstance(a, 目标类型) 进行类型合法化检测 >>> import torch >>> a torch.randn(2,3) >>> a tensor([[-1.7818, -0.2472, -2.0684],[ 0.…

iOS ------ 对象的本质

一&#xff0c;OC对象本质&#xff0c;用clang编译main.m OC对象结构都是通过基础的C/C结构体实现的&#xff0c;我们通过创建OC文件及对象&#xff0c;将OC对象转化为C文件来探寻OC对象的本质。 代码&#xff1a; interface HTPerson : NSObject property(nonatomic,strong)…

什么是SOLIDWORKS科研版

随着科技的不断进步&#xff0c;工程设计和科学研究变得越来越复杂&#xff0c;需要更强大的工具来满足需求。SOLIDWORKS科研版就是在这样的背景下诞生的&#xff0c;它为科研人员和工程师提供了一套全方面、快捷的解决方案&#xff0c;以应对各种科研和工程挑战。 SOLIDWORKS科…

Surface安装Windows和Ubuntu双系统方法(包括Ubuntu适配触控屏的方法)

这是一个目录0.0 前言让我们从一块砖头开始现在你有了能进入windows系统的surface并且想安装Ubuntu现在Ubuntu也有了再见 前言 之前我的Surface装上Ubuntu了好好的&#xff0c;能用&#xff0c;但是Ubuntu原本的内核是不支持很多Surface的功能的&#xff0c;比如触控屏&#xf…

串口调试助手软件(ATK-XCOM) 版本:v2.0

串口设置 软件启动后&#xff0c;会自动搜索可用的串口&#xff0c;可以显示详细的串口信息&#xff0c;由于兼容性原因某些电脑可能不会显示。 超高波特率接收&#xff0c;在硬件设别支持的情况下&#xff0c;可自定义波特率&#xff0c;点“自定义”即可输入您想要的波特率&…

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia-boot-iso/&#xff0c;查看最新版…

PR基础常识

Pr主要就是用来做视频后期剪辑的。是一款非线性视频剪辑软件。它可以将原有视频作为素材&#xff0c;导入到软件的时间线轨道面板中&#xff0c;对视频进行重新剪辑编排&#xff0c;并可以添加文字、图片、音频等素材文件&#xff0c;也能预设各种效果&#xff0c;让剪辑的视频…

外卖抢单神器

在现代快节奏的生活中&#xff0c;外卖服务已成为许多人日常生活的一部分&#xff0c;给外卖行业带来前所未有的机遇和挑战。随着市场竞争的加剧&#xff0c;许多外卖员开始寻求方法以提升接单效率。但在此过程中&#xff0c;道德和合规性是业务持续性的关键。 正直的经营不仅…

Apple Intelligence 带来的十大影响:人工智能的iPhone时刻到来

引言 在最近的WWDC大会上&#xff0c;Apple发布了全新的Apple Intelligence&#xff0c;引起了全球的广泛关注。这次发布被誉为“人工智能的iPhone时刻”&#xff0c;标志着我们每个人都将拥有第一个AI助理&#xff0c;并将引领AI Agent进入红海时代。本文将详细分析Apple Int…

Jetpack Compose Navigation 遇上类型安全

Jetpack Compose Navigation 遇上类型安全 引言 随着 Navigation 2.8.0-alpha08 版本的发布&#xff0c;Navigation 组件引入了基于 Kotlin Serialization 的完整类型安全系统&#xff0c;用于在使用 Kotlin DSL 时定义导航图。这一新特性旨在与 Navigation Compose 等集成最…

1.Anaconda-创建虚拟环境的手把手教程

文章目录 介绍&#xff08;必看&#xff09;正文版本信息模块安装流程1.创建虚拟环境2.激活环境3.退出虚拟环境4.安装python(激活虚拟环境)5.安装tensorflow(激活虚拟环境)6.安装matplotlib7.protobuf版本太高会有问题(激活虚拟环境) 常用的指令&#xff08;一定会用到&#xf…

【CSAPP导读】导论

目录 &#x1f308; 前言&#x1f308; &#x1f4c1; 书籍介绍 &#x1f4c1; 阅读路线 &#x1f4c1; 总结 &#x1f308; 前言&#x1f308; 《深入理解计算机系统》书籍是由布赖恩特(Bryant,R.E.)著的一本经典计算机科学教材&#xff0c;常被简称为"CSAPP"&a…

找不到msvcr110.dll怎么办,msvcr110.dll丢失的7个不同能修复的解决方法

msvcr110.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;由Microsoft Corporation开发&#xff0c;是Visual C Redistributable for Visual Studio 2012的一部分。这个文件包含了运行时库函数&#xff0c;这些函数对于基于Visual C 2012编译的应用程序来说是…

linux笔记8--安装软件

文章目录 1. PMS和软件安装的介绍2. 安装、更新、卸载安装更新ubuntu20.04更新镜像源&#xff1a; 卸载 3. 其他发行版4. 安装第三方软件5. 推荐 1. PMS和软件安装的介绍 PMS(package management system的简称)&#xff1a;包管理系统 作用&#xff1a;方便用户进行软件安装(也…

✔️Vue基础++

✔️Vue基础 组件通信 什么是组件通信&#xff1f; 组件通信就是指 组件与组件 之间的 数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据想使用其他组件的数据&#xff0c;就需要组件通信 组件之间如何通信&#xff1f; 组件关系 父子关系非父子关系 …

leetcode -- 114.二叉树展开为链表

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/ 题目中要求把链表展开为单链表&#xff0c;并且展开后的链表要跟二叉树的前序遍历顺序相同。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* …