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); }
子窗口的透明和主窗口完全不同,, 主窗口是通過layeredwindow實現(xiàn)的,, 而子窗口則必須自己實現(xiàn), 尤其是半透明,, 必須自己對獲取的透明背景圖進(jìn)行操作,。 要實現(xiàn)子窗口的透明需要做到下面幾步: 1. windows的ExStyle中需要包含WS_EX_TRANSPARENT屬性 2. windows的Style中要去掉WS_CLIPSIBLING屬性 3. 對繼承自windows標(biāo)準(zhǔn)控件的子窗口( 比如edit, scrollbar等等 ), 需要截獲WM_CTLCOLORxxx消息并返回一個style為BS_HOLLOW的brush的handle(即一個透明畫刷的handle) 4. 需要截獲WM_ERASEBKGND消息并不要清除背景(如果做到了3, 則這一步可以省略) 5. 最關(guān)鍵的一點(也是很多人沒有想到或不知道的), 必須將parent窗口style中的WS_CLIPCHILDREN標(biāo)志去掉, 否則PARENT窗口重畫時不會重畫被子窗口覆蓋的部分. 6. 做到以上各步后, 在子窗口收到WM_PAINT消息時就可以獲得完整的背景圖了, 接下去對這背景進(jìn)行處理就可以實現(xiàn)半透明效果. 另外一點, 最好同時截獲parent窗的WM_PAINT消息, 在parent窗重畫前調(diào)用InvalidateRect讓本子窗口顯示實效, 這樣子窗口才能同樣也收到一個WM_PAINT消息( 這樣做是為了保險, 因為我不是很確定主窗口重畫系統(tǒng)是否會自動給具有WS_EX_TRANSPARENT屬性的子窗口同樣發(fā)WM_PAINT ). (###)
|
|