超酷透明視窗

2021-09-30 10:36:55 字數 4128 閱讀 8889

本文分析了windows環境下使用mfc實現透明視窗,以及浮動視窗的方法

win2000以上作業系統,vc++6.0。

如何實現透明視窗

setlayeredwindowattributes的函式原型如下:

bool setlayeredwindowattributes(

hwnd hwnd, // handle to the layered window

colorref crkey, // specifies the color key

byte balpha, // value for the blend function

dword dwflags // action

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

windows 95/98/me: unsupported.

(注意了,在win9x裡沒法使用的)

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

library: use user32.lib.

一些常量: 

ws_ex_layered = 0x80000;

lwa_alpha = 0x2;

lwa_colorkey=0x1;

其中dwflags有lwa_alpha和

lwa_colorkey

lwa_alpha被設定的話,通過balpha決定透明度

.lwa_colorkey被設定的話,則指定被透明掉的顏色為crkey,其他顏色則正常顯示

.要使使窗體擁有透明效果,首先要有ws_ex_layered擴充套件屬性(舊的sdk沒有定義這個屬性,所以可以直接指定為0x80000).

例子**

:bool

cfloatdlgdlg::oninitdialog()

} // set the icon for this dialog.  the framework does this automatically

seticon(m_hicon, true);                        // set big icon

seticon(m_hicon, false);            // set small icon

// todo: add extra initialization here

以下實現窗體的透明

/////

加入ws_ex_layered

擴充套件屬性

setwindowlong(this->getsafehwnd(),gwl_exstyle,

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

hinstance

hinst = loadlibrary("user32.dll");

if(hinst)

//modifystyle( ws_caption, ws_minimizebox, swp_drawframe );//

設定圖示

m_bmpbackground.loadbitmap(idb_float);        

return

true;  // return true  unless you set the focus to a control}

如何實現浮動視窗的拖動

一般的窗體,只有滑鼠位於非客戶區是,才可拖動。因此,只要我們將客戶區「變」為「非客戶區」不就可以拖動了了嗎!真是乙個讓人驚奇的發現!:),可是問題來了,非客戶區無法載入快捷選單,我們如何解決這一問題呢,那我們想想什麼動作觸發快捷選單呢?對了,wm_rbuttondown,wm_rbuttonup,那拖動呢?哈哈,是wm_lbuttondown,ok,那就有方法解決了,那就是在滑鼠左鍵按下時才將客戶區「變」為「非客戶區」。過載

onlbuttondown(uint

nflags,cpoint

point) ,onlbuttonup(uint

nflags, cpoint

point),onmousemove(uint

nflags, cpoint

point),onnchittest(cpoint

point):

void

cfloatdlgdlg::onlbuttondown(uint

nflags, cpoint

point)

void

cfloatdlgdlg::onlbuttonup(uint

nflags, cpoint

point)

void

cfloatdlgdlg::onmousemove(uint

nflags, cpoint

point)

cdialog::onmousemove(nflags, point);

uint

cfloatdlgdlg::onnchittest(cpoint

point)

return

nhitcode;

}else

return

cdialog::onnchittest(point);

右鍵選單的實現

建立乙個menu資源,過載

oncontextmenu(cwnd* pwnd, cpoint

point):

void

cfloatdlgdlg::oncontextmenu(cwnd* pwnd, cpoint

point)

cmenu

menu;

verify(menu.loadmenu(idr_float_menu));

cmenu* ppopup = menu.getsubmenu(0);

assert(ppopup != null);

cwnd* pwndpopupowner = this;

while (pwndpopupowner->getstyle() & ws_child)

pwndpopupowner = pwndpopupowner->getparent();

ppopup->trackpopupmenu(tpm_leftalign | tpm_rightbutton, point.x, point.y,

pwndpopupowner);

其他

為了美觀,我將次dialog的標題欄去掉,並且以乙個作為它的背景,這樣就實現了flashget的浮動視窗的效果。

背景:bool

cfloatdlgdlg::oninitdialog()

{cdialog::oninitdialog();

……….//省略

//背景的載入

modifystyle( ws_caption, ws_minimizebox, swp_drawframe );//

設定圖示

m_bmpbackground.loadbitmap(idb_float);        

return

true;  // return true  unless you set the focus to a control

過載onpaint()

void

cfloatdlgdlg::onpaint()

{cpaintdc

dc(this);

crect

rect;

getclientrect(&rect);

cdcdcmem;

dcmem.createcompatibledc(&dc);

bitmap

bitmap;

m_bmpbackground.getbitmap(&bitmap);

cbitmap *pbmpold=dcmem.selectobject(&m_bmpbackground);

dc.stretchblt(0,0,rect.width(),rect.height(),&dcmem,0,0,bitmap.bmwidth,bitmap.bmheight,srccopy);

以上是偶的一些大致介紹,具體請看原始碼,偶覺得還可以,各位大蝦有什麼意見提出來,大家共同**!

使視窗透明

define lwa colorkey 0x00000001 use color as the transparency color.define ws ex layered 0x00080000 define lwa alpha 2 use balpha to determine the opac...

directx 透明視窗

第一步 新增類class cuimagedc hbitmap getbmphandle void dword getbits void protected hbitmap m hbmp hdc m hdc char m pbits cuimagedc cuimagedc cuimagedc cuim...

透明框架視窗

如何讓整個視窗具有透明效果呢?使用如下的類 class clayeredimpl layered window template class atl no vtable clayeredimpl virtual clayeredimpl long setlayeredstyle bool setla...