- 积分
- 40165
- 好友
- 记录
- 主题
- 帖子
- 听众
- 收听
|
C#皮肤-Button 控件实现
导读部分
-------------------------------------------------------------------------------------------------------------
C#皮肤-实现原理系列文章导航
http://www.sufeinet.com/thread-2-1-1.html
本节开始我们一起来讨论一些简单的系统控件的实现,在这里我列出一些基本的控件 如下图所示,在写文章的同时我会不断的更新控件,和添加新的控件,也都会一一的发上来和大家分享。
Button控件 是一个很常见也是用的比较多的一个控件,其实他的实现正和他的使用一样的简单明了。
在看它的实现 之前我们先来看看CommandButton用户控件的实现吧
界面
呵呵 主要看代码吧,这上面没有什么东东可看的
我们先来指定一下默认的事件吧
[code=csharp][DefaultEvent("Click")][/code]
其实这个简单只要这么一行就OK了,但记着一定要写在类的上面哦
[code=csharp] private Image _mouseMoveImage = null;
private Image _mouseDownImage = null;
private Image _normalImage = null;
private ToolTip toolTip;
private System.ComponentModel.IContainer components;
private string _toolTip;
private Color imageTransparentColor;
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
this.SuspendLayout();
//
// CommandButton
//
this.Name = "CommandButton";
this.Size = new System.Drawing.Size(150, 45);
this.ResumeLayout(false);
}
public CommandButton()
{
//this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
InitializeComponent();
}
public Image MouseMoveImage
{
get
{
return _mouseMoveImage;
}
set
{
_mouseMoveImage = value;
}
}
public Image MouseDownImage
{
get
{
return _mouseDownImage;
}
set
{
_mouseDownImage = value;
}
}
public Image NormalImage
{
get
{
return _normalImage;
}
set
{
_normalImage = value;
this.BackgroundImage = _normalImage;
}
}
public Color ImageTransparentColor
{
get
{
return this.imageTransparentColor;
}
set
{
this.imageTransparentColor = value;
Bitmap image = this.BackgroundImage as Bitmap;
if (((image != null) && (value != Color.Empty)) && !ImageAnimator.CanAnimate(image))
{
try
{
image.MakeTransparent(this.imageTransparentColor);
}
catch
{ }
}
}
}
//重写一下创建控件的方法
protected override void OnCreateControl()
{
base.OnCreateControl();
if (this.NormalImage != null)
{
this.BackgroundImage = NormalImage;
}
}
//重写进入事件
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
if (this.MouseMoveImage != null)
{
this.BackgroundImage = MouseMoveImage;
}
this.Invalidate();
}
//重写离开可见部分的事件
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
if (this.NormalImage != null)
{
this.BackgroundImage = NormalImage;
}
this.Invalidate();
}
//重写鼠标按下事件
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{
base.OnMouseDown(e);
if (this.MouseDownImage != null)
{
this.BackgroundImage = this.MouseDownImage;
}
}
//重写鼠标离开事件
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
{
base.OnMouseUp(e);
if (this.NormalImage != null)
{
this.BackgroundImage = NormalImage;
}
}
//重写背景修改时的事件
protected override void OnBackgroundImageChanged(EventArgs e)
{
base.OnBackgroundImageChanged(e);
this.ImageTransparentColor = Color.FromArgb(255, 0, 255);
}
public string ToolTip
{
get { return _toolTip; }
set
{
_toolTip = value;
this.toolTip.SetToolTip(this, _toolTip);
}
}
}[/code]
在这里我就不多说了,因为代码都很简单,所以很容易看明白,大家看看代码吧。
我们主要来看看Button的控件吧
不用说要先继承一下刚说的用户控件哦
[code=csharp]public class Button : CommandButton[/code]
接下来来看一下 InitializeComponent()方法
[code=csharp] private void InitializeComponent()
{
this.lblText = new Label();
this.SuspendLayout();
//
// lblText
//
this.lblText.BackColor = System.Drawing.Color.Transparent;
this.lblText.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblText.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblText.Location = new System.Drawing.Point(0, 0);
this.lblText.Name = "lblText";
this.lblText.Size = new System.Drawing.Size(78, 30);
this.lblText.TabIndex = 0;
this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblText.TextChanged += new System.EventHandler(this.lblText_TextChanged);
this.lblText.MouseLeave += new System.EventHandler(this.lblText_MouseLeave);
this.lblText.Click += new System.EventHandler(this.lblText_Click);
this.lblText.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseUp);
this.lblText.MouseEnter += new System.EventHandler(this.lblText_MouseEnter);
this.lblText.ForeColor = Shared.FontColor;
//
// Button
//
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.Controls.Add(this.lblText);
this.Name = "Button";
this.Size = new System.Drawing.Size(78, 30);
this.ResumeLayout(false);
}[/code]
我们让字体同比率的话可以加上这个
[code=csharp]//字体大小
//protected override void OnResize(EventArgs e)
//{
// base.OnResize(e);
// this.Height = this.Width * 30 / 78;
//}[/code]
当然也要处理一下OnSizeChanged(EventArgs e)事件
[code=csharp]//固定比率暂时不需要,如果有需要的话可以取消注释
//protected override void OnSizeChanged(EventArgs e)
//{
// base.OnSizeChanged(e);
// int Rgn = 0, height = 0, width = 0,rgn=0;
// height = Height > 40 ? Height - 1 : Height;
// width = Width > 110 ? Width - 1 : Width;
// rgn = Height > 40 ? 8 : 7;
// Rgn = Win32.CreateRoundRectRgn(1, 1, width, height, rgn, rgn);
// Win32.SetWindowRgn(this.Handle, Rgn, true);
//}[/code]
其它代码全在这里
[code=csharp]代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using CRD.Common;
namespace CRD.WinUI.Misc
{
public class Button : CommandButton
{
public Label lblText;
private DialogResult _dialogResult = DialogResult.None;
public virtual DialogResult DialogResult
{
get { return _dialogResult; }
set { _dialogResult = value; }
}
public Button()
: base()
{
//this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
InitializeComponent();
}
public void PerformClick()
{
this.OnClick(new EventArgs());
}
private void InitializeComponent()
{
this.lblText = new Label();
this.SuspendLayout();
//
// lblText
//
this.lblText.BackColor = System.Drawing.Color.Transparent;
this.lblText.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblText.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblText.Location = new System.Drawing.Point(0, 0);
this.lblText.Name = "lblText";
this.lblText.Size = new System.Drawing.Size(78, 30);
this.lblText.TabIndex = 0;
this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblText.TextChanged += new System.EventHandler(this.lblText_TextChanged);
this.lblText.MouseLeave += new System.EventHandler(this.lblText_MouseLeave);
this.lblText.Click += new System.EventHandler(this.lblText_Click);
this.lblText.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseUp);
this.lblText.MouseEnter += new System.EventHandler(this.lblText_MouseEnter);
this.lblText.ForeColor = Shared.FontColor;
//
// Button
//
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.Controls.Add(this.lblText);
this.Name = "Button";
this.Size = new System.Drawing.Size(78, 30);
this.ResumeLayout(false);
}
//字体大小
//protected override void OnResize(EventArgs e)
//{
// base.OnResize(e);
// this.Height = this.Width * 30 / 78;
//}
protected override void OnCreateControl()
{
base.OnCreateControl();
this.NormalImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btnnomal.bmp"), true, false);
this.MouseDownImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btndown.bmp"), true, false);
this.MouseMoveImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btnfore.bmp"), true, false);
}
public void ResetBackGroundImage()
{
this.NormalImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btnnomal.bmp"), true, false);
this.MouseDownImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btndown.bmp"), true, false);
this.MouseMoveImage = Bitmap.FromStream(Shared.AssemblyWinUI.GetManifestResourceStream("CRD.WinUI.Resources.Common.button.btnfore.bmp"), true, false);
}
private string _text = string.Empty;
[Browsable(true)]
public new string Caption
{
get { return _text; }
set
{
_text = value;
if (lblText.Text != value)
{
lblText.Text = value;
}
}
}
private void lblText_TextChanged(object sender, EventArgs e)
{
this.Text = lblText.Text;
}
private void lblText_MouseEnter(object sender, EventArgs e)
{
this.OnMouseEnter(e);
}
private void lblText_MouseLeave(object sender, EventArgs e)
{
this.OnMouseLeave(e);
}
private void lblText_MouseUp(object sender, MouseEventArgs e)
{
this.OnMouseUp(e);
}
private void lblText_Click(object sender, EventArgs e)
{
this.PerformClick();
}
//固定比率暂时不需要,如果有需要的话可以取消注释
//protected override void OnSizeChanged(EventArgs e)
//{
// base.OnSizeChanged(e);
// int Rgn = 0, height = 0, width = 0,rgn=0;
// height = Height > 40 ? Height - 1 : Height;
// width = Width > 110 ? Width - 1 : Width;
// rgn = Height > 40 ? 8 : 7;
// Rgn = Win32.CreateRoundRectRgn(1, 1, width, height, rgn, rgn);
// Win32.SetWindowRgn(this.Handle, Rgn, true);
//}
}
}[/code]
|
|