最近手頭上的項目終於忙得差不多了,想起好久沒有更新了的NanUI,再看著每天QQ群未讀消息閃爍的標誌,突然才發現似乎愧對了群里各位喜愛NanUI的朋友們。於是乎,就想趁這幾天有時間,好好的修複一下NanUI已知的BUG,再用有限的時間推進整個項目的進度。 在複習代碼的時候,想起了群里有朋友提出說Na ...
最近手頭上的項目終於忙得差不多了,想起好久沒有更新了的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