c#中的圆形按钮

Image 1

介绍

本例中显示的按钮是分阶段开发的。我将 一个接一个地引导您完成这些步骤,以便您可以创建自定义控件 自己很容易。圆形按钮是椭圆按钮的特殊情况。

概述

我写这篇文章的动机开始于我试图 模拟视窗媒体播放器的圆形按钮。我想创建一个自定义 c#中的控件和圆形按钮是开发人员普遍尝试的控件 在实现自定义控件时实现。我搜索了codeproject和谷歌, 没有,我决定自己创造一个。

在c#中创建自定义控件比在MFC中更容易, 由于整柜。Chris Maunder写过一篇关于如何创建 椭圆按钮使用MFC。由于某些原因,本示例中的代码看起来更简单 FCL函数是免费的。

这个按钮有什么特别的

我开发的按钮有以下属性:

  • 它是椭圆的/圆的
  • HoverColor -按钮时的颜色 鼠标经过它
  • 我们开始的点 绘制按钮文本。坐标相对于左上角 按钮的边界矩形。
  • ColorGradient -这个参数允许你 树荫下的按钮。指示您想要的颜色过渡的锐度。
  • 表示每个有多少 像素你想改变颜色。
  • 淡出-表示如果你想要更深的颜色 外面或里面。对于沿边缘较深的颜色表示为真,对于沿边缘较深的颜色表示为假 打火机。

为什么要使用圆形按钮?

为什么要创建一个圆形按钮呢?首先,如果你 想要漂亮的UI。其次,如果一个常规的矩形按钮没有一个好,为 例如,它看起来像雪茄。Windows媒体播放器的播放按钮模仿 如今多媒体播放器上的圆形按钮更多地传达了这一理念 比长方形的要准确。

在c#中创建圆形按钮更容易,而且你也可以这样做 如果你想让它与其他软件无缝集成,你可以使用。net来创建它 UI开发环境,如VB.Net。为了使用它,你需要一个 安装了。net框架的操作系统。以替换按钮 在现有项目中使用这个新单词时,需要替换该单词 按钮按圆形按钮在 初始化ecomponents()函数,并添加一个引用 到此按钮的dll托管代码。

c#背景

 

c#中所有控件的母控件是

Control 
类。它拥有所有你想要脱离控制和MSDN的特性 很好地描述了特性。如果您正在创作一个新的控件和您的控件 将类似于现有的标准控制,你会做得好吗 扩展这个类。在我们的示例中,我们扩展按钮类。来 创建一个包含复选框和显示图像而不是文本的列表框 扩展CheckedListBox类。如果您要创建控件 从零开始,它和你知道的任何控件都没有行为上的相似之处 的,你想扩展用户控件类。你可以创建 复合控件也使用用户控件

 

基本的哲学

创建圆形按钮的基本理念很简单 扩展Button类,拥有一个绘图处理程序draw 处理程序中的椭圆。然而,还有其他的复杂之处。如果你是 有了自己的绘图处理程序,就不会调用默认值 油漆处理程序,这意味着更多的责任:

    您必须为按钮设置区域,以便如果 用户单击在边界圆之外但在范围内的点 边框,不能转换为单击。 你会影响其他与绘图相关的属性,如: 文本,图像和背景。如果你没有调用默认隐藏复制CodePaint处理程序,您必须绘制文本和图像,按用户需要对齐 他们。

拉代码

时间代码。下面,我将简要描述这些步骤 我开发了这个按钮。

步骤1

简单的圆形按钮。视觉效果。在行为上类似于 矩形按钮。我们创建了一支笔和一个画笔。钢笔,用来画 边界椭圆/圆;笔刷:填充椭圆的内部。

constructor:
{
      _pen = new Pen(_color);
      _brush = new SolidBrush(Color.FromKnownColor (KnownColor.Control));
      _brushInside = new SolidBrush(_color);
}

// OnPaint…
protected override void OnPaint(PaintEventArgs pe)
{
      Graphics g = pe.Graphics;
      g.FillRectangle(_brush, 0, 0, ClientSize.Width, ClientSize.Height);
      g.DrawEllipse(_pen, 0, 0, ClientSize.Width, ClientSize.Height);
      g.FillEllipse(_brushInside, 0, 0, ClientSize.Width, ClientSize.Height);
}

此外,您希望公开一个颜色属性,该属性 终端用户可以在设计模式下填充。

步骤2

步骤1中的实现有一个bug:如果单击a 在边界圆外但在边界矩形内的点, 这被解释为单击。

为了解决这个问题,我们添加以下代码

OnPaint 
要正确设置窗口区域:

 

GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);
this.Region = new Region(path);

步骤3

其余的代码应该易于解释。我有 开发的函数,一步一步,使着色代码更有吸引力 修复问题,因为我们避免调用默认值

Paint 
处理程序。我调用了在按钮内作画的函数 在OnPaint ()作为ColorButton,并发展了不同的 版本的ColorButton()。

 

功能概述:

  • ColorButton1 -平的着色 按钮
  • ColorButton2 -用颜色填充颜色 梯度。颜色向右下角变深。
  • ColorButton3 -用颜色填充颜色 梯度。颜色越往中心越深。尊重image属性集 由用户
  • 增加淡入/淡出属性。 颜色向中心变浅(淡出)或变深(淡出)。
  • ColorButton5 -隐藏复制CodeColorButton4修改,以接受钢笔和画笔参数。hover-coloring所需。我 为MouseEnter和MouseLeave添加处理程序到颜色 鼠标悬停时的按钮不同。绘制一个焦点矩形时的按钮 有焦点。

使用按钮

在新项目中,转到工具箱,添加/删除项, 浏览并指向按钮的dll。在现有项目中,更改文本 Systems.Windows.Forms。按钮 AdvButton.RoundButton。

已知的问题

这些是已知的问题:

  • 它忽略了TextAlign属性
  • 它忽略了ImageAlign属性
  • 不给一个完美的3D外观,因此,属性 FlatStyle被忽略

其他的考虑

请注意,我们已处理:

  • Windows易访问性需求
  • 本地化的问题。将出现用从右到左的语言编写的文本 很好。

未来的改进

属性ImageAlign和

TextAlign 
目前忽略。图像当前绘制在中心和 文本坐标取决于属性TextStartPoint

 

参考文献

  • 圆形按钮- http://www.codeproject.com/buttonctrl/roundbuttons.asp, 由克里斯徘徊

本文转载于:http://www.diyabc.com/frontweb/news14651.html

posted @ 2020-08-12 02:49  Dincat  阅读(2408)  评论(0编辑  收藏  举报