出自http://my.oschina.net/ypimgt/blog/60951
優點:
1.Dialog 窗體完全透明。
2. 窗體上的控件不透明、 DC 繪制的圖形不透明。
3. 拖動窗體上用 DC 繪制的圖形可以移動窗體。
缺點:
1. 窗體設置透明使用是掩碼顏色,所以在窗體上用 DC 繪圖的過程當中如果采用了和透明掩碼顏色相同的顏色將不會顯示出來。
2. 如果將 Border 屬性設置成了 NONE ,那么想通過響應 WM_NCHITEST 消息來實現窗體拖動就無法完成了。只能通過在窗體中增加 DC 繪圖的方式來完成。
3.DC繪圖時雖然支持半透明繪圖,但是透明繪圖區域不透明。
1.在OnInitDialog()或OnPaint()中加入:
|
1
2
3
4
5
|
<b>
COLORREF
maskColor = RGB(255,255,255);
//掩碼顏色
SetWindowLong(
this
->GetSafeHwnd(),
GWL_EXSTYLE,
GetWindowLong(
this
->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000);
//設定窗體使用擴展模式
SetLayeredWindowAttributes(maskColor,255,1); </b>
|
2.在重載的消息WM_CTLCOLOR中加入:(其中包括Static背景透明方法)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<b>
HBRUSH
CTimeRemainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd,
UINT
nCtlColor)
{
HBRUSH
hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
//
if
(nCtlColor == CTLCOLOR_DLG)
//此處設置為窗體透明,CTLCOLOR_DLG表示對話框
{
CBrush *brush;
brush =
new
CBrush(RGB(255,255,255));
return
(
HBRUSH
)(brush->m_hObject);
}
switch
(pWnd->GetDlgCtrlID())
//此處為設置Static Text文本透明。
{
case
IDC_LEFTTOP:
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(125,0,0));
return
(
HBRUSH
)GetStockObject(HOLLOW_BRUSH);
default
:
break
;
}
// TODO: 如果默認的不是所需畫筆,則返回另一個畫筆
return
hbr;
}</b>
|
