C#表單皮膚製作(二):建立表單庫項目以及最小化、最大化、關閉按鈕的實現

來源:互聯網
上載者:User

標籤: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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.