因爲這個透明只是爲了滿足我自己的需求,並不是對廣泛意義上的界面優化進行的。所以,先說一下這個透明化需求的具體情況,在一個加載圖片做背景的對話框上,附加上非模態的子對話框,但是要保持背景的一致性。
按照正常的dlg.Create()生成的對話框的背景是那種灰灰的背景,在有圖的背景上都是很醜的一塊。
仔細的思考了一下,只要新附加的對話框沒有自己的背景就完全可以實現。而這種情況最簡單的情況就是不繪畫背景。添加WM_ERASEBKGND()消息,並修改代碼如下
BOOL CXXXDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
return TRUE;
//return CDialogEx::OnEraseBkgnd(pDC);
}
顯示出來的效果就是下圖,完全無區分。
對話框的透明就完成了,但是在對話框中加入一些控件之後,又出現了麻子一樣的小塊塊。
這個時候就要進行控件的背景透明化了。實際上,在控件屬性裏面中有一欄說明是透明背景的屬性。
但是,想通過這個實現控件透明背景是不能的。我理解的是代碼“pDC->SetBkMode(TRANSPARENT)”的文字描述。
在我理解看來,控件實際上和對話框有很多的類似點,至少在背景透明上,很是相像。所以,第一考慮就是給控件的背景刷傳遞空值。想到的第一個就是WM_CTLCOLOR消息。
HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
//< TODO: 在此更改 DC 的任何特性
//if(nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);//<設置背景透明
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
//< TODO: 如果默認的不是所需畫筆,則返回另一個畫筆
return hbr;
}
這種方法只能完成對static的背景透明,實際上按鈕控件沒透明。
對按鈕的透明就沒辦法偷懶了(這種給背景刷置空的辦法,我認爲就是在偷懶,只是效果有點出人意料),要給它畫個背景。就是把當前對話框的圖片摳出來。