Layered Windows視窗的半透明效果

来源:http://www.cnblogs.com/painterQ/archive/2017/04/13/6706547.html
-Advertisement-
Play Games

介紹: Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYER ...


 

介紹:

Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYERED只能用於頂層視窗,win8及之後版本子視窗也可以使用。

使用:

首先要做的就是在CreateWindowEx()時加入 WS_EX_LAYERED風格。之後調用SetLayeredWindowAttributes()。該函數原型如下:

  

BOOL WINAPI SetLayeredWindowAttributes(
  _In_ HWND     hwnd,      //視窗句柄
  _In_ COLORREF crKey,      //設置色彩通道的相對分量 使用RGB巨集
  _In_ BYTE     bAlpha,     //阿爾法值,0-225之間
  _In_ DWORD    dwFlags     //LWA_ALPHA或LWA_COLORKEY,或二者都有
);
/*
*LWA_ALPHA :使用阿爾法值顯示透明效果
LWA_COLORKEY:使用RGB通道過濾顏色
*/

那麼兩種Flag有什麼區別呢,或者說它們分別是什麼效果呢?不多說上圖就明白了。

LWA_COLORKEY有效時參數指定的    LWA_ALPHA 有效時對視窗整體使用半

顏色被視為透明                 透明效果,阿爾法值由參數指定。 

                 

左側是LWA_COLORKEY,可以看到在視窗    右側是 LWA_ALPHA可以看到整體呈現半透明,而且

上畫的RGB=(255,0,255)的圓形被視    在視窗上繪製的圓形也是半透明的。(也註意到對圓型

為透明                     視窗其坐標還是按矩形的左上角算的) 

 

兩種效果可以同時使用效果,其效果就是一個半透明的黑色月亮。

可以使用UpdataLayeredWindow()函數更新Layered Window。比如重新設置其透明度,位置,大小,形狀等。該函數會更新整個視窗。不需要擔心被遮擋的視窗的更新問題,系統會處理好的。(對一個Layered視窗系統總是保存其下麵的圖像,並自動更新,這意味著占用更多記憶體,所以不需要時通過SetWindowLong()刪除WS_LAYERED風格。這在下麵還會說)

對透明的部分(比如上面左圖月牙缺掉的部分或者對右圖設置阿爾法值為0)點擊滑鼠時,滑鼠消息會透過視窗,也就是Layered視窗在此處不接受滑鼠消息。這很符合所看即所得的設計理念,用戶感覺看不到的地方就是沒有,他們不必理解什麼阿爾法混合。

如何設置Layered視窗為普通的視窗

如果不再需要透明效果,儘早去掉Layered屬性可以提高性能,標準的做法如下:

// Remove WS_EX_LAYERED from this window styles
SetWindowLong(hwnd, 
              GWL_EXSTYLE,
              GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);

// Ask the window and its children to repaint
RedrawWindow(hwnd, 
             NULL, 
             NULL, 
             RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

最後說一點,如果視窗已經創建好了也有其他的辦法,調用SetWindowLong(),重新設置視窗風格即可。但是對一個已經顯示在屏幕上的視窗修改其風格為 WS_EX_LAYERED時會發現該視窗不見了,此時調用UpdataLayeredWindow()或SetLayeredWindowAttributes()後會出現你想要的樣子。

另外:一旦 SetLayeredWindowAttributes 被調用了, 之後對 UpdateLayeredWindow 的調用都會失敗直到重新改變了視窗的Layered屬性。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 打算用家裡的台式機啟用ssh server用筆記本ssh登入linux家裡電腦 lubantu 使用命令sudo apt-get install openssh-server安裝openssh server安裝成功後ps查看是否有sshd進程然後在筆記本windows下使用xshell訪問 ...
  • 簡單的總結一下前段時間學習Linux的成果 查看 TCP 22 埠是否打開1、列出所有埠:[root@Demon proc]# netstat -ntlpActive Internet connections (only servers)Proto ... 一、查看 TCP 22 埠是否打開1 ...
  • 一、在實際生產環境中tomcat啟動是在bin目錄下採用自帶腳本startup.sh啟動;使用shutdown.sh關閉。如下圖: 再如果對於新手來講在不知道路徑情況下重啟是一件頭痛的事情(註意沒有reload,所以重啟只能shutdown.sh在startup.sh);而且這裡還有一個坑等著: 什 ...
  • 需求:有一個進程需要每時每刻不斷的跑,但是這個進程又有可能由於各種原因有可能中斷。當進程中斷的時候我需要他能自動重啟,保證服務一直在跑著。基於整個需求,一開始想的是起一個腳本,監聽該服務的埠,一旦發現埠占用被解除,立即重新執行命令。但是後來發現linux已經有了類似的東西,即今日的主角Super ...
  • 1、基本概念 主機 初始化發送,產生時鐘信號和終止發送的器件 從機 被主機定址的器件 發送器 發送數據到匯流排的器件 接收器 從匯流排接收數據的器件 多主機 同時有多於一個主機嘗試控制匯流排 但不破壞報文 仲裁 是一個在有多個主機同時嘗試控制匯流排,但只允許其中一個控制匯流排並使報文不被破壞的過程 同步 兩個 ...
  • 1、在 CentOS 系統中添加 openresty 資源庫sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo 2、安裝 openrestysudo yum install ope ...
  • 線上上閱讀文檔的時候,有沒有想將它抓取到本地,以備沒有網的時候閱讀只需? 先上指令: 你會看到如下的頁面: 過段時間,就會抓取完成,併在本地生成了一個相關聯的目錄。 這個命令就是 wget。它是開發者在Linux下麵非常喜歡使用的下載指令。經常,我們會看到一些技術文檔在指導你下載安裝包的時候,也會用 ...
  • etc etcetera[ɛtsɛtərə]縮寫 等等的意思 放置一些其他文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...