標籤:c#表單皮膚製作
很高興有朋友關注這篇部落格,同時也十分抱歉讓關注的朋友久等了,隔上一篇部落格也有3個月沒有更新,主要是由於3月份辭職,4月份初離職到期離開了北京高德,來到了上海張江。目前新工作也處於熟悉當中,希望大家能體諒。剛好這周末有點時間,我就接著寫寫,這篇部落客要是針對初學者,希望給為他們能提供一種較易理解的表單皮膚製作思路,記得自己當初學習C#編程的時候也是摸著石頭過河。
閑話少說,我還是接著上篇部落格繼續寫,上次說明了下如何收集圖片資源,這次就以360安全衛士來做樣本進行模仿,本來也想過模仿下qq,但是qq的介面不太福士化也比較複雜,由於主要目的是希望讓初學者弄明白做皮膚製作的思路,話說"授人以魚不如授人以漁",因此這套部落格的解講的過程會比較簡單易懂,讓初學者也能學的明白,並且會將每篇對應的代碼上傳到我的csdn資源中,感興趣的可以下載。我相信只要明白了思路,加上自己努力,qq之類的介面也是可以搞定的。
這一篇部落客要是講自訂表單的實現大體思路,以及最小化、最大化、關閉按鈕的實現。總體思路是去掉表單的預設邊框,用其他的控制項來替代最小化、最大化、關閉按鈕的預設實現。第一講不會考慮太多的細節,待功能開發的差不多時再進行一些代碼的重構。由於是第一篇關於代碼的,所以會從項目的建立、圖片資源的引入開始,一步步講解。
第一步:資源圖片的選擇
資源圖片:[http://download.csdn.net/detail/bbirdsky/6923955]找到壓縮包中的360safe.zip;
這一講主要使用到的圖片資源有:./MainFrame/Image/
background_mainwnd.jpg // 這張做為表單的背景,為了命名簡單更名為img_bg
sys_button_***.jpg //這4張分別對應最小化、最大化(還原)、關閉按鈕的圖片,更名為btn_***。
第二步:建立解決方案(MySkins)
並添加一個Window表單控制項陳列庫項MySkins目用於做自定皮膚,另外添加一個Window表單應用程式項目MySkinsTest用於做測試,並將MySkinsTest做為預設啟動項目,並為MySkinsTest添加引用項目MySkins步驟
第三步:建立目錄結構
建立Contorl、Entity、Frame、Util用於存放對應的類檔案,以及將圖片資源添加進項目的圖片資源中去,最終的項目結構
第四步:測試代碼
先在MySkins項目中添加一個BaseForm表單,並在MySkinsTest測試專案中讓預設的Form1表單繼承自BaseForm,測試專案只是用於測試MySkins項目的效果,注意一定要先添加MySkins依賴項目,不然會找不到BaseForm這個類!
namespace MySkinsTest{ public partial class Form1 : BaseForm { public Form1() { InitializeComponent(); } }}
第五步:皮膚代碼(BaseForm)
1、此篇的核心就是BaseForm表單基類,首先在Frame目錄下建立一個普通的Form表單,並做如下屬性設定:
1>將FormBorderStyle設定為None,此時Form表單就沒有邊框以及最大小、最小化、關閉按鈕了;
將BackgroundImage設定為img_bg,並將DoubleBuffered雙緩衝設定為true。
2>添加三個PictureBox分別用於替代最小化、最大化、關閉按鈕,也可以嘗試使用Button替代;
將PictureBox的BackColor設定為Transparent透明,預設是灰色;
將三個PictureBox的定位設定為Anchor:Top,Right,這樣最大化後的按扭位置後按右上保持不變;
綁定滑鼠點擊、移入移出、按下抬起事件,建議是相同事件用同一個事件方法處理。
3>添加一個ToolTip控制項,用於顯示提示資訊,設定完的效果如:
2、程式碼分析:本講主要包含ControlState控制項狀態和ResUtils資源協助類。
1>由於圖片的背景圖片是4個為一組的,因此定義狀態枚舉類:ControlState,代碼如下:
/// <summary> /// 控制項狀態 /// </summary> public enum ControlState { Normal = 1,//控制項預設時 MouseOver = 2,//滑鼠移上控制項時 MouseDown = 3,//滑鼠按下控制項時 Disable = 4 //當控制項不可用時 }
2>由於需要從資源中擷取圖片以及需要對擷取的圖片按狀態進行切分,因些需要協助類:ResUtils,代碼如下:
/// <summary> /// 資源輔助類 /// </summary> class ResUtils { /// <summary> /// 根據資源名稱擷取映像 /// </summary> /// <param name="name">資源名稱</param> /// <returns>映像</returns> public static Bitmap GetResAsImage(string name) { if (name == null || name == "") { return null; } return (Bitmap)Properties.Resources.ResourceManager.GetObject(name); } /// <summary> /// 圖片按鈕的背景圖是4個,根據狀態擷取其中背景圖 /// </summary> /// <param name="name">圖片名稱</param> /// <param name="state">狀態</param> /// <returns></returns> public static Bitmap GetResWithState(String name, ControlState state) { Bitmap bitmap = (Bitmap)GetResAsImage(name); if (bitmap == null) { return null; } int block = 0; switch (state) { case ControlState.Normal: block = 0; break; case ControlState.MouseOver: block = 1; break; case ControlState.MouseDown: block = 2; break; case ControlState.Disable: block = 3; break; } int width = bitmap.Width / 4; Rectangle rect = new Rectangle(block * width, 0, width, bitmap.Height); return bitmap.Clone(rect, bitmap.PixelFormat); } }
3>對於最小化、最大化、關閉的實現代碼如下:
this.WindowState = FormWindowState.Maximized; // 最大化
this.WindowState = FormWindowState.Minimized; // 最小化
this.WindowState = FormWindowState.Normal; // 一般狀態
this.Close(); // 關閉
3、第一講最終的效果實現了一個比較簡單自訂表單,具有最大化、最小化以及關閉功能。
不具備的功能:沒有表單小表徵圖、標題,不能對表單進行拖動、調整表單大小,這是下一節要實現的功能。
小表徵圖和標題比較簡單好實現 ,表單拖動、調整大小不使用win32Api也可以實現,但是效果不是太好,下節將使用win32Api進行實現!
對Win32不瞭解的可以看看這個文檔:http://download.csdn.net/detail/bbirdsky/6910413
最後,我將繼續保持更新。本篇對應代碼下載:http://download.csdn.net/detail/bbirdsky/7366791。