C# 拓展ComboBox设置线条属性(转)
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设置线条属性(转)的更多相关文章
- ComboBox设置Text属性
WPF ComboBox 控件设置 Text属性时 必须将 IsEditable="true" 才能显示
- ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】
编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...
- C#中combobox 控件属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- canvas绘图详解笔记之线条及线条属性
创建 canvas 首先创建一个canvas元素,我们只需要在html文件中加入这么一句代码: <canvas id="canvas">当前浏览器不支持canvas,请 ...
- canvas设置线条样式
canvas设置线条样式 合法属性和方法 lineWidth = value 设置线宽 lineCap = type 设置线端点样式 lineJoin = type 设置线交合处样式 setLineD ...
- wpf ComboBox设置默认值
最新的wpf的ComboBox设置默认值得方法是,给VM中的数据集合第一个元素插入一个提示项目,比如:请选择一项,然后通过数据绑定可以实现默认选中第一项,下面我就贴一下示例代码: xaml页面: &l ...
- C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...
- matlab中set设置图形属性
来源:https://ww2.mathworks.cn/help/matlab/ref/set.html?searchHighlight=set&s_tid=doc_srchtitle set ...
- 通过设置CSS属性让DIV水平居中
通过设置CSS属性让DIV水平居中 ---------------------- <html> <head> <title></title> <m ...
随机推荐
- CCF-CSP 201709-3 JSON查询 题解
试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...
- APP自动化环境配置
做自动化很多人都不喜欢做app自动化,说实话,我也不喜欢做app自动化,但是没办法,老板给你钱,让你做,不得不做! 其实app自动化的难点就在于环境,环境OK了之后一切都和web自动化差不多,顶多就是 ...
- mysql常用配置注意项与sql优化
建立数据库: 建立数据库时编码字符集采用utf8 排序规则: 后缀"_cs"或者"_ci"意思是区分大小写和不区分大小写(Case Sensitive & ...
- 9-剑指offer: 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 代码 class Solution { public: int NumberOf1(int n) { if(n==0) re ...
- API数据加密框架monkey-api-encrypt
之前有写过一篇加密的文章<前后端API交互如何保证数据安全性>.主要是在Spring Boot中如何对接口的数据进行自动加解密操作,通过注解的方式来指定是否需要加解密. 原理也很简单,通过 ...
- 关于c语言的逻辑短路规则
原来的代码是 if (temp == 3 && (a % b != 0 || b == 0 )){ printf("go"); } dev-c 报错: progra ...
- oracle--AWR,ADDM,ASH区别
一,ASH (Active Session History) ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成. ...
- [转载]3.3 UiPath鼠标操作图像的介绍和使用
一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对图像的操作在UiPath中的使 ...
- 第22课 weak_ptr弱引用智能指针
一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...
- Shell脚本——添加和删除用户
写一个脚本admin_user.sh,其用法格式为: admin_user.sh --add USERLIST --del USERLIST -v|--verbose -h|--help 其中, -h ...