我有一个用户界面,我想根据连接稳定性模拟“开/关” LED来更改图片颜色。但是问题在于它仅在变红时才起作用。实际上,在另一个“LED”中,它变为绿色,而没有告知。
在图像中变成红色的矩形
我已经尝试过使用m_statusMotor.UpdateWindow()甚至UpdateData(0)之类的东西。但是,它不起作用。调试时,我看到值m_statusMotor.m_color正确更改为0,但没有更改LED颜色。
这就是我的类(class)CLed所做的:
void CLed::OnPaint()
{
CPaintDC dc(this);
CRect r;
GetClientRect(r);
CBrush b1;
switch(m_color){
case 0:
b1.CreateSolidBrush(RGB(0, 255, 0)); // verde
break;
case 1:
b1.CreateSolidBrush(RGB(255, 0, 0)); // rojo
break;
case 2:
b1.CreateSolidBrush(RGB(255, 118, 0)); // ambar
break;
default:
b1.CreateSolidBrush(RGB(160, 160, 160)); // gris
break;
}
dc.SelectObject(&b1);
dc.Rectangle(r);
}
这确实变为红色:
if(!misoc1.Connect(m_ipMotor, m_portMotor)){
if(!connectedmotor) m_log.AddString("No conecta con el puerto de motor");
connectedmotor = true;
firststrmotor = false;
m_statusMotor.m_color = 1;
m_statusMotor.Invalidate(true);
m_log.UpdateWindow();
UpdateData(0);
m_statusMotor.UpdateWindow();
}else connectedmotor = false;
这就是它变成绿色的地方
if(!firststrmotor){
m_log.AddString("Motor OK");
m_log.UpdateWindow();
m_statusMotor.m_color = 0;
UpdateData(0);
m_statusMotor.UpdateWindow();
}
m_statusMotor是CLed类;
任何想法为什么它有时会起作用?
最佳答案
在第一个函数中,您已经正确调用了Invalidate
,随后是可选的UpdateWindow
(如果该函数阻止了Windows消息,则UpdateWindow
在此处很有用)
在第二个函数中,您忘记了调用Invalidate
,而只是调用了UpdateWindow
,在这种情况下它没有任何作用。没有无效的内容,因此不会发送任何绘画消息,如文档中所述:
UpdateWindow:
因此,先调用Invalidate()
,再调用可选的UpdateWindow()
。
或调用 RedrawWindow()
,它将立即失效并立即更新,如注释中所述。
旁注,请考虑在CDC::FillSolidRect
函数中使用OnPaint
。
关于c++ - 自定义类CLed不会总是改变颜色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56308086/