自定义类CLed不会总是改变颜色

时间:2019-05-25 19:34:45

标签: c++ image class mfc dialog

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

任何想法为何有时会起作用?

1 个答案:

答案 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:

  

UpdateWindow函数更新指定客户区   通过向窗口发送WM_PAINT消息(如果窗口的   更新区域不为空。该函数发送WM_PAINT消息   直接绕过指定窗口的窗口过程,绕过   应用程序队列。如果更新区域为空,则没有消息   已发送。

因此,先呼叫Invalidate(),再呼叫可选的UpdateWindow()

或致电RedrawWindow(),它将立即失效并进行更新,如注释中所述。

旁注,请考虑在CDC::FillSolidRect函数中使用OnPaint