VC透明窗體以及平滑關閉視窗

2021-06-11 09:12:49 字數 3284 閱讀 2693

vc透明窗體以及平滑關閉視窗

**:vc實現透明窗體

setwindowlong(this->getsafehwnd(),gwl_exstyle,

getwindowlong(this->getsafehwnd(),gwl_exstyle)^0x80000);

hinstance hinst = loadlibrary("user32.dll");

if(hinst)

bool setlayeredwindowattributes(

hwnd hwnd,   // 應用目標視窗的控制代碼

colorref crkey, // 掩碼的顏色,可以用rgb(r,g,b)來指定

byte balpha,   // 掩碼顏色部分的alpha值,0是全透明,255是完全不透明

dword dwflags   // 透明方式

);  

dwflags的取值

lwa_colorkey(0x0001)       //使crkye為透明值

lwa_alpha(0x0002)     /使balpha為視窗的不透明值

要說名的是這個函式只在windows2000及以上版本才支援。msdn對要求的描述如下

windows nt/2000/xp: included in windows 2000 and later.

windows 95/98/me: unsupported.

header: declared in winuser.h; include windows.h.

library: use user32.lib.

還有就是這個函式對於有標題框的窗體支援不好,就是它裁切的只是客戶區域,好在我們要製作透明窗體的場合一般用不到標題框下面就說名例程的製作過程。(我旨在說明這種透明窗體的思路及函式的用法,所以**非常簡單,並且沒有必要的錯誤驗證機制,希望大家諒解)

建立一張用於在窗體上繪製的背景,把要裁切的部分用一種顏色標記出來,我們叫它maskcolor,我的如下:

我的maskcolor = 0xff00,也就是 rgb(0,255,0).

建立乙個基於對話方塊的工程,修改對話方塊資源的屬性,主要修改兩個地方。一是指定沒有titlebar,二是指定borderstyle為none.這樣才能保證出來的窗體符合你的要求

把加入資源,付id = idb_background

下面就開始寫**了,呵呵,看下面的**這麼長。是不是頭有點大呀,別急,這些多半都是工程嚮導自動生成的,我加的都已經註解上了,並用黃色表示沒有幾行的。要不然我怎麼敢向各位吹噓這個實現方法簡單呢。

a.首先我們給窗體新增兩個成員變數:

cbitmap * m_oldbitmap; //指向記憶體dc原來的 bitmap

cdc m_dc;               //用於存放背景的記憶體dc

b.在窗體的oninitdialog()函式中做一番初始化:

bool ctranswindowdlg::oninitdialog()

就像注釋的那樣,我們首先把load進來,然後把m_dc建立乙個與視窗dc相容的dc,並把剛才load進來的繫結到該記憶體dc上,並用m_oldbitmap 記錄下原有bitmap,使用者最後釋放。

c.向onpaint中新增**,用於把背景繪製到視窗上:

void ctranswindowdlg::onpaint()

else }

d.到這裡我們要的功能就已經能夠實現了,但是好的程式設計師絕對不應該忘記釋放資源,你也一樣,一定沒有忘記在程式結束時釋放資源,呵呵,我們可以寫到析構函式中,我們也可放到onclose()函式中,都一樣,我採用了後一種:新增函式並新增釋放資源的**

void ctranswindowdlg::onclose()

e.現在好了,執行一下吧,真爽,就這麼幾行**搞定了乙個漂亮的視窗。是不是很有成就感?呵呵。又看了幾次真的美滋滋的。不好發現問題了,怎麼程式執行的時候開始有一下閃爍呢?哦,是清空背景的時候畫了一下,沒關係,讓我們乾掉它。新增wm_erasebkgnd事件的響應函式,把原來的注釋掉直接返回true,再執行一下看看吧?怎麼樣,滿意了嗎?

bool ctranswindowdlg::onerasebkgnd(cdc* pdc)

f.好了,我已經非常滿意了,要休息一下了,但我怎麼關閉這個視窗呢?糟糕,非要我用alt+f4不成?算了再多用一下功,寫個雙擊事件好了:

void ctranswindowdlg::onlbuttondblclk(uint nflags, cpoint point)

vc實現如何平滑地關閉視窗

技術準備:

很簡單,就是使用 windows api函式

setlayeredwindowattributes(hwnd, colorref, byte,dword)

setlayeredwindowattributes函式在user32.dll中,你需要裝載該dll並使用它。

第一步:

你必須改變視窗的樣式,將視窗變成具有圖層樣式,使用windows api函式setwindowlong。

在對話方塊窗體oninitdialog()函式或者在文件/視型別的窗體oncreate()函式如下使用:

setwindowlong(m_hwnd,

gwl_extyle,

::getwindowlong(m_hwnd, gwl_exstyle) | ws_ex_layered);

然後呼叫函式:

settransparent( m_hwnd, 0, 255 , lwa_alpha );

讓balpha的值為255,該函式如下:

// this function sets the transparency layered window

// by calling setlayeredwindowattributes api function.

bool settransparent(hwnd hwnd, colorref crkey,

byte balpha, dword dwflags)

// if( m_huserdll )

return bret;

} // end of settransparent function

第二步:

在窗體onclose()中呼叫closesmoothly()函式,該函式如下:

void closesmoothly()

vc實現如何平滑地關閉視窗

關鍵字 圖層,視窗 譯者 阿鬼 mornlee 21cn.com 環境 vc6,win2000,winxp 技術準備 很簡單,就是使用 windows api函式 setlayeredwindowattributes hwnd,colorref,byte,dword setlayeredwindow...

VC 製作透明窗體

在2000下 定義常量 define ws ex layered 0x00080000 define lwa alpha 0x00000002 宣告函式 extern c 標頭檔案 產生透明視窗 不要忘了給視窗的exstyle加入ws ex layered屬性 setwindowlong getsa...

VC如何實現透明視窗

vc如何實現透明視窗 選擇自 leisureful 的 blog 在對話方塊初始化函式中加入 define lwa colorkey 0x00000001 define ws ex layered 0x00080000 typedef bool winapi lpfnsetlayeredwindow...