找回密码
 入驻
搜索
查看: 618842|回复: 7

C#做的.net水晶按纽控件

[复制链接]
发表于 2006-10-31 19:56:57 | 显示全部楼层 |阅读模式
我这几天呕心厉血做的.net水晶按纽控件,发上来给正在用.net平台的同僚们使用
用到了GDI+绘图二级缓存技术,小弟这几天初涉GDI+
希望有GDI图形编程这方面资料的同学传一下

MyCrystalButton.rar

3.08 KB, 下载次数: 13

 楼主| 发表于 2006-10-31 20:00:43 | 显示全部楼层
新建windows应用程序,控件栏里由击鼠标,选添加/移除项,在出来的筐筐里点右下角的浏览,然后选择压出来的dll文件即可

效果图

效果图
回复

使用道具 举报

发表于 2006-11-2 15:58:09 | 显示全部楼层
这个也不错!
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Windows.Forms;
  7. using System.Drawing.Drawing2D;
  8. using System.Drawing.Text;
  9. namespace WindowsControlLibrary1
  10. {
  11. /// <summary>
  12. /// UserControl1 的摘要说明。
  13. /// </summary>
  14. public class CrystalButton : Button
  15. {
  16.   /// <summary>
  17.   /// 必需的设计器变量。
  18.   /// </summary>
  19.   private System.ComponentModel.Container components = null;
  20.   private bool XiaCen=false;
  21.   private bool mouseMove=false;
  22.   private Color backColor;
  23.   public CrystalButton()
  24.   {
  25.    // 该调用是 Windows.Forms 窗体设计器所必需的。
  26.    InitializeComponent();
  27.    // TODO: 在 InitComponent 调用后添加任何初始化
  28.    backColor=this.backColor;
  29.    //this.Text=this.ShowFocusCues.ToString();
  30.   }
  31.   /// <summary>
  32.   /// 清理所有正在使用的资源。
  33.   /// </summary>
  34.   protected override void Dispose( bool disposing )
  35.   {
  36.    if( disposing )
  37.    {
  38.     if( components != null )
  39.      components.Dispose();
  40.    }
  41.    base.Dispose( disposing );
  42.   }
  43.   #region 组件设计器生成的代码
  44.   /// <summary>
  45.   /// 设计器支持所需的方法 - 不要使用代码编辑器
  46.   /// 修改此方法的内容。
  47.   /// </summary>
  48.   private void InitializeComponent()
  49.   {
  50.    //
  51.    // CrystalButton
  52.    //
  53.    this.Name = "CrystalButton";
  54.    this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.UserControl1_MouseUp);
  55.    this.Paint += new System.Windows.Forms.PaintEventHandler(this.UserControl1_Paint);
  56.    this.MouseEnter += new System.EventHandler(this.UserControl1_MouseEnter);
  57.    this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.UserControl1_KeyUp);
  58.    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.UserControl1_KeyDown);
  59.    this.BackColorChanged += new System.EventHandler(this.UserControl1_BackColorChanged);
  60.    this.MouseLeave += new System.EventHandler(this.UserControl1_MouseLeave);
  61.    this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.UserControl1_MouseDown);
  62.   }
  63.   #endregion
  64.   
  65.   
  66.   protected GraphicsPath GetGraphicsPath(Rectangle rect)
  67.   {
  68.    GraphicsPath ClientPath = new System.Drawing.Drawing2D.GraphicsPath();
  69.    if(rect.Width<=0)
  70.    {
  71.     rect.Width=1;
  72.    }
  73.    if(rect.Height<=0)
  74.    {
  75.     rect.Height=1;
  76.    }
  77.       
  78.    ClientPath.AddArc(rect.Left,rect.Top,rect.Height,rect.Height,90f,180f);
  79.    ClientPath.AddArc(rect.Right-rect.Height,rect.Top,rect.Height,rect.Height,270f,180f);
  80.    ClientPath.CloseFigure();
  81.    return ClientPath;
  82.   }
  83.    
  84.   protected GraphicsPath GetGraphicsPath1(Rectangle rect)
  85.   {
  86.    GraphicsPath ClientPath = new System.Drawing.Drawing2D.GraphicsPath();
  87.    if(rect.Width<=0)
  88.    {
  89.     rect.Width=1;
  90.    }
  91.    if(rect.Height<=0)
  92.    {
  93.     rect.Height=1;
  94.    }
  95.       
  96.    ClientPath.AddArc(rect.Left,rect.Top,rect.Height,rect.Height,190f,80f);
  97.    ClientPath.AddArc(rect.Right-rect.Height,rect.Top,rect.Height,rect.Height,270f,80f);
  98.    ClientPath.CloseFigure();
  99.    return ClientPath;
  100.   }
  101.   
  102.   private void DrawYinYing(Graphics gr,bool xiacen)
  103.   {
  104.    Rectangle rect= this.ClientRectangle;
  105.    rect.Inflate(-(rect.Width/10),-(rect.Height)/4);
  106.    float bf1=rect.Width/100f;
  107.    float bf2=rect.Height/100f;
  108.    
  109.    rect.Y=rect.Y+this.ClientRectangle.Height/4;
  110.    if(xiacen)
  111.    {
  112.     rect.Y=rect.Y+4;
  113.    }
  114.    GraphicsPath path;
  115.    
  116.    for(int a=1;a<33;a++)
  117.    {
  118.     float bf3=bf1*a;
  119.     float bf4=bf2*a;
  120.     Rectangle rect1=rect;
  121.     rect1.Inflate(-(int)bf3,-(int)bf4);
  122.     path=GetGraphicsPath(rect1);
  123.         
  124.     int r=backColor.R;
  125.     int g=backColor.G;
  126.     int b=backColor.B;
  127.     r=r+3*a;
  128.     g=g+3*a;
  129.     b=b+3*a;
  130.     if(r>255) r=255;
  131.     if(g>255) g=255;
  132.     if(b>255) b=255;
  133.     gr.FillPath(new SolidBrush(Color.FromArgb(r,g,b)),path);
  134.    }
  135.   }
  136.   
  137.   private void DrawGaoLiang(Graphics g,bool xiacen)
  138.   {
  139.    Rectangle rect= this.ClientRectangle;
  140.    rect.Inflate(-4,-4);
  141.    
  142.    if(xiacen)
  143.    {
  144.     rect.Y=rect.Y+4;
  145.    }
  146.    GraphicsPath path=GetGraphicsPath1(rect);
  147.    RectangleF rect1=path.GetBounds();
  148.    rect1.Height=rect1.Height+1;
  149.    g.FillPath(new LinearGradientBrush(rect1,
  150.     Color.FromArgb(0xff,0xff,0xff,0xff),
  151.     Color.FromArgb(0xff,backColor),LinearGradientMode.Vertical),path);
  152.   }
  153.   
  154.   private void DrawText(Graphics g,bool xiacen)
  155.   {
  156.    Rectangle rect= this.ClientRectangle;
  157.    Rectangle rect1= this.ClientRectangle;
  158.    StringFormat stringFormat=new StringFormat();
  159.    stringFormat.Alignment=StringAlignment.Center;
  160.    stringFormat.LineAlignment=StringAlignment.Center;
  161.    rect.Y=this.ClientRectangle.Height/5;
  162.    if(xiacen)
  163.    {
  164.     rect.Y=rect.Y+4;
  165.     rect1.Y=rect1.Y+4;
  166.    }
  167.    
  168.    Font font=this.Font;
  169.    
  170.    
  171.    if(mouseMove)
  172.    {
  173.     font=new Font(this.Font,FontStyle.Underline);
  174.    }
  175.    
  176.    g.DrawString(this.Text,font,
  177.     new SolidBrush(Color.FromArgb(0x66,backColor)),rect,stringFormat);
  178.    g.DrawString(this.Text,font,new SolidBrush(this.ForeColor),rect1,stringFormat);
  179.   }
  180.   private void UserControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  181.   {
  182.    if(XiaCen==false)
  183.    {
  184.     XiaCen=true;
  185.     this.Refresh();
  186.    }
  187.   }
  188.   
  189.   private void UserControl1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  190.   {
  191.    if(XiaCen==true)
  192.    {
  193.     XiaCen=false;
  194.     this.Refresh();
  195.    }
  196.   }
  197.   private void UserControl1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  198.   {
  199.    
  200.    
  201.   }
  202.   
  203.   protected override void OnPaint(PaintEventArgs e)
  204.   {
  205.    
  206.    base.OnPaint(e);
  207.    e.Graphics.FillRectangle(new SolidBrush(backColor),0,0,this.Width,this.Height);
  208.    e.Graphics.SmoothingMode=SmoothingMode.HighQuality;
  209.    e.Graphics.TextRenderingHint=TextRenderingHint.AntiAliasGridFit;
  210.    Rectangle rect=new Rectangle(0,0,this.Width,this.Height);
  211.    GraphicsPath ClientPath=GetGraphicsPath(rect);
  212.    e.Graphics.FillPath(new SolidBrush(backColor),ClientPath);
  213.    this.Region=new System.Drawing.Region(ClientPath);
  214.    DrawYinYing(e.Graphics,XiaCen);
  215.    DrawGaoLiang(e.Graphics,XiaCen);
  216.    DrawText(e.Graphics,XiaCen);
  217.    
  218.    if(this.Focused)
  219.    {
  220.     e.Graphics.DrawPath(new Pen(Color.FromArgb(0x22,0xff,0xff,0xff), 3), ClientPath);
  221.    }
  222.    
  223.   }
  224.   

  225.   private void UserControl1_BackColorChanged(object sender, System.EventArgs e)
  226.   {
  227.    int r=BackColor.R;
  228.    int g=BackColor.G;
  229.    int b=BackColor.B;
  230.    r=r+0x22;
  231.    g=g+0x22;
  232.    b=b+0x22;
  233.    if(r>255) r=255;
  234.    if(g>255) g=255;
  235.    if(b>255) b=255;
  236.    backColor=Color.FromArgb(r,g,b);
  237.   }
  238.   private void UserControl1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  239.   {
  240.    if(XiaCen==false && e.KeyCode==Keys.Space)
  241.    {
  242.     XiaCen=true;
  243.     this.Refresh();
  244.    }
  245.   }
  246.   private void UserControl1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
  247.   {
  248.    if(XiaCen==true && e.KeyCode==Keys.Space)
  249.    {
  250.     XiaCen=false;
  251.     this.Refresh();
  252.    }
  253.   }
  254.   private void UserControl1_MouseEnter(object sender, System.EventArgs e)
  255.   {
  256.    if(mouseMove==false)
  257.    {
  258.     mouseMove=true;
  259.     this.Refresh();
  260.    }
  261.   }
  262.   private void UserControl1_MouseLeave(object sender, System.EventArgs e)
  263.   {
  264.    if(mouseMove==true)
  265.    {
  266.     mouseMove=false;
  267.     this.Refresh();
  268.    }
  269.   }
  270.   
  271. }
  272. }
