C# 實現對表單(Form)換膚

來源:互聯網
上載者:User

標籤:style   http   io   ar   os   使用   sp   for   strong   

http://www.csharpwin.com/csharpresource/2992.shtml

一直想寫一個比較完整的、容易擴充的表單換膚的方案,由於時間問題,都沒去實現這個想法。現在有朋友提出需要,就把以前寫的重新拿出來看了一篇,花了些時間,做出了現在的這個換膚的方案。實現的過程中遇到了不少問題,但還是解決了,雖然也許還有些缺陷,但也算是比較完善了。現在只實現了完全代碼繪製的SkinFormProfessionalRenderer,接下來有時間會寫一個SkinFormImageRenderer,實現只要做好圖片就可以換膚。

在這先裡發一下牢騷,最近看到很多網站轉載了控制項那幾篇文章,但是著作權聲明、作者資訊都去掉了,說實話,心裡很不爽,這些文章和代碼都是我辛辛苦苦的花了不少時間寫出來的,我也沒有不允許轉載,但是你轉載的時候為什麼還要把作者資訊去掉呢,請你尊重一下作者的勞動好嗎?發完牢騷,先來看一下表單換膚後的效果吧。



看完效果,來看看SkinForm的實現原理:

1、  把Form設定為無標題列視窗。

2、  為了使Form可以像標準的Windows表單那樣擁有系統功能表和拖動改變表單大小,加入WS_THICKFRAME和WS_SYSMENU表單樣式。

3、  處理相應得表單訊息,實現表單的標準操作。

4、  實現SkinFormRenderer,繪製表單的標題列、邊框、按鈕等。

 

原理只做簡單介紹,要詳細說明,那得寫很多東西了,介紹一下SkinForm中加入的幾個屬性的功能:

1、  BorderWidth,設定或擷取表單的邊框的寬度。

2、  CanResize:設定或擷取表單是否可以改變大小。

3、  CaptionFont:設定或擷取表單標題的字型。

4、  CapntionHeight:設定或擷取表單標題列的高度。

5、  CloseBoxSize:設定或擷取關閉按鈕的大小。

6、  MinimizeBoxSize:設定或擷取最小化按鈕的大小。

7、  MaximizeBoxSize:設定或擷取最大化(還原)按鈕的大小。

8、  ControlBoxOffset:設定或擷取控制按鈕的位移。

9、  ControlBoxSpace:設定或擷取控制按鈕的間距。

10、 RoundStyle:設定或擷取表單的圓角樣式。

11、   Radius:設定或擷取表單的圓角的大小。

12、   Renderer:設定或擷取表單的繪製方法。

接下來介紹表單的繪製類SkinFormRenderer,這是比較重要的類,它是一個抽象類別,重寫它裡面的繪製方法,就可以得到新的表單皮膚。這個類裡面主要有幾個抽象方法:

1、  CreateRegion:建立一個Region,提供給SkinForm使用。

2、  OnRenderSkinFormCaption:繪製表單標題列。

3、  OnRenderSkinFormBorder:繪製表單邊框。

4、  OnRenderSkinFormBackground:繪製表單背景。

5、  OnRenderSkinFormControlBox:繪製表單控制按鈕(最小化、最大化、關閉);

看看SkinFormRenderer的完整代碼:

public abstract class SkinFormRenderer
{
#region Fields

private EventHandlerList _events;

private static readonly object EventRenderSkinFormCaption = new object();
private static readonly object EventRenderSkinFormBorder = new object();
private static readonly object EventRenderSkinFormBackground = new object();
private static readonly object EventRenderSkinFormControlBox = new object();

#endregion

#region Constructors

protected SkinFormRenderer()
{
}

#endregion

#region Properties

protected EventHandlerList Events
{
get
{
if (_events == null)
{
_events = new EventHandlerList();
}
return _events;
}
}

#endregion

#region Events

public event SkinFormCaptionRenderEventHandler RenderSkinFormCaption
{
add { AddHandler(EventRenderSkinFormCaption, value); }
remove { RemoveHandler(EventRenderSkinFormCaption, value); }
}

public event SkinFormBorderRenderEventHandler RenderSkinFormBorder
{
add { AddHandler(EventRenderSkinFormBorder, value); }
remove { RemoveHandler(EventRenderSkinFormBorder, value); }
}

public event SkinFormBackgroundRenderEventHandler RenderSkinFormBackground
{
add { AddHandler(EventRenderSkinFormBackground, value); }
remove { RemoveHandler(EventRenderSkinFormBackground, value); }
}

public event SkinFormControlBoxRenderEventHandler RenderSkinFormControlBox
{
add { AddHandler(EventRenderSkinFormControlBox, value); }
remove { RemoveHandler(EventRenderSkinFormControlBox, value); }
}

#endregion

#region Public Methods

public abstract Region CreateRegion(SkinForm form);

public abstract void InitSkinForm(SkinForm form);

public void DrawSkinFormCaption(
SkinFormCaptionRenderEventArgs e)
{
OnRenderSkinFormCaption(e);
SkinFormCaptionRenderEventHandler handle =
Events[EventRenderSkinFormCaption]
as SkinFormCaptionRenderEventHandler;
if (handle != null)
{
handle(this, e);
}
}


public void DrawSkinFormBorder(
SkinFormBorderRenderEventArgs e)
{
OnRenderSkinFormBorder(e);
SkinFormBorderRenderEventHandler handle =
Events[EventRenderSkinFormBorder]
as SkinFormBorderRenderEventHandler;
if (handle != null)
{
handle(this, e);
}
}


public void DrawSkinFormBackground(
SkinFormBackgroundRenderEventArgs e)
{
OnRenderSkinFormBackground(e);
SkinFormBackgroundRenderEventHandler handle =
Events[EventRenderSkinFormBackground]
as SkinFormBackgroundRenderEventHandler;
if (handle != null)
{
handle(this, e);
}
}

public void DrawSkinFormControlBox(
SkinFormControlBoxRenderEventArgs e)
{
OnRenderSkinFormControlBox(e);
SkinFormControlBoxRenderEventHandler handle =
Events[EventRenderSkinFormControlBox]
as SkinFormControlBoxRenderEventHandler;
if (handle != null)
{
handle(this, e);
}
}

#endregion

#region Protected Render Methods

protected abstract void OnRenderSkinFormCaption(
SkinFormCaptionRenderEventArgs e);

protected abstract void OnRenderSkinFormBorder(
SkinFormBorderRenderEventArgs e);

protected abstract void OnRenderSkinFormBackground(
SkinFormBackgroundRenderEventArgs e);

protected abstract void OnRenderSkinFormControlBox(
SkinFormControlBoxRenderEventArgs e);

#endregion

#region Protected Methods

[UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)]
protected void AddHandler(object key, Delegate value)
{
Events.AddHandler(key, value);
}

[UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)]
protected void RemoveHandler(object key, Delegate value)
{
Events.RemoveHandler(key, value);
}

#endregion
}

 

在項目中實現了SkinFormProfessionalRenderer類,這個類實現了類似QQ2008的表單的繪製,效果就是文章開始那貼出來的圖了。還有一些其他協助工具功能的類就不一一介紹了,接下來有時間,我會實現一個SkinFormImageRenderer繪製類,敬請大家關注。

C# 實現對表單(Form)換膚

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.