最近手頭上的項目終於忙得差不多了,想起好久沒有更新了的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