本文分析了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...