Windows半透明窗口开发技巧
Windows半透明窗口開發(fā)技巧
www.visual-gear.com?原創(chuàng)技術(shù)文章
在windows平臺上從窗口繪圖有兩種方法:
第一種響應(yīng)窗口的WM_PAINT消息,使用窗口DC進(jìn)行繪制
第二種是將窗口樣式設(shè)置為層窗口,即 WS_EX_LAYERED
設(shè)置為該樣式之后窗口將不會產(chǎn)生任何的WM_PAINT消息,我們通過GetDC等方法在DC上繪圖也不會有任何的效果。
我們只能通過UpdateLayeredWindow這個API將我們需要顯示的內(nèi)容提交給窗口。
窗口的內(nèi)容顯示將全部交給用戶進(jìn)行處理,任何的窗口內(nèi)容改變我們都需要重建位圖,并調(diào)用該API進(jìn)行顯示內(nèi)容提交。
默認(rèn)的非層窗口是無法讓窗口半透明顯示,因?yàn)槔L制到最后都會和黑色進(jìn)行混合填充到DC上。
而層窗口則允許我們可以使用半透明位圖顯示窗口內(nèi)容,這樣我們就可以實(shí)現(xiàn)半透明窗口效果。
具體代碼如下:
首先設(shè)置窗口樣式為層窗口
LONG_PTR dwExStyle = GetWindowLongPtr((HWND)_handle, GWL_EXSTYLE);if ((dwExStyle & WS_EX_LAYERED) != WS_EX_LAYERED){SetWindowLongPtr((HWND)_handle, GWL_EXSTYLE, dwExStyle | WS_EX_LAYERED);}?
首先建立一個內(nèi)存位圖和內(nèi)存DC
HBITMAP CreateGDIBitmap(int nWid, int nHei, void ** ppBits){BITMAPINFO bmi;memset(&bmi, 0, sizeof(bmi));bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = nWid;bmi.bmiHeader.biHeight = -nHei;bmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 32;bmi.bmiHeader.biCompression = BI_RGB;bmi.bmiHeader.biSizeImage = 0;HDC hdc = GetDC(NULL);LPVOID pBits = NULL;HBITMAP hBmp = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, ppBits, 0, 0);ReleaseDC(NULL, hdc);return hBmp;} ..._hBmp = CreateGDIBitmap(_w, _h, &_pBmpBits);_hMemDc = CreateCompatibleDC(hdc);SelectObject(_hMemDc, _hBmp);?
此時我們可以在這個內(nèi)容DC上做任何我們想要的繪制,由于這張位圖是一個32位位圖所以帶有透明通道。
當(dāng)我們完成繪制之后我們通過UpdateLayeredWindow就可以提交顯示內(nèi)容到窗口上了。
?
需要注意的是:
相關(guān)示例代碼可登陸www.visual-gear.com上下載開源工程了解。
轉(zhuǎn)載于:https://www.cnblogs.com/Visual-Gear/p/9721853.html
總結(jié)
以上是生活随笔為你收集整理的Windows半透明窗口开发技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 柴达木之恋剧情介绍
- 下一篇: Django 【认证系统】auth