標籤: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)換膚