自定义 Class CLed 并不总是改变颜色
Custom Class CLed doesnt change color always
我有一个用户界面,我想根据连接稳定性更改图片颜色,模拟 ON/OFF 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 已清除 class;
知道为什么有时有效有时无效吗?
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
,在这种情况下没有任何效果。没有什么可以无效的,所以不会发送绘画消息,如文档中所述:
The UpdateWindow
function updates the client area of the specified
window by sending a WM_PAINT
message to the window if the window's
update region is not empty. The function sends a WM_PAINT
message
directly to the window procedure of the specified window, bypassing
the application queue. If the update region is empty, no message is
sent.
因此,调用 Invalidate()
,然后调用可选的 UpdateWindow()
。
或调用 RedrawWindow()
,这将立即失效并更新,如评论中所述。
旁注,考虑在 OnPaint
函数中使用 CDC::FillSolidRect
。
我有一个用户界面,我想根据连接稳定性更改图片颜色,模拟 ON/OFF 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 已清除 class;
知道为什么有时有效有时无效吗?
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
,在这种情况下没有任何效果。没有什么可以无效的,所以不会发送绘画消息,如文档中所述:
The
UpdateWindow
function updates the client area of the specified window by sending aWM_PAINT
message to the window if the window's update region is not empty. The function sends aWM_PAINT
message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
因此,调用 Invalidate()
,然后调用可选的 UpdateWindow()
。
或调用 RedrawWindow()
,这将立即失效并更新,如评论中所述。
旁注,考虑在 OnPaint
函数中使用 CDC::FillSolidRect
。