mfc交通信号灯加上倒计时
时间: 2023-08-16 16:07:06 浏览: 109
汇编交通灯带倒计时
在交通灯的基础上增加倒计时功能,可以让交通灯更加真实。以下是一个简单的 MFC 交通信号灯控制同时带有倒计时功能的示例代码:
首先,在你的 MFC 应用程序中创建一个对话框,然后在对话框上添加三个按钮分别代表红灯、黄灯和绿灯。在对话框上添加两个静态文本框用于显示当前灯的状态和倒计时时间。
在对话框的头文件中添加以下变量和函数声明:
```cpp
// TrafficLightDlg.h
// 灯的状态枚举类型
enum TrafficLightState
{
RED,
YELLOW,
GREEN
};
// 对话框类
class CTrafficLightDlg : public CDialogEx
{
...
private:
TrafficLightState m_state; // 当前灯的状态
CStatic m_lightCtrl; // 显示灯的静态文本框
CStatic m_countdownCtrl; // 显示倒计时的静态文本框
int m_countdown; // 倒计时剩余时间
bool m_isCountdown; // 是否正在倒计时
// 控制灯的函数
void SetLight(TrafficLightState state);
// 开始倒计时
void StartCountdown(int seconds);
// 停止倒计时
void StopCountdown();
};
```
在对话框的源文件中实现 `SetLight` 函数:
```cpp
// TrafficLightDlg.cpp
void CTrafficLightDlg::SetLight(TrafficLightState state)
{
// 根据状态设置不同的灯颜色
switch (state)
{
case RED:
m_lightCtrl.SetBackColor(RGB(255, 0, 0)); // 红灯
m_countdownCtrl.SetWindowText(_T("30")); // 设置倒计时时间为30秒
break;
case YELLOW:
m_lightCtrl.SetBackColor(RGB(255, 255, 0)); // 黄灯
m_countdownCtrl.SetWindowText(_T("5")); // 设置倒计时时间为5秒
break;
case GREEN:
m_lightCtrl.SetBackColor(RGB(0, 255, 0)); // 绿灯
m_countdownCtrl.SetWindowText(_T("15")); // 设置倒计时时间为15秒
break;
}
// 保存当前状态和倒计时时间
m_state = state;
m_countdown = _ttoi(m_countdownCtrl.GetWindowText()); // 将倒计时时间转换为整数
}
```
在对话框的消息映射中,添加按钮的响应函数,控制灯的状态并开始倒计时:
```cpp
// TrafficLightDlg.cpp
BEGIN_MESSAGE_MAP(CTrafficLightDlg, CDialogEx)
...
ON_BN_CLICKED(IDC_RED_BUTTON, &CTrafficLightDlg::OnRedButtonClicked)
ON_BN_CLICKED(IDC_YELLOW_BUTTON, &CTrafficLightDlg::OnYellowButtonClicked)
ON_BN_CLICKED(IDC_GREEN_BUTTON, &CTrafficLightDlg::OnGreenButtonClicked)
END_MESSAGE_MAP()
void CTrafficLightDlg::OnRedButtonClicked()
{
SetLight(RED); // 控制红灯
StartCountdown(30); // 开始倒计时,时间为30秒
}
void CTrafficLightDlg::OnYellowButtonClicked()
{
SetLight(YELLOW); // 控制黄灯
StartCountdown(5); // 开始倒计时,时间为5秒
}
void CTrafficLightDlg::OnGreenButtonClicked()
{
SetLight(GREEN); // 控制绿灯
StartCountdown(15); // 开始倒计时,时间为15秒
}
```
在对话框的 `OnTimer` 函数中更新倒计时时间,当时间到达0时停止倒计时:
```cpp
// TrafficLightDlg.cpp
void CTrafficLightDlg::OnTimer(UINT_PTR nIDEvent)
{
if (m_isCountdown)
{
// 更新倒计时时间
m_countdown--;
CString strCountdown;
strCountdown.Format(_T("%d"), m_countdown);
m_countdownCtrl.SetWindowText(strCountdown);
if (m_countdown == 0)
{
// 时间到了,停止倒计时
StopCountdown();
}
}
CDialogEx::OnTimer(nIDEvent);
}
```
在对话框的 `OnInitDialog` 函数中初始化灯的状态和倒计时控件:
```cpp
// TrafficLightDlg.cpp
BOOL CTrafficLightDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 初始化灯的状态为红灯,倒计时时间为30秒
SetLight(RED);
// 初始化倒计时控件
m_countdownCtrl.SetWindowText(_T("30"));
// 启动定时器,每秒更新一次倒计时时间
SetTimer(1, 1000, NULL);
return TRUE;
}
```
最后,在对话框的 `StartCountdown` 和 `StopCountdown` 函数中启动和停止倒计时:
```cpp
// TrafficLightDlg.cpp
void CTrafficLightDlg::StartCountdown(int seconds)
{
m_countdown = seconds;
m_isCountdown = true;
}
void CTrafficLightDlg::StopCountdown()
{
m_isCountdown = false;
SetLight(RED); // 倒计时结束后自动切换到红灯
}
```
这样,当用户单击不同的按钮时,灯的状态会发生变化并启动对应的倒计时,倒计时结束后灯会自动切换到红灯。
阅读全文