用vs2019C++MFC生成一个交通信号灯类,使得交通信号灯对象有红灯、绿灯、黄灯三个状态。信号灯的尺寸、状态可以设定,并能显示到指定的可视窗口中。 信号灯具有倒计时功能,能够设定三种状态的保持时间,启动后能够持续运行MFC程序
时间: 2024-02-23 07:03:27 浏览: 129
好的,我明白了您的问题。下面是一个简单的交通信号灯类的实现示例:
```cpp
class TrafficLight
{
public:
TrafficLight();
virtual ~TrafficLight();
enum LightState { RED, YELLOW, GREEN };
void SetSize(int width, int height);
void SetPosition(int x, int y);
void SetState(LightState state);
void SetRedDuration(int duration);
void SetYellowDuration(int duration);
void SetGreenDuration(int duration);
void Start();
void Stop();
protected:
void Draw(CDC* pDC);
int m_nWidth;
int m_nHeight;
int m_nX;
int m_nY;
LightState m_State;
int m_nRedDuration;
int m_nYellowDuration;
int m_nGreenDuration;
bool m_bRunning;
UINT_PTR m_TimerID;
int m_nCountdown;
};
```
TrafficLight类包含了一些成员函数和变量,用于设定交通信号灯的尺寸、位置、状态和计时器等。其中,LightState枚举类型定义了三种状态:红灯、黄灯和绿灯。
在TrafficLight类的实现文件中,可以按照如下方式实现成员函数:
```cpp
TrafficLight::TrafficLight() :
m_nWidth(50), m_nHeight(100),
m_nX(0), m_nY(0),
m_State(RED),
m_nRedDuration(10), m_nYellowDuration(3), m_nGreenDuration(15),
m_bRunning(false), m_TimerID(0), m_nCountdown(0)
{
}
TrafficLight::~TrafficLight()
{
Stop();
}
void TrafficLight::SetSize(int width, int height)
{
m_nWidth = width;
m_nHeight = height;
}
void TrafficLight::SetPosition(int x, int y)
{
m_nX = x;
m_nY = y;
}
void TrafficLight::SetState(LightState state)
{
m_State = state;
}
void TrafficLight::SetRedDuration(int duration)
{
m_nRedDuration = duration;
}
void TrafficLight::SetYellowDuration(int duration)
{
m_nYellowDuration = duration;
}
void TrafficLight::SetGreenDuration(int duration)
{
m_nGreenDuration = duration;
}
void TrafficLight::Start()
{
if (!m_bRunning)
{
m_bRunning = true;
m_TimerID = SetTimer(NULL, 0, 1000, [](HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
TrafficLight* pLight = reinterpret_cast<TrafficLight*>(idEvent);
if (pLight->m_nCountdown > 0)
{
pLight->m_nCountdown--;
}
else
{
switch (pLight->m_State)
{
case RED:
pLight->m_State = GREEN;
pLight->m_nCountdown = pLight->m_nGreenDuration;
break;
case YELLOW:
pLight->m_State = RED;
pLight->m_nCountdown = pLight->m_nRedDuration;
break;
case GREEN:
pLight->m_State = YELLOW;
pLight->m_nCountdown = pLight->m_nYellowDuration;
break;
}
}
pLight->Draw(pLight->GetDC());
}, reinterpret_cast<UINT_PTR>(this));
}
}
void TrafficLight::Stop()
{
if (m_bRunning)
{
KillTimer(NULL, m_TimerID);
m_bRunning = false;
}
}
void TrafficLight::Draw(CDC* pDC)
{
// 绘制交通信号灯的代码
}
```
在TrafficLight类的构造函数中,初始化了一些成员变量的默认值。在SetSize、SetPosition、SetState、SetRedDuration、SetYellowDuration和SetGreenDuration函数中,分别设置交通信号灯的尺寸、位置、状态和各个状态的保持时间。在Start函数中,启动了一个定时器,用于实现交通信号灯的倒计时功能。在Stop函数中,停止了定时器。在Draw函数中,实现了交通信号灯的绘制功能,这里就不再赘述。
在MFC程序中使用TrafficLight类,可以按照如下方式:
```cpp
// 创建一个TrafficLight对象
TrafficLight light;
light.SetSize(50, 100);
light.SetPosition(0, 0);
light.SetRedDuration(10);
light.SetYellowDuration(3);
light.SetGreenDuration(15);
// 在窗口中显示交通信号灯
CWnd* pWnd = GetDlgItem(IDC_STATIC_SIGNAL);
CDC* pDC = pWnd->GetDC();
light.Start();
```
这里假设窗口中有一个名为IDC_STATIC_SIGNAL的静态文本控件,用于显示交通信号灯。首先创建一个TrafficLight对象,并设定它的尺寸、位置和各种保持时间等参数。然后通过GetDlgItem函数获取静态文本控件的设备上下文,调用TrafficLight的Start函数,开始交通信号灯的倒计时功能。在交通信号灯的状态发生变化时,会自动调用TrafficLight的Draw函数,更新静态文本控件中的图像。当不需要显示交通信号灯时,可以调用TrafficLight的Stop函数停止倒计时功能。
阅读全文