我有一个用户界面,我想根据连接稳定性模拟“开/关” 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/

10-10 08:02