我有一个用户界面,我想根据连接稳定性来模拟“开/关” LED来更改图片颜色。但是问题在于它仅在变红时才起作用。实际上,在另一个“ LED”中,它变为绿色而没有告知。
图像中呈红色的矩形
我已经尝试使用m_statusMotor.UpdateWindow()甚至UpdateData(0)之类的东西。但是,它不起作用。调试时,我看到值m_statusMotor.m_color正确更改为0,但没有更改LED颜色。
这就是我的课堂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类;
任何想法为何有时会起作用?
答案 0 :(得分:3)
function1() { m_statusMotor.m_color = 1; m_statusMotor.Invalidate(true); m_statusMotor.UpdateWindow(); ... } function2() { m_statusMotor.m_color = 0; m_statusMotor.UpdateWindow(); ... }
在第一个函数中,您正确地调用了Invalidate
,然后是可选的UpdateWindow
(如果该函数阻止了Windows消息,UpdateWindow
在这里很有用)
在第二个函数中,您忘记调用Invalidate
,而您刚刚调用的UpdateWindow
在这种情况下没有任何作用。没有无效的内容,因此不会发送任何绘画消息,如文档中所述:
UpdateWindow
函数更新指定客户区 通过向窗口发送WM_PAINT
消息(如果窗口的 更新区域不为空。该函数发送WM_PAINT
消息 直接绕过指定窗口的窗口过程,绕过 应用程序队列。如果更新区域为空,则没有消息 已发送。
因此,先呼叫Invalidate()
,再呼叫可选的UpdateWindow()
。
或致电RedrawWindow()
,它将立即失效并进行更新,如注释中所述。
旁注,请考虑在CDC::FillSolidRect
函数中使用OnPaint
。