C#仿QQ皮肤-Button 控件实现

  原文地址:http://www.sufeinet.com/thread-2076-1-1.html

导读部分
-------------------------------------------------------------------------------------------------------------
C#仿QQ皮肤-实现原理系列文章导航 最新版源码下载

http://www.sufeinet.com/thread-2-1-1.html                                             

       本节开始我们一起来讨论一些简单的系统控件的实现,在这里我列出一些基本的控件 如下图所示,在写文章的同时我会不断的更新控件,和添加新的控件,也都会一一的发上来和大家分享。

   

    Button控件 是一个很常见也是用的比较多的一个控件,其实他的实现正和他的使用一样的简单明了。

在看它的实现 之前我们先来看看CommandButton用户控件的实现吧

    界面

           

  呵呵 主要看代码吧,这上面没有什么东东可看的

我们先来指定一下默认的事件吧

 

[DefaultEvent( " Click " )]

 

 

其实这个简单只要这么一行就OK了,但记着一定要写在类的上面哦

 

代码

        
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);
            }
        }
    }

 

在这里我就不多说了,因为代码都很简单,所以很容易看明白,大家看看代码吧。

我们主要来看看Button的控件吧

不用说要先继承一下刚说的用户控件哦

 

  public   class  Button : CommandButton

 

接下来来看一下 InitializeComponent()方法

代码
   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;
        
// }

 

当然也要处理一下OnSizeChanged(EventArgs e)事件

 

代码
  // 固定比率暂时不需要,如果有需要的话可以取消注释
        
// 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);
        
// }

 

 

 

其它代码全在这里

 

代码
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);
        
// }
    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值