MFC對話框的透明化

因爲這個透明只是爲了滿足我自己的需求,並不是對廣泛意義上的界面優化進行的。所以,先說一下這個透明化需求的具體情況,在一個加載圖片做背景的對話框上,附加上非模態的子對話框,但是要保持背景的一致性。

按照正常的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的背景透明,實際上按鈕控件沒透明。

對按鈕的透明就沒辦法偷懶了(這種給背景刷置空的辦法,我認爲就是在偷懶,只是效果有點出人意料),要給它畫個背景。就是把當前對話框的圖片摳出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章