C# 拓展ComboBox设置线条属性
目前由于项目需要,要实现线条属性设置的功能,就如Visio中点击线端时,可以弹出一个窗口设置线条的各种属性。

其中线条属性选择时,是在ComboBox控件中,显示各种箭头或者颜色等,此时就需要拓展ComboBox组件了。

开始做这个程序时,我没有思路,在csdn上参考一位伙伴的程序,他主要是实现了颜色的设置。

废话不多说了,上图看看:

步骤一:新建Winform工程

先添加用户组件继承自ComboBox。

系统自动生成的代码:

 public partial class MyColorComboBox : ComboBox
{
public MyColorComboBox()
{
InitializeComponent();
InitItems();
} public MyColorComboBox(IContainer container)
{
container.Add(this);
InitializeComponent();
InitItems();
}
}

因为我们要显示箭头或者颜色,都是需要自己绘制图形的。

步骤二:设置自定义组件的一些属性

 private void InitItems()
{
this.DrawMode = DrawMode.OwnerDrawFixed;//手动绘制所有元素
this.DropDownStyle = ComboBoxStyle.DropDownList;//下拉框样式设置为不能编辑
this.Items.Clear();//清空原有项
}
 public enum LineType
{
TheStartOfLineWithArrow=,//起始点有箭头
TheEndOfLineWithArrow,//终止点有箭头
LineWithArrows,//线的两端带箭头
TheStartOfBoldLineWithArrow,//粗线起始点带箭头
TheEndOfBoldLineWithArrow,//粗线终止点带箭头
BoldLineWithArrows,//粗线两端带箭头
TheStartOfLineWithPoint,//起始点带圆点
TheEndOfLineWithPoint,//终止点带圆点
LineWithPoints,//线两端带圆点
MoreLineType//更多线型选项
}

步骤三:重写OnDrawItem方法

然后在OnDrawItem中写绘制线条的方法

这里主要是使用e.Graphics绘制图形了。

 protected override void OnDrawItem(DrawItemEventArgs e)
{
if (e.Index >= )//判断是否需要重绘
{
int typeId = int.Parse(this.Items[e.Index].ToString());//获取选项id Font font = new Font("宋体", );//定义字体
Rectangle rect = e.Bounds;
rect.Inflate(-, -);//缩放一定大小
Pen pen = null;
SolidBrush solidBrush = new SolidBrush(Color.Black); float offSet = rect.Height / ;
float x = rect.Width / ;
float y = rect.Top + offSet;//如果设置成e.ItemHeigh*e.Index +offSet,则在选中节点后,由于Item位置固定,因此Item不能显示出来。 switch (typeId)
{
case (int)LineType.TheStartOfLineWithArrow:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y - offSet));//绘制起始点带箭头的线
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y + offSet));
break;
case (int)LineType.TheEndOfLineWithArrow:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y - offSet));//绘制终端带箭头的线
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y + offSet));
break;
case (int)LineType.LineWithArrows:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y - offSet));//绘制两端带箭头的线
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y + offSet));
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y - offSet));
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y + offSet));
break;
case (int)LineType.TheStartOfBoldLineWithArrow:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y - offSet));//绘制起始端带箭头的粗线
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y + offSet));
break;
case (int)LineType.TheEndOfBoldLineWithArrow:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y - offSet));//绘制终端带箭头的粗线
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y + offSet));
break;
case (int)LineType.BoldLineWithArrows:
pen = new Pen(Color.Black, );
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y - offSet));
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF(x + offSet, y + offSet));
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y - offSet));
e.Graphics.DrawLine(pen, new PointF( * x, y), new PointF( * x - offSet, y + offSet));
break;
case (int)LineType.TheStartOfLineWithPoint:
pen = new Pen(Color.Black, );
e.Graphics.FillEllipse(solidBrush, new Rectangle(new Point((int)x - , (int)y - ), new Size(, )));//绘制起始端带圆的线
break;
case (int)LineType.TheEndOfLineWithPoint:
pen = new Pen(Color.Black, );
e.Graphics.FillEllipse(solidBrush, new Rectangle(new Point((int)( * x) - , (int)y - ), new Size(, )));//绘制终端带圆的线
break;
case (int)LineType.LineWithPoints:
pen = new Pen(Color.Black, );
e.Graphics.FillEllipse(solidBrush, new Rectangle(new Point((int)x - , (int)y - ), new Size(, )));//绘制两端都带圆的线
e.Graphics.FillEllipse(solidBrush, new Rectangle(new Point((int)( * x) - , (int)y - ), new Size(, )));
break;
case (int)LineType.MoreLineType:
e.Graphics.DrawString("更多线型选项...", font, solidBrush, new PointF(x - , y - offSet));
break;
default:
pen = new Pen(Color.Black, );
break;
}
if (e.Index < )
{
e.Graphics.DrawLine(pen, new PointF(x, y), new PointF( * x, y));//绘制线
Rectangle rectColor = new Rectangle(rect.Location, new Size( * (int)x, rect.Height));
e.Graphics.DrawRectangle(Pens.Black, rectColor);//绘制边框 }
}
}

