用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件

用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件,第1张

一、程序窗口设计步骤

(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项(不删除也可),其他各选项均可用缺省设置。

(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。

(3)利用ClassWizard为视图类添加菜单命令处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。

(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为 CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。

(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件。

通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。

(6)利用ClassWizard自动建立对话框类。进入ClassWizard后,d出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会d出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。

(7) 利用ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量。

控制ID

变量类型

变量名

变量范围

IDC_YEAR

int

m_Year

0~3000

IDC_MONTH

int

m_Month

1~12

IDC_DAY

int

m_Day

1~31

IDC_HOUR

int

m_Hour

0~23

IDC_MINUTE

int

m_Minute

0~59

IDC_SECOND

int

m_Second

0~59

最后一列为变量取值范围。

(8)编辑工程的图标资源,在Resource View选项窗口中修改Icon结点所包含的主框架图标(IDR_MAINFRAME)。此步非必须。

(9)完成以上工作后,即可修改程序框架,添加必要的代码。

二、主要源代码:

按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。

(1) 添加表示年、月、日、时、分、秒的变量。

int year;

int month;

int day;

int hour;

int minute;

int second;

(2) 添加秒表的计数变量。

int watch;

(3) 添加时钟的画笔及画刷变量。

CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔

CBrush m_MarkBrush; // 表盘标记的画刷

(4) 添加时钟控制变量。

CPoint m_Center; // 表的中心

double m_Radius; // 表的半径

CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置

CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置

CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置

(5) 添加秒表的两个按钮位置变量。

CRect m_WatchStart;

CRect m_WatchStop;

(6) 添加两个函数,计算时钟各指针位置。

void SetClock (int hour, int minute, int second);

CPoint GetPoint (int nLenth, int nValue);

(7) 在视图类构造函数中增加初始化语句,之前加上头文件

#include<ctime>

CClockView::CClockView()

{

// 设定时间

char time[32];

SYSTEMTIME st;

GetLocalTime(&st);

day = stwDay;

hour = stwHour;

minute = stwMinute;

month = stwMonth;

second = stwSecond;

year = stwYear;

// 设定画笔/画刷

m_HouPen CreatePen (PS_SOLID, 5, RGB (255, 0, 0) ); // 时针画笔

m_MinPen CreatePen (PS_SOLID, 3, RGB (0, 0, 250) ); // 分针画笔

m_SecPen CreatePen (PS_SOLID, 1, RGB (0, 0, 0) ); // 秒针画笔

m_MarkBrush CreateSolidBrush (RGB (250, 250, 0) );

// 设定表心位置

m_Center x = 200;

m_Center y = 200;

// 设定时钟半径

m_Radius = 200;

// 计算指针位置

SetClock (hour, minute, second);

// 设定秒表计数器及按钮位置

watch = 0;

m_WatchStart = CRect (480, 310, 560, 340); // 启动钮

m_WatchStop = CRect (590, 310, 670, 340); // 停止钮

}

编写指针位置计算函数SetClock和GetPoint。首先在ClockView cpp文件头部添加下面两行代码,以便进行数学计算。

#include "mathh"

#define PI 314159265

然后添加下列代码:

//计算各个指针位置的函数

void CClockView::SetClock(int hour, int minute, int second)

{

hour=hour5;

hour=hour+minute/12;

// 保存时针原位置

m_OldHour [0] = m_Hour[0];

m_OldHour [1] = m_Hour[1];

// 计算时针当前位置

m_Hour[0]= GetPoint(int(m_Radius/2),hour);

m_Hour[1]= GetPoint(7,hour + 30);

// 保存分针原位置

m_OldMin[0]= m_Minute[0];

m_OldMin[1]= m_Minute[1];

// 计算分针当前位置

m_Minute[0]=GetPoint(int(m_Radius7/10), minute);

m_Minute[1]=GetPoint(10, minute+30);

// 保存秒针原位置

m_OldSec [0] = m_Second [0];

m_OldSec [1] = m_Second [1];

// 计算秒针当前位置

m_Second [0]= GetPoint (int(m_Radius 8/10), second);

m_Second [1] = GetPoint (30, second + 30);

}

// 计算以表心为原点的指针的端点位置

CPoint CClockView ::GetPoint (int nLenth, int nValue)

{

CPoint p;

double angle = nValue PI /30-PI/2;

px = m_Centerx + (int) (nLenth cos(angle));

py = m_Centery + (int) (nLenth sin(angle));

return p;

}

绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表,在OnDraw函数中添加下面代码:

void CClockView::OnDraw(CDC pDC)

{

CClockDoc pDoc = GetDocument();

ASSERT_VALID(pDoc);

// 绘制表盘上的标记

pDC->SelectObject(m_MarkBrush);

int k=0;

for(int i=0;i<60;i++)

{

CPoint pt=GetPoint(175,i);

if (i%5==0)

{

//显示表盘上的数字

CString str[12]={"12","1","2","3","4","5","6","7","8","9","10","11"};

pDC->TextOut(ptx-5,pty-5,str[k]);

k++;

}else

{

//显示数字之间的圆圈

pDC->Ellipse(ptx-2,pty-2,ptx+2,pty+2);

}

}

// 画时针

pDC->SelectObject (m_HouPen);

if (m_OldHour[0]!= m_Hour[0])

{

// 用白色覆盖原位置时针

pDC->SetROP2(R2_WHITE);

pDC->MoveTo(m_OldHour [0] );

pDC->LineTo(m_OldHour [1] );

pDC->SetROP2(R2_COPYPEN);

//时针绘制

pDC->MoveTo(m_Hour[0]);

pDC->LineTo(m_Hour[1]);

}

else

{

// 时针绘制

pDC->MoveTo(m_Hour[0]);

pDC->LineTo(m_Hour[1]);

}

// 画分针

pDC->SelectObject (m_MinPen);

if (m_OldMin[0]!=m_Minute[0])

{

// 用白色覆盖原位置分针

pDC->SetROP2(R2_WHITE);

pDC->MoveTo(m_OldMin[0]);

pDC->LineTo(m_OldMin[1]);

pDC->SetROP2(R2_COPYPEN);

// 分针绘制

pDC->MoveTo(m_Minute[0]);

pDC->LineTo(m_Minute[1]);

}

else

{

// 分针绘制

pDC->MoveTo(m_Minute[0]);

pDC->LineTo(m_Minute[1]);

}

// 用白色覆盖原位置秒针

pDC->SelectObject(m_SecPen);

pDC->SetROP2(R2_WHITE);

pDC->MoveTo(m_OldSec[0]);

pDC->LineTo(m_OldSec[1]);

pDC->SetROP2(R2_COPYPEN);

// 秒针绘制

pDC->MoveTo(m_Second[0]);

pDC->LineTo(m_Second[1]);

// 数字时钟显示

pDC->SelectStockObject(WHITE_BRUSH);

pDC->Rectangle(450,30,700,180);

pDC->TextOut(535,20,"当前时间");

CString m_Date,m_Time;

m_DateFormat ("% 4d年%4d月%4d日",year,month,day);

pDC->TextOut(510,70,m_Date);

m_TimeFormat("%4d点%4d分%4d秒",hour,minute,second);

pDC->TextOut(510,100,m_Time);

// 秒表显示

pDC->Rectangle(450,220,700,370);

pDC->TextOut(545,200,"秒 表");

int minSec= watch%100;

int Sec=(watch/100)%60;

int Min=(watch/100)/60;

m_TimeFormat("% 02d: % 02d: % 02d",Min,Sec,minSec);

pDC->TextOut(535,260,m_Time);

pDC->Rectangle(&m_WatchStart);

pDC->Rectangle(&m_WatchStop);

pDC->TextOut(m_WatchStartleft + 18,m_WatchStarttop + 5,"启动");

pDC->TextOut(m_WatchStopleft + 18,m_WatchStoptop + 5,"停止");

}

请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。另外,watch计数器以1/100秒为计数单位,每达到100则秒数加1。

按照下列步骤增加时钟控制代码:

修改Onstart和OnStop函数,设置时钟运动消息。按比正常时钟快20倍的假定,50ms产生一个消息。本程序采用和正常时间同步,即1000ms产生一个消息, 其代码为:

void CClockView::OnStart()

{

SetTimer (1, 1000, NULL);

}

void CClockView::OnStop()

{

KillTimer (1);

}

修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化 ,其代码为:

void CClockView::OnTimer(UINT nIDEvent)

{

if (nIDEvent == 1)

{

second++; // 秒增加

if (second>59)

{

second=0;

minute++; // 分增加

}

if (minute>59)

{

minute= 0;

hour++; // 小时增加

}

if (hour>23)

{

hour=0;

day++; // 日增加

}

switch(month)

{

case 1: // 大月

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:

if (day>31)

{

day= 1;

month++; // 月增加

}

break;

case 4: // 小月

case 6:

case 9:

case 11:

if (day>30)

{

day=1;

month++; // 月增加

}

break;

case 2:

if (year%4 ==0 && day>29) // 润二月

{

day=1;

month++; // 月增加

}

if (year%4!=0 && day>28) // 二月

{

day=1;

month++;

}

break;

}

if (month > 12)

{

// 年增加

year++;

month=1;

}

SetClock (hour, minute, second);

Invalidate (false);

}

// 秒表定时器消息处理

if (nIDEvent == 2)

{

watch++;

Invalidate (false);

}

CView::OnTimer(nIDEvent);

}

添加时间设置对话框代码。

首先在ClockView cpp文件头部添加下列语句:

#include “SetTimeDlg h”

在时间设定对话框类的构造函数中,做如下修改,将初始日期设为当前时间,之前要加上头文件

#include<ctime>

CSetTimeDlg::CSetTimeDlg(CWnd pParent /=NULL/)

: CDialog(CSetTimeDlg::IDD, pParent)

{

//||AFX_DATA_INIT(CSetTimeDlg)

char time[32];

SYSTEMTIME st;

GetLocalTime(&st);

m_Day = stwDay;

m_Hour = stwHour;

m_Minute = stwMinute;

m_Month = stwMonth;

m_Second = stwSecond;

m_Year = stwYear;// ||AFX_DATA_INIT

}

最后,在OnSettime函数中添加代码如下:

void CClockView::OnSettime()

{

CSetTimeDlg SetDlg;

if (SetDlgDoModal ()==IDOK)

{

year=SetDlgm_Year;

month= SetDlgm_Month;

day= SetDlgm_Day;

hour=SetDlgm_Hour;

minute=SetDlgm_Minute;

second=SetDlgm_Second;

}

// 计算各指针位置

SetClock (hour,minute,second);

Invalidate (true);

}

按以下步骤设计秒表控制程序:

在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:

void CClockView::OnLButtonDown(UINT nFlags, CPoint point)

{

if (m_WatchStartPtInRect(point))

{

watch=0;

SetTimer(2,10,NULL);

}

if (m_WatchStopPtInRect(point))

{

KillTimer (2);

}

CView::OnLButtonDown(nFlags, point);

}

编译,连接,运行程序。

运行结果:

Private Sub Form_Load()

MeCaption = "数字时钟"

Timer1Interval = 1000

Timer1Enabled = True

End Sub

Private Sub Timer1_Timer()

Label1Caption = Format(Now, "yyyy年m月d日")

Label2Caption = Format(Now, "hh时nn分ss秒")

End Sub

前面几个的回答都很好,找到了问题的原因和解决办法。

写程序之前一定要先从系统的级别构建一下程序的结构。

你的程序中,有数码管扫描显示、按键扫描、RTC三部分。

在构建程序结构的时候,考虑到几个部分的特点,一般情况如下:

1、如果时间显示到秒,应在100ms左右读一次RTC。

2、为了保证显示不删,应在20ms以内完成一次显示刷新,假设你用了20个数码管显示日期和时间。

3、按键是随机的,需要检测,一般按键按下的时间不小于50ms,可以考虑在10ms检测一次按键。

程序可以定义一个1ms的定时器,设置几个变量对定时器进行计数。

每个1ms定时到时,自加对定时器的计数,并更新数码管显示,20ms更新完20个数码管。

每到10ms检测一次按键,记录状态,与上次状态进行比较,如果连续两次或三次检测到按键按下,设置按键动作的标记,并确定如何更改显示,改变显存。

如果不在设置状态,每100ms读一次RTC的值,将值更新到显存。

如果数码管需要调整亮度,可以将1ms定时器改为100us,分给每个数码管的1ms内,改变其点亮的时间,就可以调出十种亮度。

用这种架构做这个程序,处理器负担很轻,对所有的外设的响应一样迅速。你会感到51单片机还是能干很多活的。

vivo手机设置闹钟方法:

进入闹钟时钟 → 点击右上角“+”,编辑添加新的闹钟;

OriginOS系统可直接点击桌面闹钟组件语音图标或进入闹钟--右上角语音图标,可以语音创建闹钟;

贪睡小助手 (部分机型支持):进入闹钟时钟--点击需要设置的闹钟--贪睡,开启“贪睡小助手”功能,闹钟贪睡超过5次将自动发送信息给指定的联系人;

闹钟铃声:

OriginOS系统:进入闹钟时钟--点击单个闹钟--更多设置--提醒方式--设置铃声即可;

Funtouch OS/iQOO UI系统:进入闹钟时钟--点击需要设置的闹钟--铃声,选择自定义铃声或者系统备选铃声;

语音播报:进入闹钟时钟--点击需要设置的闹钟--开启“语音播报”,在手动关闭闹钟后,系统将自动为您语音播报当天的天气。

以苹果 7手机为例

*** 作步骤

1、开始,先在手机的桌面上找到应用程序“设置”图标,点击进入新的页面。

2、接下来,到了设置的面板之后,选取“通用”一栏,点击进入。

3、到了通用的面板之后,选取“日期和时间”一栏,点击进入。

4、到了日期和时间的面板之后,即可根据个人需求进行时钟的设置。

首先在主程序中注释掉SystemInit();

然后使用下面的函数做为系统时钟的初始化函数

void RCC_Configuration(void)

{

RCC_DeInit();//将外设 RCC寄存器重设为缺省值

RCC_HSICmd(ENABLE);//使能HSI

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置 PLL 时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

//等待指定的 RCC 标志位设置成功 等待PLL初始化成功

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置系统时钟(SYSCLK) 设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

//等待PLL成功用作于系统时钟的时钟源

//  0x00:HSI 作为系统时钟

//  0x04:HSE作为系统时钟

//  0x08:PLL作为系统时钟

while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

void RCC_Configuration(void)

{

   RCC_DeInit();//将外设 RCC寄存器重设为缺省值

   RCC_HSICmd(ENABLE);//使能HSI  

   while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

   //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

   //FLASH_SetLatency(FLASH_Latency_2);

 

   RCC_HCLKConfig(RCC_SYSCLK_Div1);  

   RCC_PCLK1Config(RCC_HCLK_Div2);

   RCC_PCLK2Config(RCC_HCLK_Div1);

   

   //设置 PLL 时钟源及倍频系数

   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

   RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

   //等待指定的 RCC 标志位设置成功 等待PLL初始化成功

   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

   //设置系统时钟(SYSCLK) 设置PLL为系统时钟源

   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

   //等待PLL成功用作于系统时钟的时钟源

   //  0x00:HSI 作为系统时钟

   //  0x04:HSE作为系统时钟

   //  0x08:PLL作为系统时钟  

   while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

补充一点:

由图可以看出系统时钟的供给可以有3种方式,HSI,HSE,PLL。如果选用内部时钟作为系统时钟,其倍频达不到72Mhz,最多也就8Mhz/216 = 64Mhz。

以上就是关于用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件全部的内容,包括:用MFC编写一个指针型时钟程序,时钟还具有闹钟和倒计时功能,求能在mfc里执行的整个文件、vb中设置一个数字时钟界面,每改变一秒就更新一次,求程序。、单片机控制程序 问 设置时钟程序 因代码太多 以至于数码管用延时函数无法稳定显示,前辈们有什么方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9645911.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存