日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++调用UpdateLayeredWindow实现半透明窗体【转】

發布時間:2024/4/11 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++调用UpdateLayeredWindow实现半透明窗体【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

半年沒碰MFC了 , 感覺是那么的陌生 , 忘記了絕大部分函數了....?你說我現在都有點學這忘哪,以后能跟的上技術的發展嘛?

????? 注意:由于代碼有點長,直接放在這里顯得冗長,所以,如果需要源碼的朋友請發郵件或留言,代碼只是互相學習之用,由于本人水平有限,如果您覺得不好,望理解,且不要有攻擊性的言行,謝謝!)

??????? 首先看看我做的效果,有點像Vista的效果,而且解決了控件不能顯示的問題,注意上層是一個子窗體,用來承載窗體控件:

? ? ?


???????? 最近看了桌面天氣秀這款小軟件,其界面精致漂亮,而且可以透明顯示,還有個特別有趣的功能就是能讓窗體固定在桌面上并且鼠標可以“穿透”而窗體不受任何影響,這就是帶著些許神秘的“有影無形”的功能。

???????? 事實上要實現這種“有影無形”的功能,很簡單,我相信聰明的您一定很快會想到怎么做。幾句代碼就可以搞定,給你點提示,只有在2000以上的Win操作系統才支持(當然如果你有足夠的時間可以完全可以在98上實現)。那么今天我們主要討論一下窗體的半透明顯示,其實,如果僅僅要實現窗體的半透明顯示,很簡單,UpdateLayeredWindow調用就可以了,網上去搜一下幾乎都是貼的這個函數怎么怎么實現窗體的半透明,在往下就沒了,比如此函數有個缺陷,就是經過此函數處理過的窗體,其上面的控件都透明了。諸如此類的問題至少到現在我在網上沒找到一個讓人感覺滿意的解決方案。

?????? 記得在一個所謂專業的C#網站上看到一篇題為“XP下透明窗體的完美實現”,當時看了還真高興一陣子,可是把代碼下下來一看,又是被忽悠了,里面就調用了UpdateLayeredWindow函數實現透明然后加個旋轉顯示,這樣子就算完美了,我暈!這個函數查查資料誰不會。看來還是自己動手,不知道有心的朋友注意到沒有,在桌面天氣秀里,打開設置,然后快速拖動,會看到上面的窗體明顯脫離,這就是多層窗口留下的尾巴。下面的透明窗體是背景,上面的窗體承載控件。在拖動下層窗體的時候讓上層窗體跟著一起動。對于小軟件來說,效果還可以。事實上,今天我實現的也和這個思路差不多,不過我這個上下兩層窗體是父子關系,它們各施其職,但是又沒有拖動時留下的尾巴(窗口移動的處理),我把這些功能都封裝在一起了,只需要簡單地把你要在透明窗體上顯示的窗體傳過去以及透明處理的圖片就OK了。限于篇幅下面給繪制函數以及調用示例:


bool?DrawAlpha(Image*?pBgImg,?HWND?hWnd)
{
???if?(!::IsWindow(hWnd))?return?false;

???CWndDecorate?wndDecor(hWnd);
???//wndDecor.SetAlpha((255 * 20) / 100);
???//wndDecor.ShowOnDesk();

???RECT?rcWnd;
???::GetWindowRect(hWnd,?&rcWnd);
???int?nWid?=?rcWnd.right?-?rcWnd.left;
???int?nHei?=?rcWnd.bottom?-?rcWnd.top;

???HDC?hdcTemp?=?::GetWindowDC(hWnd);
???HDC?hdcMemory?=?::CreateCompatibleDC(hdcTemp);
???HBITMAP?hBitMap?=?CreateCompatibleBitmap(hdcTemp,?nWid,?nHei);
???SelectObject(hdcMemory,?hBitMap);

???HDC?hdcScreen?=?::GetWindowDC(hWnd);
???POINT?ptWinPos?=?{rcWnd.left,?rcWnd.top};

???Graphics?graph(hdcMemory);
???Point?points[]?=?{Point(0,?0),Point(nWid,?0),Point(0,?nHei)};
???graph.DrawImage(pBgImg,?points,3);

???SIZE?sizeWindow={nWid,?nHei};
???POINT?ptSrc={0,0};

???DWORD?dwExStyle?=?::GetWindowLong(hWnd,?GWL_EXSTYLE);
???if?((dwExStyle?&?0x80000)?!=?0x80000)
???{
????::SetWindowLong(hWnd,?GWL_EXSTYLE,?dwExStyle?^?0x80000);
???}

???CString?strTitle;
???m_alWnd.GetWindowText(strTitle);

???Gdiplus::Font???font(L"宋體",12,FontStyleBold,UnitPixel);
???StringFormat???strFormat;
???SolidBrush???brush(Color(0xff,0,0,0));

???graph.DrawString(strTitle,?-1,?&font,?PointF(32,30),&strFormat,?&brush);

???::UpdateLayeredWindow(hWnd,?hdcScreen,?&ptWinPos,?&sizeWindow,?hdcMemory,?&ptSrc,?0,?&m_alBlend,?ULW_ALPHA);

???graph.ReleaseHDC(hdcMemory);
???::ReleaseDC(hWnd,hdcScreen);
???hdcScreen?=?NULL;
???::ReleaseDC(hWnd,hdcTemp);
???hdcTemp?=?NULL;
???DeleteObject(hBitMap);
???DeleteDC(hdcMemory);
???hdcMemory?=?NULL;

???return?true;
}

調用示例:

CWndAlpha<CMainDlg>?wndAl;

wndAl.InitAlpha(L"C:\\bg.png",?NULL,?rcMargin,?true);
m_pMainWnd?=?wndAl.GetMainWnd();
wndAl.DoModal();

很簡單吧,就這么幾行代碼就可以實現背景透明而且又可以隨意編輯你自己的子控件了。下面是我生成的示例圖,大家欣賞一下了,歡迎留言討論,如果有需要的請留言!謝謝!

原文轉載自:http://rohna.w.blog.163.com/blog/static/145741652009023534832/

總結

以上是生活随笔為你收集整理的VC++调用UpdateLayeredWindow实现半透明窗体【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。