自定义 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,在这种情况下没有任何效果。没有什么可以无效的,所以不会发送绘画消息,如文档中所述:

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