网站集约整合建设交流,做相亲网站需要什么流程,自己设计房子装修app免费,保定企业自助建站一、希望达成效果 利用基于对话框的MFC项目#xff0c;做一个一方面能够显示当前时间#xff1b;另一方面在点击开始按钮时进行读秒计时#xff0c;计时结果动态显示#xff0c;当点击结束时读秒结束并保持最后结果。 二、编程步骤及相关代码、注释 1、启动VS…一、希望达成效果 利用基于对话框的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 显示分 属性IDIDC_TITLE 显示计时器 上面IDC_TITLE以及下面介绍的一些控件没有添加变量名目的是为了在程序中介绍如何使用变量以及仅使用ID调用成员函数的方法在这个程序中加不加变量名无所谓。 3、从工具箱拖入文本编辑框5个用于显示当前时间2个用于显示读秒。使用与静态文本框相似的方法为这些文本编辑框更改ID。 属性IDIDC_SHOW_YEAR 显示年不是“年”字指2024下同 属性IDIDC_SHOW_MONTH 显示月 属性IDIDC_SHOW_DAY 显示日 属性IDIDC_SHOW_HOUR 显示时 属性IDIDC_SHOW_MINUTE 显示分 属性IDIDC_SHOW_TIMER1 变量名m_showTimer1 显示读秒 注这里只有它加了变量名 属性IDIDC_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 isStartFALSE; //声明是否计时的逻辑变量 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); //设置系统及时器利用它实现周期性变化显示
//设置控件焦点到开始计时按钮注意本函数的返回值要改成FALSEGetDlgItem(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* pDCGetDC();//获取当前窗口设备上下文指针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程序即将关闭 。。。); 程序运行效果截图如下