当前位置: 首页 > news >正文

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

一、希望达成效果
       利用基于对话框的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//250, // nWidth0, // nEscapement0, // nOrientationFW_BOLD, // nWeightFALSE, // bItalicFALSE, // bUnderline0, // cStrikeOutUNICODE, // nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_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"程序即将关闭 。。。");

      程序运行效果截图如下:

相关文章:

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

一、希望达成效果 利用基于对话框的MFC项目&#xff0c;做一个一方面能够显示当前时间&#xff1b;另一方面在点击开始按钮时进行读秒计时&#xff0c;计时结果动态显示&#xff0c;当点击结束时读秒结束并保持最后结果。 二、编程步骤及相关代码、注释 1、启动VS…...

2. 音视频H264

视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩数字视频编解码器标准 H265又名高…...

烽宇团队回报社会,走进贵州山区公益行

贵州省——在一片美丽的黔山秀水间,烽宇团队成员用实际行动诠释了“取之于民,用之于民”的公益精神。作为在科技和商业领域取得显著成就的团队,烽宇团队不仅在商业上取得了辉煌的成绩,还积极投身于社会公益事业,回报社会。 取之于民,用之于民 近年来,烽宇团队在多位行业领袖的…...

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决

在计算机世界中&#xff0c;文件系统是数据管理的基石&#xff0c;而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势&#xff0c;并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…...

Elasticsearch机器学习初探:智能数据洞察

在当今数据驱动的时代&#xff0c;企业越来越依赖于数据来做出明智的决策。然而&#xff0c;随着数据量的不断增长和复杂性的增加&#xff0c;传统的数据分析方法已经无法满足快速、准确洞察数据的需求。为了应对这一挑战&#xff0c;Elasticsearch引入了机器学习功能&#xff…...

贪心算法——赶作业(C++)

慢慢来&#xff0c;沉稳一点。 2024年6月18日 题目描述 A同学有n份作业要做&#xff0c;每份作业有一个最后期限&#xff0c;如果在最后期限后交作业就会扣分&#xff0c;现在假设完成每份作业都需要一天。A同学想安排作业顺序&#xff0c;把扣分降到最低&#xff0c;请帮他实…...

Python 数据可视化 多色散点图

Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …...

C语言入门系列:数据类型之浮点数

文章目录 一&#xff0c;什么是浮点数二&#xff0c;C语言中的浮点数1&#xff0c;float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2&#xff0c;double2.1 double变量的声明2.2 double的存储格式1.3 double的精度和范围1.4 long double 3&#xff0c;0.2 0.1…...

思科配置路由器,四台主机互相ping通

一、如图配置 PC4和PC5用来配置路由器&#xff0c;各ip、接口如图所示。 二、配置各主机ip、子网掩码SNM、默认网关DGW (一)、PC0 (二)、PC1 (三)、PC2 (四)、PC3 三、 配置路由器Router0 (期间报错是打错了字母) Router>en Router#configure terminal Enter configurat…...

个人博客测试用例设计

个人博客测试用例设计 个人博客测试用例 分别从功能、性能、安全、兼容及界面分别展开 个人博客测试用例...

Java输入输出语句 和 保留字

目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 &#xff1a; 导入该类的所在包, java.util.*创建该类对象&#xff08;声明变量&#xff09;调用里面的功能 案例要求&#xff1a;可以从控制台接收用户信息&#xff0c;【姓…...

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本&#xff0c;训练流程相同&#xff0c;所以只实现代码&#xff0c;感兴趣可以跳转看一下。 生成对抗网络—GAN&#xff08;代码理解&#xff09; http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…...

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…...

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中&#xff0c;封装抽取流程和抽取封装策略是非常重要的技术&#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…...

统一管理:Vue公共组件/公共样式/全局自定义指令

main.js 引入存放公共文件的文件路径 import "./plugins";src/plugins文件夹下的index.js 在处理公共文件中分别引入 /* 公共引入,勿随意修改,修改时需经过确认 */ import Vue from "vue";import "/icons"; // 图标 import ByuiQueryForm fr…...

Linux之旅: 基础知识点的终极指南

文章目录 1、Linux的目录结构2、ls命令3、管理文件和目录4、linux命令使用细节和技巧5、权限管理基本命令6、搜索命令7、管道符与重定向8、压缩和解压命令9、用户及vim编辑器10、用户和用户组管理一、Linux系统用户账号的基本管理二、Linux系统用户组的管理 1、Linux的目录结构…...

C#部分方法有什么用处?和传统方法有什么区别?什么时候用合适?

在C#中&#xff0c;部分类&#xff08;partial class&#xff09;和部分方法&#xff08;partial method&#xff09;是两个不同的概念&#xff0c;但它们经常一起使用&#xff0c;特别是在代码生成和框架设计中。下面我将分别解释这两个概念&#xff0c;并讨论它们的用处、与传…...

elasticsearch hanlp插件远程词典配置

elasticsearch hanlp插件远程词典配置 背景远程词典配置新增远程词典文件修改hanlp-remote.xml自动加载词典 远程词典测试 背景 在使用elasticsearch的过程中&#xff0c;总会遇到与分词相关的需求&#xff0c;这里将针对常用的elasticsearch hanlp&#xff08;后面统称为 es …...

力扣每日一题 6/18 字符串/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2288.价格减免 【中等】 题目&#xff1a; 句子 是由若干个单词组成的字符…...

架构设计 - Nginx Proxy Cache 缓存配置

摘要&#xff1a; web 应用业务缓存通常3级&#xff1a; 一级缓存&#xff1a;JVM 本地缓存 二级缓存&#xff1a;Redis集中式缓存 三级缓存&#xff1a;Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存&#xff1a;静态资源CDN缓存 本文主要分享 Nginx Proxy Cache 缓…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...