(無標題 紅色 Dialog 視窗加上 60% 半透明效果)
其實有很多辦法可以達到更換視窗顏色的效果, 例如: 你可以實做 OnPaint 讓視窗畫出相同大小的顏色方框或者是實做 WM_EraseBKGnd 的 message handler, 當系統要清畫面時, 畫出你想要的背景.
今天想介紹的方法是 WM_CTLCOLOR , 在 MFC 我們用的是 OnCtlColor. 你可以使用 Resource 的 Properties 面版自動產生 code, 下面是面版圖示.
自己手動完成 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.
沒有留言:
張貼留言