复制代码
未命名.JPG

WindowsControlLibrary1.rar

3.84 KB, 下载次数: 3

回复

使用道具 举报

发表于 2006-11-2 16:06:59 | 显示全部楼层
帮你找到几个BUG~~~~改变窗体背景色后按钮背景色还是白色,不会透明,,按钮内的字体大小不能更改
将按钮高度拖小后会出先内存不足的错误提示,其实偶机器一点都不卡~~

[ 本帖最后由 欣云 于 2006-11-2 16:10 编辑 ]
未命名.JPG
回复

使用道具 举报

发表于 2006-11-2 16:13:13 | 显示全部楼层
顶楼主~~~~~~~~~~
回复

使用道具 举报

发表于 2006-11-5 11:56:49 | 显示全部楼层
你在交通局门口乱停车被罚款 141 思明论坛!

   下次努力哦!……
辛苦了.....顶....
回复

使用道具 举报

 楼主| 发表于 2006-11-10 15:22:47 | 显示全部楼层
母亲节买礼物送给母亲,热心值加 8

   下次努力哦!……
原帖由 欣云 于 2006-11-2 16:06 发表
帮你找到几个BUG~~~~改变窗体背景色后按钮背景色还是白色,不会透明,,按钮内的字体大小不能更改
将按钮高度拖小后会出先内存不足的错误提示,其实偶机器一点都不卡~~

谢谢,这些问题我也发现了,字体不能改,换色就漏馅,以后还会有改进的,至于内存的那个我倒是没发现
回复

使用道具 举报

 楼主| 发表于 2006-11-10 15:25:53 | 显示全部楼层
这世界竟然有人整天捡到钱,怎么会没人丢钱呢——摸摸口袋,发现你少了 392 思明论坛!

   下次努力哦!……
你发的那个很强11111111
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入驻

本版积分规则

QQ|Archiver|手机版|小黑屋|思明论坛

GMT+8, 2024-11-16 21:26 , Processed in 0.100133 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表