ArcEngine+C# TIN 相关三维功能模块介绍 ( 二 ) 下拉框 (ComboBox) 颜色控件 作者 : 刘志远 Email:592418843@qq.com
这一篇介绍如何写一个单色和渐变色的颜色选择下拉框 (ComboBox) 控件 有些功能中, 需要用户自定义选颜色时, 一般只需调用 ColorDialog 颜色选择控件就可以了, 但如果为了更贴近 ArcGIS 的操作风格, 且需要使用渐变颜色时,ColorDialog 可能就不能满足需求了 熟悉 ArcGIS 操作的朋友可能记得, 在图层 要素等的颜色设置时用到颜色下拉框选择颜色, 其中就有选渐变颜色的下拉框, 如下图 在某些二次开发项目中可能会遇到类似的颜色选择需求, 希望这里的介绍对需要的朋友能起到一点帮助作用 TIN 模型按高程选择渐变颜色 1. 单色颜色下拉框 其思路就是往 ComboBox 中添加记录颜色值的项 (Item), 再根据该颜色值重绘 ComboBox 对应项的矩形区域, 达到直接显示的效果 具体步骤如下 : 先在项目下添加一个新的 UserControl 控件, 再拖一个 ComboBox 控件到 UserControl 上, 将 ComboBox 的 Dock 属性设为 Fill, 再调整 UserControl 的大小, 使其与刚好完全位于 ComboBox 下, 最后关键的一步就是加入代码 下面贴上代码, 具体的解释见代码注释, 效
果如下图 : 单一色效果 using System.Windows.Forms; using System.Drawing; using System; namespace WindowsFormsApplication1 /// 单一颜色选择控件类 public partial class PureColorComboBox : UserControl private Color _SelectedColor; /// 已选择颜色, 封装字段 public Color SelectedColor get return _SelectedColor; set _SelectedColor = value; /// Combobox 颜色选择发生变化时激发的事件 public event EventHandler SelectColorChanged; // 自定义的初始颜色值, 有必要时可以指定一些特定的颜色 //private static string[] colorlist =
// // "AliceBlue","AntiqueWhite","Aqua","Aquamarine","Azure","Beige", // "Bisque","Black","BlanchedAlmond","Blue","BlueViolet","Brown", // "BurlyWood","CadetBlue","Chartreuse","Chocolate","Coral", // "CornflowerBlue","Cornsilk","Crimson","Cyan","DarkBlue","DarkCyan", // "DarkGoldenrod","DarkGray","DarkGreen","DarkKhaki","DarkMagenta", // "DarkOliveGreen","DarkOrange","DarkOrchid" //; /// 构造函数 public PureColorComboBox() InitializeComponent(); AddComponent(); /// 加载各颜色项 (Items) private void AddComponent() this.combobox1.drawmode = DrawMode.OwnerDrawFixed; this.combobox1.dropdownstyle = ComboBoxStyle.DropDownList; // 设定 ComboBox 的高度 this.combobox1.itemheight = 18; this.combobox1.beginupdate(); this.combobox1.items.clear(); // 如要使用自定义颜色初始值时则使用这段代码 //foreach (string onecolor in colorlist) // // this.combobox1.items.add(onecolor); // // 加载系统所有的颜色, 如果使用自定义颜色初始值时则注销下面的代码 Array colors = System.Enum.GetValues(typeof(KnownColor)); for (int i = colors.getlength(0) - 1; i >= 0; i--) this.combobox1.items.add(colors.getvalue(i).tostring());
this.combobox1.endupdate(); // 在 ComboBox 的 DrawItem 事件 ( 绘制事件 ) 中绘制颜色矩形框, 每次添加 Item 时都会触发该事件 // 该函数由在 ComboBox 的属性标签的事件栏下双击 DrawItem 自动生成 // 当然, 也可以自己在前面添加 //this.combobox1.drawitem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem); private void combobox1_drawitem(object sender, DrawItemEventArgs e) if (e.index < 0) return; Rectangle rect = e.bounds; // 获取 Item 矩形框 // 获取对应项记录的颜色值 string colorname = combobox1.items[e.index].tostring(); // 新建单一色刷子, 颜色为对应项记录的值 SolidBrush brush = new SolidBrush(Color.FromName(colorName)); _SelectedColor = brush.color; // 为美观, 可缩小选定项区域 1 个像素 rect.inflate(-1, -1); // 填充颜色 e.graphics.fillrectangle(brush, rect); // 用黑色绘制颜色边框 e.graphics.drawrectangle(pens.black, rect); /// 在 ComboBox 选择项改变触发事件中激活颜色传递事件 /// <param name="sender"></param> /// <param name="e"></param> private void combobox1_selectedindexchanged(object sender, EventArgs e) // 如果使用该控件的窗体注册了 SelectColorChanged 事件, 则激活 // 相当于用 SelectColorChanged 事件替换了 ConboBox 的 SelectedIndexChanged 事件 if (SelectColorChanged!= null) SelectColorChanged(this, e);
最后, 将该颜色控件像使用其他控件一样拖入需要的窗体中, 在该控件的 SelectColorChanged 事件下, 通过控件的 SelectedColor 属性获得选择的颜色值 : // 下拉框所选颜色值发生改变时触发的事件 private void colorcombobox1_selectcolorchanged(object sender, EventArgs e) // 通过 ComboBox 的 SelectedColor 公共字段获取当前选中的值 MessageBox.Show(" 当前选中的颜色为 : "+this.colorcombobox1.selectedcolor.tostring()); 2. 渐变色的颜色下拉框 渐变的颜色下拉框的与单色下拉框的思路是一样的, 只是着色方案和初始颜色设定稍微不同, 这里只把的代码贴出来, 注释较略, 其他则可参照上传的具体实例, 效果如下 : 渐变色的颜色下拉框 using System.Windows.Forms; using System.Drawing; using System; using System.Drawing.Drawing2D; namespace WindowsFormsApplication1 public partial class GradientColorComboBox : UserControl private Color _FromColor; private Color _ToColor; public Color FromColor get return _FromColor;
set _FromColor = value; public Color ToColor get return _ToColor; set _ToColor = value; public event EventHandler SelectColorChanged; // 预定义的渐变色 private static string[] colorlist = "AliceBlue AntiqueWhite","Aqua Aquamarine","Azure Beige", "Bisque Black","BlanchedAlmond Blue","BlueViolet Brown", "BurlyWood CadetBlue","Chartreuse Chocolate", "CornflowerBlue Cornsilk","Crimson Cyan","DarkBlue DarkCyan", "DarkGoldenrod DarkGray","DarkGreen DarkKhaki", "DarkMagenta DarkOliveGreen","DarkOrange DarkOrchid" ; public GradientColorComboBox() InitializeComponent(); PersonalizeComponent(); private void PersonalizeComponent() this.combobox1.drawmode = DrawMode.OwnerDrawFixed; this.combobox1.dropdownstyle = ComboBoxStyle.DropDownList; this.combobox1.itemheight = 18; this.combobox1.beginupdate(); this.combobox1.items.clear(); foreach (string onecolor in colorlist) this.combobox1.items.add(onecolor); this.combobox1.endupdate(); private void combobox1_drawitem(object sender, DrawItemEventArgs e)
if (e.index < 0) return; Rectangle rect = e.bounds; // 读取起始 终止颜色值 string fcolorname = combobox1.items[e.index].tostring().split(' ')[0]; string tcolorname = combobox1.items[e.index].tostring().split(' ')[1]; _FromColor = Color.FromName(fColorName); _ToColor = Color.FromName(tColorName); // 选择线性渐变刷子 LinearGradientBrush brush = new LinearGradientBrush(rect, _FromColor, _ToColor, 0, false); rect.inflate(-1, -1); // 填充颜色 e.graphics.fillrectangle(brush, rect); // 绘制边框 e.graphics.drawrectangle(pens.black, rect); private void combobox1_selectedindexchanged(object sender, EventArgs e) if (SelectColorChanged!= null) SelectColorChanged(this, e); 同样, 将该渐变色控件拖入需要使用窗体中, 在该控件的 SelectColorChanged 事件下, 通过控件的 FromColor 和 ToColor 属性获得选择的渐变色值 : private void gradientcolorcombobox1_selectcolorchanged(object sender, EventArgs e) MessageBox.Show(" 当前选中的颜色为 : " + this.gradientcolorcombobox1.fromcolor.tostring() + this.gradientcolorcombobox1.tocolor.tostring()); 3. 下一篇简介 下一篇打算介绍如何写一个带复选框及颜色图标的 TreeView 控件, 该控件与 TIN 模型
分级设色方案中的各层颜色相关联, 通过该 TreeView 控件复选框的勾选状态决定 TIN 模型 对应颜色层的显示与隐藏, 同时, 结合本篇的颜色控件, 双击 TreeView 中的颜色图标, 实 时改变 TIN 模型中对应分级的颜色