GDI 實現不規則窗體

2021-08-01 14:03:12 字數 2535 閱讀 5097

先來看一下實現的效果,下圖中那個娃娃就是我們要實現的不規則窗體啦~ 

使用gdi+還需要進行初始化:

//在應用初始化時,啟動gdi+  

//在程式退出時,關閉gdi+

png是實現不規則窗體的關鍵,因為它本身就是帶透明效果的,把這種格式的作為窗體本身就是不規則的。首先我們需要載入這張,在這裡我沒有將其作為資源新增到專案中,這樣對於更改不是很方便,所以用的是動態載入,將直接載入到記憶體中。 

(1) 在c***dlg.h中新增成員變數:

gdiplus::image *m_bkgimg;//不規則背景

blendfunction m_blend; //指定源和目標點陣圖的透明混合引數

(2) 在c***dlg.cpp中新增如下**:

bool c***dlg::oninitdialog()

......

}

首先使用creatcompatibledc()建立了乙個和當前螢幕的dc相容的記憶體dc(dc就是裝置上下文的意思,裝置上下文就是當前的這個窗體的一些屬性,譬如說他使用的畫刷,畫筆等等),在繪製點陣圖的時候,你必須要在記憶體中建立這樣的乙個和當前裝置的環境相容的dc,這樣你才能把點陣圖載入到這塊記憶體裡,然後再將點陣圖從記憶體複製到螢幕dc上,位圖才能顯示出來。 

用雙緩衝的話還要再定義乙個位圖物件,然後用createcompatiblebitmap建立乙個與螢幕顯示相容的點陣圖,再用selectobject將位圖選入到記憶體顯示裝置中。 

在繪製的時候有乙個重要的函式叫做updatelayeredwindow,可以根據影象的透明度進行顯示,函式原型是: 

(官網定義)

bool winapi updatelayeredwindow(

_in_ hwnd hwnd,//視窗控制代碼

_in_opt_ hdc hdcdst,//螢幕上下文dc

_in_opt_ point *pptdst,//視窗相對於螢幕的位置的point結構的指標

_in_opt_ size *psize,//顯示視窗大小

_in_opt_ hdc hdcsrc,//視窗上下文dc

_in_opt_ point *pptsrc,//視窗繪圖表面在裝置上下文位置的point結構的指標

_in_ colorref crkey,

_in_opt_ blendfunction *pblend,//透明混合引數

_in_ dword dwflags

);

記憶體dc是很重要的乙個概念,假如你要對螢幕進行比較多的gdi函式操作,如果每一步操作都直接對螢幕dc進行操作,那出現的大多數可能性都是螢幕的閃爍。乙個很好的解決方法就是使用記憶體dc,將這些操作全部先在記憶體dc上操作,然後依次性在螢幕上進行操作。

void c***dlg::onpaint()

; rect rct;

getwindowrect(&rct);

point ptwinpos = ;

graph.drawimage(m_bkgimg, points, 3);

size sizewindow = ;

point ptsrc = ;

dword dwexstyle = getwindowlong(m_hwnd, gwl_exstyle);

if ((dwexstyle & 0x80000) != 0x80000)

setwindowlong(m_hwnd, gwl_exstyle, dwexstyle ^ 0x80000);

bool bret = false;

bret = ::updatelayeredwindow(m_hwnd, hrgndc, &ptwinpos,

&sizewindow, hrgndc, &ptsrc, 0, &m_blend, 2);

::selectobject(hrgndc, holdrgnbmp);

::deleteobject(hrgnbmp);

::deletedc(hrgndc);}}

再來一張圖,換圖就是如此方便~~ 

參考: 

【vc++玩轉炫酷懸浮窗3—gdi+完美實現不規則窗體】

【createcompatibledc】

MFC介面程式設計1 GDI 實現不規則窗體

先來看一下實現的效果,下圖中那個娃娃就是我們要實現的不規則窗體啦 使用gdi 還需要進行初始化 在應用初始化時,啟動gdi 在程式退出時,關閉gdi png是實現不規則窗體的關鍵,因為它本身就是帶透明效果的,把這種格式的作為窗體本身就是不規則的。首先我們需要載入這張,在這裡我沒有將其作為資源新增到專...

QT實現不規則窗體

看到網上有很多不規則窗體的實現,效果很酷.於是使用qt也實現了乙個,qt的不規則窗體實現非常簡單,只需要設定乙個mask 遮掩 這個的格式可以使用png或bmp格式,我使用了png格式,預設窗體是矩形的,使用png影象,將需要隔離在窗體之外的區域的畫素設定為白色或透明色,其他顏色的區域對應顯示出來的...

用C 實現不規則窗體

如何實現不規則窗體?transparencykey 獲取或設定將表示窗體透明區域的顏色。formborderstyle 獲取或設定窗體的邊框樣式。backgroundimage 獲取或設定在控制項中顯示的背景影象。首先,使用影象處理軟體製作出所要實現的窗體樣式,最後實現的窗體樣式就和繪製的一樣。然後...