2009年2月6日 星期五

[C++] 如何讓每一個 Dialog 都有不同的背景顏色

ChangeDialogColor

(無標題 紅色 Dialog 視窗加上 60% 半透明效果)

其實有很多辦法可以達到更換視窗顏色的效果, 例如: 你可以實做 OnPaint 讓視窗畫出相同大小的顏色方框或者是實做 WM_EraseBKGnd 的 message handler, 當系統要清畫面時, 畫出你想要的背景.

今天想介紹的方法是 WM_CTLCOLOR , 在 MFC 我們用的是 OnCtlColor.  你可以使用 Resource 的 Properties 面版自動產生 code, 下面是面版圖示.

ChangeDialogColor_prop

自己手動完成 message handle  流程 對初學者而言, 比較能瞭解自己的程式, 對未來也比較有信心. 其實我不喜歡我的 code 中, 有我不懂的部分. 然而對高手而言, 直接使用精靈幫你產生需要的程式框架, 則比較方便.

 

詳細的作法如下:

// Step 1: 加入 訊息處理
    BEGIN_MESSAGE_MAP(CMoveDlg, CDialog)
        ...
        ON_WM_CTLCOLOR( )
        ...
    END_MESSAGE_MAP()

 

// Step 2: 加入函式定義
    afx_msg HBRUSH CMoveDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);

 

// Step 3: 改變 Dialog 背景顏色訊息處理函式實做

afx_msg HBRUSH CMoveDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor){

       HBRUSH hbr;

       // 這裡放你要的顏色 COLORREF m_curColor = RGB(255,0,0);

       hbr=CreateSolidBrush(m_curColor); 
       return hbr;

}

 

完成: 接下來, 隨便找一個按鈕 換一下 m_curColor 看看吧.

注意:

動態更新顏色後, 要呼叫 Invalidate();  否則會因為沒有呼叫 OnPaint, 而無法更新畫面.
ex:

this->m_curColor=RGB(255,0,255); // 動態改變顏色
this->Invalidate(); // 標明這個視窗要重畫
this->UpdateWindow(); // 立即畫出

 

至於怎麼讓 MFC 視窗有透明度?

很簡單下面是範例

// 設定 視窗為 WS_EX_LAYERED 屬性
    ::SetWindowLong(this->m_hWnd, GWL_EXSTYLE,GetWindowLong(this->m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);

    // 使得視窗有 60% 透明程度
    ::SetLayeredWindowAttributes(this->m_hWnd, 0, (255 * 60) / 100, LWA_ALPHA);

 

Enjoy.

by Jing.

沒有留言:

張貼留言