2017-09-15 56 views
-3

我試圖弄清楚如何每秒更改一個按鈕的背景色。從一種顏色轉到另一種顏色。 這是我如何創建我的按鈕。或者如果可能的話,你怎麼能改變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

回答

1

我更喜歡在這種情況下使用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秒左右)按鈕將開始尋找紅色。