这个坐标的设置可能麻烦了些,不过具体实现就是这样了。

步骤四:保存程序后,编译程序,可以在工具箱--指针栏看到MyLineComboBox这个自定义组件了。

然后在Form中添加它,再添加MyLineComboBox的Items(0,1,2,3,4,5,6,7,8,9)。

运行程序,可以效果了,当然这里还需要自己再拓展。

C# 拓展ComboBox设置线条属性(转)的更多相关文章

  1. ComboBox设置Text属性

    WPF  ComboBox 控件设置 Text属性时 必须将 IsEditable="true" 才能显示

  2. ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】

    编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...

  3. C#中combobox 控件属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  4. canvas绘图详解笔记之线条及线条属性

    创建 canvas 首先创建一个canvas元素,我们只需要在html文件中加入这么一句代码: <canvas id="canvas">当前浏览器不支持canvas,请 ...

  5. canvas设置线条样式

    canvas设置线条样式 合法属性和方法 lineWidth = value 设置线宽 lineCap = type 设置线端点样式 lineJoin = type 设置线交合处样式 setLineD ...

  6. wpf ComboBox设置默认值

    最新的wpf的ComboBox设置默认值得方法是,给VM中的数据集合第一个元素插入一个提示项目,比如:请选择一项,然后通过数据绑定可以实现默认选中第一项,下面我就贴一下示例代码: xaml页面: &l ...

  7. C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题

    解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...

  8. matlab中set设置图形属性

    来源:https://ww2.mathworks.cn/help/matlab/ref/set.html?searchHighlight=set&s_tid=doc_srchtitle set ...

  9. 通过设置CSS属性让DIV水平居中

    通过设置CSS属性让DIV水平居中 ---------------------- <html> <head> <title></title> <m ...

随机推荐

  1. 异常处理,常用字符串方法,selenium模块

    异常处理 什么是异常处理 (处理异常,报错error) print(1 / 0) # 报了0除错误 # 打印结果: Traceback (most recent call last): File &q ...

  2. 数据库-mysql01 简单介绍以及安装部署

    本次mysql数据库安装采用二进制安装(免安装即绿色版),数据库版本是mysql5.7.26 首先下载mysql安装包,然后上传服务器里,最后解压. 卸载centos7自带的数据库软件包: [root ...

  3. 201871010121 王方 《面向对象程序设计(Java)》第6-7周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  4. Centos7 安装mysql-8.0.18(rpm)

    1.前言 当前MySQL最新版本:8.0.18 (听说比5.7快2倍)官方之前表示:MySQL 8.0 正式版 8.0.18 已发布,MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量 ...

  5. Java8——Stream

    /* * 一.Stream API 的操作步骤: * * 1. 创建 Stream * * 2. 中间操作 * * 3. 终止操作(终端操作) */ public class TestStreamaA ...

  6. JDOJ 1139 水仙花数

    JDOJ 1139: 水仙花数 https://neooj.com/oldoj/problem.php?id=1139 Description 打印出所有"水仙花数",所谓&quo ...

  7. Push to origin/master was rejected

    在IDEA中往码云上传项目的时候出现了如下的错误:Push to origin/master was rejected 因为我是把代码上传到一个新的仓库里面,所以第一次提交的时候和仓库里面的东西不同步 ...

  8. Mysql 时间和日期函数

    参考文章 1 时间函数 当前日期和时间 select now(); 2 得到昨天的日期 CURDATE() 当前日期 select CURDATE()-1; -- curdate 3 添加时间间隔 当 ...

  9. <Tree> 110 124

    110. Balanced Binary Tree 方法是如果我们发现子树不平衡,则不计算具体的深度,而是直接返回-1.那么优化后的方法为:对于每一个节点,我们通过checkDepth方法递归获得左右 ...

  10. 洛谷p3385【模板】负环

    最近很久没怎么写最短路的题导致这个题交了好多遍 AC率是怎么下来的自己心里没点数 SPFA虽然臭名昭著但是他可以用来判负环 如果一个点进队的次数大于等于n说明存在负环 这道题一开始memset我给di ...