要求:
模拟交通灯:
(1)建立一个单文档应用项目(项目名称为学生姓名拼音首字母缩写)。
(2)修改它的图标和版本信息。
(3)为该应用项目添加两个按钮到工具栏中。
(4)在视图窗口中显示三个圆,通过使用不同颜色的画笔及画刷来模拟交
通红、绿灯。
设计思路及结果功能描述:
根据考核题目及要求,设计的思路如下:先建立一个单文档应用项目,修改其版本信息和图标,为该应用项目添加两个按钮到工具栏中,分别命名为“开始”和“停止”,在视图窗口中显示三个圆,使用不同颜色的画笔及画刷给三个圆上色,同时添加一个倒计时显示,最后将这几个元素关联起来。倒计时到一定的时间时,红黄绿等分别交替亮起,模拟交通灯。
设计方案如下,建立单文档后,修改版本和图标,添加“开始”和“停止”按钮,完成上述的操作后在hy_traffic_lightView.h文件下,定义了time_queue结构体,包含红绿灯的标识nLight_statu以及灯亮的时间值nTimeOut,定义了当前时间current_time_index和计数时间 _time_count。定义一个名为time_queue的动态数组,在OnInitialUpdate函数中向该数组尾部添加元素,即灯的状态与持续的时间值,通过push_back从尾部添加新元素,实现对结构进行初始化操作,以及交通灯逻辑功能的设置。
在OnTimer函数中,根据得到的TimeOut值进行数值的变化并且根据当前值使用switchLight显示当前灯的状态,即给绘制的图形上色。
在OnDraw函数中,实现使用memDC进行绘图显示,获取屏幕的大小后,通过算法得到三个矩形的位置坐标与宽度等参数,再在drawLight上使用Ellipse画内切圆,设置视图的背景颜色以及初始化逻辑刷子,以及添加根据LightStatus标识决定三个圆颜色的语句,同时使用Format设置倒计时显示的输出位置与格式设置,最后使用BitBlt将图拷贝到屏幕上显示。
使用OnControlStart开启定时器,整个视图开始工作,OnControlStop关闭定时器,整个视图暂停,重新开启时,又会恢复最初的状态运行。
其功能就与日常所见的交通灯相同,附加了停止和开始的按钮,点击“开始”时,红灯先亮,伴随着时间的倒数,倒数到一定时间后,转为黄灯亮,再转为绿灯亮,依次循环;点击“停止”时,暂停在当前状态,当再次点击 “开始”时,又会重新运行。
【修改图标的方法可参考之前发的博客】
运行结果如下:
完整代码参考:https://download.csdn.net/download/baiyan_gjr521/10404669?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168802106116800180664728%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168802106116800180664728&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-10404669-null-null.142^v88^insert_down38v5,239^v2^insert_chatgpt&utm_term=MFC%E6%A8%A1%E6%8B%9F%E4%BA%A4%E9%80%9A%E7%81%AF&spm=1018.2226.3001.4187.3