改变窗口背景颜色在计时器

问题描述:

我试图弄清楚如何每秒更改一个按钮的背景色。从一种颜色转到另一种颜色。 这是我如何创建我的按钮。或者如果可能的话,你怎么能改变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; 
} 

该按钮似乎变色,但它是快速。我不知道如何解决这个问题。

+0

难道你不想让WM_TIMER关闭WM_ERASEBKGND吗? [使用计时器](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644901(v = vs.85).aspx) –

+1

您当前正在将超时值设置为20毫秒你的计时器,所以我应该认为颜色的变化*会很快!你有没有试图延长这一点?正如约翰尼暗示的那样,您不会向我们展示您的WM_TIMER消息处理程序的代码,但我认为该部分是正确的。 –

+0

除了@CodyGray的评论,我们还假设你在你的消息映射中有一个'ON_WM_TIMER()'条目。 – sergiol

我更喜欢在这种情况下使用CMFCButton,前提是您使用的是MFC。

的步骤是非常简单的:

  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); 
    } 
    

上述实施帮助我提高色彩的Red部分逐渐每秒和几秒钟后(后100秒左右)按钮将开始寻找红色。