在计时器上更改窗口背景颜色

时间:2017-09-15 17:57:07

标签: visual-c++ graphics

我无法确定如何每秒更改按钮的背景颜色。从一种颜色到另一种颜色。 这就是我创建My Button的方式。或者如果可能的话,你怎么能改变onPaint之外的HWND实例的颜色?

hButton = CreateWindowEx(WS_EX_TRANSPARENT, "Button","B",
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    20, 30, 20, 20, hwnd, (HMENU)ID_BUTTON,
    hInst, NULL);

这是WndProc中更改的颜色案例。

case WM_ERASEBKGND:

     RECT rc;
     GetClientRect(hButton, &rc);
     SetBkColor((HDC)wParam, 0x000000ff); // red
     ExtTextOut((HDC)wParam, 0, 0, ETO_OPAQUE, &rc, 0, 0, 0);
     return 1;

以下是我设置计时器的方法。

if (!SetTimer(hwnd, TIMER1, 20, NULL))
{
    MessageBox(hwnd, "No Timers Available", "Info", MB_OK);
    return FALSE;
}

这个按钮似乎有颜色,但它要快速。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果您使用的是MFC,我更喜欢在这种情况下使用CMFCButton

步骤非常简单:

  1. 添加CMFCButton类型的成员变量(控件类型)。假设您将变量声明为CMFCButton m_hButton2;

  2. 修改OnInitDialog()功能并添加以下行:

    m_hButton2.m_nFlatStyle = CMFCButton::BUTTONSTYLE_NOBORDERS;
    m_hButton2.m_bTransparent = false;
    SetTimer(255, 1000, NULL);
    
  3. 实施OnTime()功能以更改选择的颜色。我已经实现了类似下面的内容。

    void CMFCApplicationDialogDlg::OnTimer(UINT_PTR nIDEvent)
     {
        if(nIDEvent == 255)
        {
            static int nRedColor = 0;
            m_hButton2.SetFaceColor(RGB(nRedColor++,0,0), true);
        }
        CDialogEx::OnTimer(nIDEvent);
     }
    
  4. 上述实现有助于我每秒逐渐增加Red部分颜色,几秒钟后(100秒左右)按钮将开始显示红色。