主 題: 怎么實(shí)現(xiàn)子窗口的背景透明?
作 者: Bill.Gates
回復(fù)次數(shù): 3
發(fā)表時(shí)間: 2008-3-28 13:56:42
正文內(nèi)容:
我嘗試用父窗口的DC來填充 對應(yīng)的位置,通常是好的,但是在子窗口重畫的時(shí)候就 模糊了。。。有解決方法嗎?
回復(fù)人: 1982c0ffee2008-3-28 14:05:36
無主題
SetWindowLong(GWL_EXSTYLE, GetWindowLong(GWL_EXSTYLE)^WS_EX_LAYERED);
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL; //取得SetLayeredWindowAttributes函數(shù)指針
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(m_hWnd,RGB(255,0,255),0,1);
FreeLibrary(hInst);
}
回復(fù)人: 1982c0ffee2008-3-28 14:06:21
把這段代碼貼到你子窗口初始化函數(shù)里去
回復(fù)人: 1982c0ffee (得分:10)2008-3-28 14:07:49
無主題
子窗口的透明和主窗口完全不同, 主窗口是通過layeredwindow實(shí)現(xiàn)的, 而子窗口則必須自己實(shí)現(xiàn), 尤其是半透明, 必須自己對獲取的透明背景圖進(jìn)行操作。 要實(shí)現(xiàn)子窗口的透明需要做到下面幾步:
1. windows的ExStyle中需要包含WS_EX_TRANSPARENT屬性
2. windows的Style中要去掉WS_CLIPSIBLING屬性
3. 對繼承自windows標(biāo)準(zhǔn)控件的子窗口( 比如edit, scrollbar等等 ), 需要截獲WM_CTLCOLORxxx消息并返回一個(gè)style為BS_HOLLOW的brush的handle(即一個(gè)透明畫刷的handle)
4. 需要截獲WM_ERASEBKGND消息并不要清除背景(如果做到了3, 則這一步可以省略)
5. 最關(guān)鍵的一點(diǎn)(也是很多人沒有想到或不知道的), 必須將parent窗口style中的WS_CLIPCHILDREN標(biāo)志去掉, 否則PARENT窗口重畫時(shí)不會(huì)重畫被子窗口覆蓋的部分.
6. 做到以上各步后, 在子窗口收到WM_PAINT消息時(shí)就可以獲得完整的背景圖了, 接下去對這背景進(jìn)行處理就可以實(shí)現(xiàn)半透明效果.
另外一點(diǎn), 最好同時(shí)截獲parent窗的WM_PAINT消息, 在parent窗重畫前調(diào)用InvalidateRect讓本子窗口顯示實(shí)效, 這樣子窗口才能同樣也收到一個(gè)WM_PAINT消息( 這樣做是為了保險(xiǎn), 因?yàn)槲也皇呛艽_定主窗口重畫系統(tǒng)是否會(huì)自動(dòng)給具有WS_EX_TRANSPARENT屬性的子窗口同樣發(fā)WM_PAINT ).
(###)