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

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

时间:2024-06-11 20:32:57浏览次数:21  
标签:MFC SHOW cfont IDC SetTimer 计时器 SetFont GetDlgItem ID

一、希望达成效果
       利用基于对话框的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"程序即将关闭 。。。");

      程序运行效果截图如下:

标签:MFC,SHOW,cfont,IDC,SetTimer,计时器,SetFont,GetDlgItem,ID
From: https://blog.csdn.net/m0_72128260/article/details/139607542

相关文章

  • 会声会影启动报错:找不到mfc110.dll文件的全面解决策略
    在使用会声会影进行视频编辑时,遇到“丢失mfc110.dll”错误提示,无疑会给创作过程带来不小的困扰。这个错误通常意味着系统中缺少了一个重要的动态链接库文件,而mfc110.dll是MicrosoftVisualC++RedistributablePackage的一部分,对于运行许多基于VisualC++开发的应用程序至关重......
  • MFC IE控件使用
    Explorer.h#pragmaonce//MachinegeneratedIDispatchwrapperclass(es)createdbyMicrosoftVisualC++//NOTE:Donotmodifythecontentsofthisfile.Ifthisclassisregeneratedby//MicrosoftVisualC++,yourmodificationswillbeoverwritten.......
  • 台球计时器怎么安装,台球计时计费系统电脑怎么下载,佳易王桌球计时计费软件操作教程系列
    台球计时器怎么安装,台球计时计费系统电脑怎么下载,佳易王桌球计时计费软件操作教程系列一、前言以下软件操作教程以,佳易王计时计费软件为例说明软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、台球计时计费软件,可以连接灯控,在点开始计时的时候,自动......
  • 爱剪辑升级后遇困:mfc140u.dll文件缺失怎么办?
    在享受视频编辑的乐趣时,爱剪辑作为一款广受欢迎的视频编辑软件,其每一次更新都牵动着众多用户的心。然而,近期部分用户在兴奋地升级到最新版本后,却遇到了一个棘手的问题——系统提示缺少“mfc140u.dll”文件,导致软件无法正常启动。这一突如其来的错误让不少视频创作爱好者措手不......
  • 2种方法解决需要clik点击数的题目——[HNCTF 2022 WEEK2]getflag 137分 MFC patch RE
    题目   DIEIDA找到判断点击数的if,我们修改一下汇编指令让点击数<99999999就成立这个程序没有要求我们输入,说明flag是程序打印的IDA动调 下一个断点修改 得到flag  还有一种更快的方法——CheatEngine 随便点击几次 在CE中修改点击次数 Getf......
  • MFC中动态创建多个按钮并实现其消息响应
    我们需要根据程序输入或运行时信息在界面上动态生成一个或多个按钮,并分别添加消息响应,实现这一目标包括如下几步:1.在类中声明按钮变量指针CButtonbtnArray[n];2.在类中声明并定义按钮控件的ID, buttonID=10000;3.想要创建按钮的数量staticconstintn=6;主要这几行:af......
  • QT开发和MFC开发的经典案例
    QT========================3DSlicer,afreeopensourcesoftwareforvisualizationandmedicalimagecomputingAcetoneISO:镜像文件挂载软件AdobePhotoshopAlbum,一个图像组织应用程序[35]Arora:一款跨平台的开源网页浏览器AutodeskMotionBuilder,三维角色动画软件Autod......
  • Dota2刀塔找不到mfc140u.dll无法继续执行问题的全面分析与解决策略
    最近很多玩家玩Dota2刀塔遇到了找不到mfc140u.dll无法继续的问题,其中mfc140u.dll是一个动态链接库(DynamicLinkLibrary,DLL)文件,它是专为MicrosoftWindows操作系统设计的。那么应该如何解决呢?下面一起来看看具体的解决方法介绍吧!方法一:从回收站还原检查回收站中是否有误删......
  • 【C++】【MFC】模态和非模态对话框
    1、模态对话框,开启后限制操作父窗口voidCMFCApplication1Dlg::OnBnClickedButton2(){//TODO:在此添加控件通知处理程序代码CDlgExeCexec;exec.DoModal();}调用DoModal即可完成。 2、非模态对话框,开启后对任意窗口都无限制voidCMFCApplication1Dlg......
  • MFC 无按钮消息提示框
    一、背景MFC里的消息提示框(MessageBox)是带按钮的,比如:MB_OK,MB_OKCANCEL,MB_YESNO,不支持无按钮的情况。二、方案通过建立一个非模态对话框(不会阻塞程序往下运行),并在里面添加一个静态文本框(设置只读属性),然后将要提示的内容设置给这个文本框,将标题设置给对话框,再居中显示这个对话框......