Winform窗體換膚(仿迅雷7)


 

    前一段時間因為有需要,做了一個關於winfrom 程序換膚的程序,剛開始的時候想圖個簡單,就用個皮膚控件引用一個就完了,可是那個效果很不是讓人滿意,主要是沒有達到要求的效果,操作不夠靈活,所以只有放棄那種簡單的方法了。我看到迅雷7的換膚做的很好,我是不是可以模仿這做這下呢,剛開始的時候沒有多大的頭緒,做起來比較吃力。

    接着我們老大推薦我在網上看到一篇關於winfrom窗體換膚的文章,對我的啟發很大,采用了窗體重繪的方式,全部重寫了窗體的界面,這樣也從根本上能控制窗體的皮膚,先做一個窗體的基類,繪制好基類窗體,等做好了之后,其它需要適用這個窗體風格的都繼承它就可以了。這是那篇文章的地址 http://www.csharpwin.com/csharpresource/2992.shtml
    先把效果貼出來。我這個是仿照迅雷的風格做的,
(1)主體窗口


(2)皮膚的主題調節窗體 

(3)選擇主題自動關聯最合適的配色方案,配色方案可以改變整個窗體的按鈕以及其它控件的顏色,彈出窗體有逐漸淡化效果。每點擊另一種主題,所有繼承於基類窗體的馬上變換(類似於迅雷7)。 

(4)精細化邊框模式,以及控制按鈕。包括鼠標移上去的明顯顯示,以及邊框圓角,控制按鈕的圓角搭配,包括子窗體的漸變效果,透過效果。這塊是發了很多時間去弄的。

 (5)透明度的開啟調節

(6) 靈活個性化的處理。主題可以任意添加和刪除,只需要添加指定圖片即可,圖片就可以自動加載。 


上面那篇文章提供了一個基本的做法思想給我,看懂了基本的方法之后,具體的做法當然還是要靠自己。

 
  二、在開發中碰到的技術難點。
   (1)剛點擊換膚方案,其各個窗體馬上顯示效果,不需要等到換膚窗口保存關閉。
      解決:這個可以通過活動窗口的切換來做到這個點,在切換活動窗口的時候我首先在網上去找好的方法,但都是說取句柄,取線程等等,操作起來非常麻煩,並且效果不是很理想,后來我們老大告訴我一個辦法,直接在其它窗口定義一個static窗體變量,在其它窗口直接調用.Form.Temp.Activate()就行,效果立馬就顯示出來。
    (2 )防止皮膚更換的時候或者改變窗口大小的時候窗體抖動。
              解決:開啟雙重緩存。
      private void SetStyles()
         {
             SetStyle(
                 ControlStyles.UserPaint |
                 ControlStyles.AllPaintingInWmPaint |
                 ControlStyles.OptimizedDoubleBuffer |
                 ControlStyles.ResizeRedraw, true);
             UpdateStyles();
         } 
  這樣的效果能減輕一些的閃動。要想完全消除閃動,必須采用合理的重繪方法。我的這個當不開啟透明效果的時候完成不會出現閃動,但當開啟透明效果的時,改變窗口大小時就會有少許閃動,這個有待改進。
 (3)窗體的亮度對比度已經色彩的控制,使窗體的效果更加好。
    這個我是花了一些時間去調試,因為沒有美術功底,對這一塊不太熟悉,但要想使界面好看,這一塊又必不可少。
 (4)主題方案的拓展
  圖片以及色彩都要能根據用戶的喜好自由拓展,這個就需要采用靈活的方式,不能適用固定的控件放置在窗體,都必須適用動態添加,根據文件的配置去做處理。
   
   (5)把TabContorl控件設置透明能透出背景色。
       這個做出功能是很簡單的,把背景色設為透明就可以了,或者設置TransparencyKey,但是純粹這個設置的話加載窗體的時候會出現是閃動,同時切換的時候感覺速度有所變慢,這個后來是重新自己重繪了TabContorl控件,改變其樣式,
 protected override CreateParams       CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
                return cp;
            }
        }
這個可以減輕絕大部分閃動,基本可以忽略不記了。
      經過半個月的時間,把這個窗體換膚的大體部分已經做出來了,設計方面都是仿照的迅雷7(個人設計水平有限),當然有些方面還是沒有迅雷7做的好,只是把其換膚基本功能實現,要是在美工上和程序上再加以改進,也會能做出更好的效果。
     如果有需要的博友可以到下面下載,下面的是一個窗體的基類的重繪,別的窗體繼承這個窗體就行了,不過聲明一下,這一部分的代碼是我在上面我提供的那個網址的基礎上修改的,同時把一些的關鍵地方做了一些注釋,能更容易讀懂一些,還有一些的地方可能是我在調試的時候弄的一些可能沒有用的代碼沒有整理的刪除的只是注釋掉了。如果把這個東西看懂關鍵地方,根據自己的需求修改一下,那么這個換膚就已經完成了90%以上的工作。


免責聲明!

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



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