【開源】做了一個WinForm窗體的投影組件,能夠為窗口添加影子效果


最近手頭上的項目終於忙得差不多了,想起好久沒有更新了的NanUI,再看着每天QQ群未讀消息閃爍的標志,突然才發現似乎愧對了群里各位喜愛NanUI的朋友們。於是乎,就想趁這幾天有時間,好好的修復一下NanUI已知的BUG,再用有限的時間推進整個項目的進度。

在復習代碼的時候,想起了群里有朋友提出說NanUI的窗口的幾個問題:

  • 在某些Win7環境下會出現窗口標題繪制錯誤;
  • Win8下面窗口陰影沒有問題
  • 模擬繪制的影子拖動窗口改變大小時繪制緩慢資源占用大

原來NanUI呈現窗口的方式有兩種,一種是使用DWM的ExtendIntoView這個方法讓窗口的客戶區擴展至整個窗口來實現滿窗口顯示HTML內容的需求;還有一種兼容的方式是使用重繪非客戶區來實現擴展客戶的方式。

第一中方式有幾個問題,Win7下面因為有玻璃效果和粗邊框,會導致呈現效果很怪異,而且有群友反應的Win7標題欄繪制錯誤也跟DWM有關系,特別是禁用了Win7玻璃效果的時候最為明顯;其次,Win8下面DWM不會為窗口繪制投影,所以窗口就沒有影子效果,很丑。

第二種方式窗口繪制雖然沒有什么問題,但是窗口的影子需要自己來畫,我之前采用的方案是在主窗口后面外掛了個LayeredWindow樣式子窗口來手動繪制窗口影子,之前看GitHub上有另外一個國人做的窗體投影的工具winform.DropShadow, 實現了投影,而且投影還夠動態生成,但是有幾個問題:

  • 陰影呈現效果與主窗體極不協調
  • 如果把主窗體弄成可以改變大小的形式,那么繪制影子的時候卡頓非常明顯
  • 似乎內存泄漏,內存越用越大

同樣的,我自己來畫的窗口也是存在這些問題,因為原理都一樣的。

最后研究了2天,終於完成了下面這個能夠為窗口添加影子效果的組件——

 

FormShadow for .NET Winform

中文名:Winfom投影組件

GITHUB地址:https://github.com/NetDimension/Winform-FormShadow/

 

FormShadow 能夠快速的為你的WinForm窗口繪制窗體投影,當然不是用添加 CS_DROPSHADOW 樣式這種又陋又難看的方式。其工作原理和最近幾個版本的Visual Studio Shell采用的投影方式相同,在主窗體的四周創建4個LayeredWindow來承載陰影圖片,並與主窗體同步事件。

功能:

  • 為WinForm窗體創建漂亮的投影效果,並且支持 活動/非活動 狀態下面的投影顏色。
  • 快速繪制陰影,不閃爍,不卡頓。
  • 主窗體能隨意改變大小不受任何限制。

 

使用方式:

下面的例子就是使用FormShadow最簡單的例子,初始化一個Decorator來為主窗體添加影子效果,然后設置了拖動這些影子能改變主窗體(Borderless)的大小。

public partial class Form1 : Form
{

    protected readonly FormShadowDecorator ShadowDecorator;

    public Form1()
    {
        InitializeComponent();
        ShadowDecorator = new FormShadowDecorator(this);
        //啟用窗口大小調整
        //Enable resizing form with shadows.
        ShadowDecorator.EnableResize(true);
    }
}

 

如果在使用這個組件的時候有任何疑問加我的私人QQ(不一定在線,現在大家都微信咯)或者QQ群來討論,QQ群歡迎任何有關於.NET技術的話題。

2000人QQ群: 241088256

我的QQ: 19843266

 

贊助作者:

如果你喜歡我的工作,那么歡迎您加入到任何項目的開發中來;

當然你也可以非常直接了當的支付寶或微信掃碼來請我喝咖啡:)

乞丐圖

 

“聽說之前請我喝咖啡的朋友,最后都走上人生巔峰了呢~”

—— 著名網絡乞丐 Mr.JSON


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM