vc 實現懸浮窗,迅雷360懸浮球效果

2021-08-15 11:10:52 字數 1795 閱讀 7299

1.setwindowrgn建立圓角懸浮窗dlgfloat

rgn.createroundrectrgn(rect.left, rect.top, rect.width(), rect.height(), 13, 13);

m_rgnwnd.deleteobject();

m_rgnwnd.createrectrgn(0, 0, 0, 0);

m_rgnwnd.copyrgn(&rgn);

setwindowrgn((hrgn)rgn, true);

createroundrectrgn雖然精度低,導致邊沿模糊,但是配合framergn(&m_rgnwnd, &brush, 1, 1)還是能去掉毛邊的,效果還看得過去。

2.setlayeredwindowattributes配合png

此方法是把視窗的背景色透掉,然後把透明的圓形png放到視窗上,這種方法存在兩個問題:

(1)左鍵按下的響應區域仍是矩形的,需要用createellipticrgn和setwindowrgn來限定左鍵按下的響應區域;

(2)png的邊沿和視窗的背景色交疊後會發生細微變化,這樣就導致邊沿部分的背景不能完全透掉,從而產生了鋸齒;

詳見例子中cusorpng的setlayeredwindowattributes方式;

3.updatelayeredwindow配合png

這種方法可以完美的將透明的png顯示cwnd上,而且響應區域剛好是png的可見部分,沒有出現2中的響應區域和鋸齒問題。但是繪製的文字需要用alphablend來疊加上去,否則文字位置變成全透了,鏤空了,顯示為後面背景顏色。

//繪製背景

m_pimgdef->draw(hmemdc, rtclient.left, rtclient.top, rtclient.width(), rtclient.height(), 0, 0, m_pimgdef->getwidth(),  m_pimgdef->getheight());

//顯示文字

fixedlayereddrawtext(hmemdc, strspeed, strspeed.getlength(), rttext, &ft, dt_center| dt_vcenter| dt_noprefix | dt_singleline | dt_end_ellipsis);

4.updatelayeredwindow透明窗體和gdiplus繪製

該方法可以實現png、jpg、bmp等的繪製,若用透明的png就能很好的實現異形窗體和懸浮球的繪製。

//繪製背景

dcdraw.setsize(c_psplashwnd->m_szbmp.cx, c_psplashwnd->m_szbmp.cy, hdc);

dcdraw.copyfrom(dcsrc);

//繪製文字

gdiplus::font font(dcdraw, c_psplashwnd->m_fntshowtext);

rectf rect(c_psplashwnd->m_rctext.left, c_psplashwnd->m_rctext.top, c_psplashwnd->m_rctext.width(), c_psplashwnd->m_rctext.height());

stringformat sf;

pgraphics->drawstring(sztext, c_psplashwnd->m_strtext.getlength(), &font, rect, &sf, &brush);

方法3的懸浮球效果:

全家福:

MFC模擬360懸浮窗加速球視窗

實現類似360懸浮視窗這樣的效果,當視窗在螢幕邊緣時,滑鼠移開,就自動向邊緣隱藏,滑鼠放上去,就又平滑顯示出來。正常狀態 邊緣自動隱藏 mfc實現不規則視窗 然後需要給沒有標題欄的視窗增加拖拽移動的功能,這個就是自己手動傳送乙個訊息,使windows認為滑鼠在標題條上 對於視窗的移動顯示隱藏,使用了...

Andorid 任意介面懸浮窗,實現懸浮窗如此簡單

1.支援拖動,提供自動貼邊等動畫 2.內部自動進行許可權申請操作 3.可自由指定要顯示懸浮窗的介面 4.應用退到後台時,懸浮窗會自動隱藏 5.位置不可變的懸浮窗無需許可權申請 6.位置及寬高可設定百分比值,輕鬆適配各解析度 7.鏈式呼叫,簡潔清爽 第 1 步 在工程的 build.gradle 中新...

vue 側邊懸浮 vue實現移動端懸浮窗效果

本文講述,在使用vue的移動端實現類似於iphone的懸浮窗的效果。相關知識點 touchstart當在螢幕上按下手指時觸發 touchmove 當在螢幕上移動手指時觸發 touchend 當在螢幕上抬起手指時觸發 mousedown mousemove mouseup對應的是pc端的事件 touc...