ArcEngine+C# ——下拉框(ComboBox)颜色控件 (转)

介绍了如何创建自定义的单色和渐变色颜色选择下拉框(ComboBox)控件,适用于需要用户自定义颜色的场景,尤其适用于需要渐变颜色的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/lanpy88/article/details/5856295

这一篇介绍如何写一个单色和渐变色的颜色选择下拉框(ComboBox)控件。有些功能中,需要用户自定义选颜色时,一般只需调用ColorDialog颜色选择控件就可以了,但如果为了更贴近ArcGIS的操作风格,且需要使用渐变颜色时,ColorDialog可能就不能满足需求了。

熟悉ArcGIS操作的朋友可能记得,在图层、要素等的颜色设置时用到颜色下拉框选择颜色,其中就有选渐变颜色的下拉框,如下图。在某些二次开发项目中可能会遇到类似的颜色选择需求,希望这里的介绍对需要的朋友能起到一点帮助作用。

 

ArcEngine+C  TIN相关三维功能模块介绍(二)——下拉框(ComboBox)颜色控件  (转) - changqingnew - 永不言弃

TIN模型按高程选择渐变颜色

 

1.单色颜色下拉框

其思路就是往ComboBox中添加记录颜色值的项(Item),再根据该颜色值重绘ComboBox对应项的矩形区域,达到直接显示的效果。

具体步骤如下:

先在项目下添加一个新的UserControl控件,再拖一个ComboBox控件到UserControl上,将ComboBox的Dock属性设为Fill,再调整UserControl的大小,使其与刚好完全位于ComboBox下,最后关键的一步就是加入代码。下面贴上代码,具体的解释见代码注释,效果如下图:

ArcEngine+C  TIN相关三维功能模块介绍(二)——下拉框(ComboBox)颜色控件  (转) - changqingnew - 永不言弃

单一色效果

using System.Windows.Forms;

using System.Drawing;

using System;

namespace WindowsFormsApplication1

{

    /// <summary>

    /// 单一颜色选择控件类

    /// </summary>

    public partial class PureColorComboBox : UserControl

    {

        private Color _SelectedColor;

 

        /// <summary>

        /// 已选择颜色,封装字段

        /// </summary>

        public Color SelectedColor

        {

            get { return _SelectedColor; }

            set { _SelectedColor = value; }

        }

 

        /// <summary>

        /// Combobox颜色选择发生变化时激发的事件

        /// </summary>

        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"

        //};

 

        /// <summary>

        /// 构造函数

        /// </summary>

        public PureColorComboBox()

        {

            InitializeComponent();

            AddComponent();

        }

 

        /// <summary>

        /// 加载各颜色项(Items)

        /// </summary>

        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);

        }

 

        /// <summary>

        /// 在ComboBox选择项改变触发事件中激活颜色传递事件

        /// </summary>

        /// <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.渐变色的颜色下拉框

渐变的颜色下拉框的与单色下拉框的思路是一样的,只是着色方案和初始颜色设定稍微不同,这里只把的代码贴出来,注释较略,其他则可参照上传的具体实例,效果如下:

ArcEngine+C  TIN相关三维功能模块介绍(二)——下拉框(ComboBox)颜色控件  (转) - changqingnew - 永不言弃

渐变色颜色下拉框

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());

        } 

 

<think>嗯,用户这次的问题非常具体明确,是希望看到基于ArcEngine的条件分析功能界面设计的实际代码示例。从对话历史看,用户已经对GIS二次开发有基础了解,现在需要落实到VisualStudio环境下的具体实现。用户可能正在开发一个类似疫情分析系统的GIS应用,需要交互式条件查询功能。之前的讨论提到过湖北疫情系统案例[^3],这可能是用户的实际项目参考。用户特意强调“具体代码”,说明ta更关注可运行的代码片段而非理论讲解。从技术角度看,条件分析界面设计需要重点解决三个层次的问题:第一是界面控件的布局(如ToolbarControl+TOCControl+MapControl的基础框架),第二是业务逻辑控件的集成(如ConditionBuilder控件),第三是地图交互反馈机制(如高亮显示查询结果)。注意到用户多次引用文档[^2]中关于ArcEngine基础操作的内容,代码示例需要特别注意与ArcEngine对象模型的兼容性。例如使用IMapDocument接口加载地图文档,通过IFeatureLayerDefinition接口实现属性查询等核心功能。在安全性方面,示例代码中需要规避硬编码路径(如使用OpenFileDialog),同时考虑大数据量下的性能优化(如SpatialFilter的合理使用)。用户可能还需要后续实现结果导出功能,因此示例保留了exportToCSV方法作为扩展点。最后生成的代码需要保持结构完整但不过度复杂。我决定按功能模块拆分为初始化、条件构建、查询执行和结果显示四个部分,每段代码都包含必要的异常处理机制,这样用户可以根据实际需求灵活调整。</think> 基于ArcEngine的GIS条件分析界面设计需要结合地图控件、查询输入区和结果展示区。以下为使用C#在Visual Studio中实现的典型代码示例: ### 条件分析界面核心代码 ```csharp // MainForm.cs using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; public partial class MainForm : Form { private AxMapControl axMapControl; private AxToolbarControl axToolbar; private AxTOCControl axTocControl; private ConditionPanel conditionPanel; // 自定义条件输入面板 public MainForm() { // 1. 初始化地图控件 axMapControl = new AxMapControl(); axMapControl.Dock = DockStyle.Fill; Controls.Add(axMapControl); // 2. 添加工具栏 axToolbar = new AxToolbarControl(); axToolbar.Dock = DockStyle.Top; Controls.Add(axToolbar); axToolbar.SetBuddyControl(axMapControl); // 绑定地图控件[^2] // 3. 图层目录树 axTocControl = new AxTOCControl(); axTocControl.Dock = DockStyle.Left; axTocControl.SetBuddyControl(axMapControl); // 绑定地图控件 Controls.Add(axTocControl); // 4. 条件输入面板(右侧) conditionPanel = new ConditionPanel(); conditionPanel.Dock = DockStyle.Right; conditionPanel.Width = 300; conditionPanel.OnQueryClicked += ExecuteSpatialQuery; // 事件绑定 Controls.Add(conditionPanel); // 5. 加载地图文档 axMapControl.LoadMxFile(@"C:\Data\map.mxd"); } // 6. 空间查询执行方法 private void ExecuteSpatialQuery(object sender, QueryArgs e) { IFeatureLayer layer = axMapControl.get_Layer(0) as IFeatureLayer; IQueryFilter queryFilter = new QueryFilterClass(); // 构建SQL条件(示例:人口>1000且类型为住宅) queryFilter.WhereClause = $"POPULATION > {e.MinPopulation} AND TYPE='{e.BuildingType}'"; // 执行查询并高亮显示 IFeatureSelection selection = layer as IFeatureSelection; selection.SelectFeatures(queryFilter, ESRI.ArcGIS.Carto.esriSelectionResultEnum.esriSelectionResultNew, false); axMapControl.Refresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, null, null); } } ``` ```csharp // ConditionPanel.cs(自定义控件) public class ConditionPanel : UserControl { public event EventHandler<QueryArgs> OnQueryClicked; private NumericUpDown numPopulation; private ComboBox cmbType; private Button btnQuery; public ConditionPanel() { // 1. 人口阈值输入 numPopulation = new NumericUpDown() { Minimum = 0, Maximum = 100000 }; // 2. 建筑类型选择 cmbType = new ComboBox() { Items = { "住宅", "商业", "工业" } }; // 3. 查询按钮 btnQuery = new Button() { Text = "执行分析" }; btnQuery.Click += (s,e) => OnQueryClicked?.Invoke(this, new QueryArgs { MinPopulation = (int)numPopulation.Value, BuildingType = cmbType.SelectedItem.ToString() }); // 布局设置... } } public class QueryArgs : EventArgs { public int MinPopulation { get; set; } public string BuildingType { get; set; } } ``` ### 关键实现说明 1. **控件绑定机制** ```csharp axToolbar.SetBuddyControl(axMapControl); // 实现工具与地图交互[^2] axTocControl.SetBuddyControl(axMapControl); ``` 确保工具栏操作和图层目录树与地图控件联动 2. **动态查询构建** 通过`QueryFilter.WhereClause`动态生成SQL条件表达式,支持数值比较`>`和字符串匹配`=`操作[^1] 3. **选择结果可视化** ```csharp selection.SelectFeatures(...esriSelectionResultNew...); axMapControl.Refresh(esriViewGeography, null, null); ``` 使用要素高亮并刷新地理视图实现结果可视化[^1] 4. **扩展性设计** `ConditionPanel`封装查询参数收集逻辑,通过事件`OnQueryClicked`解耦界面与业务逻辑 --- ### 界面布局示例 ```mermaid graph TD A[主窗体] --> B[工具栏] A --> C[地图控件] A --> D[图层目录树] A --> E[条件分析面板] E --> F[人口阈值输入框] E --> G[建筑类型下拉框] E --> H[执行查询按钮] ``` --- ### 相关问题 1. **如何添加缓冲区分析控件到工具栏?** 通过`axToolbar.AddItem("esriControls.ControlsBufferTool")`添加内置工具[^2] 2. **查询结果如何导出为CSV?** 遍历`IFeatureSelection.SelectionSet`获取属性值并写入文件 3. **多图层联合查询怎样实现?** 使用`IQueryDef`接口的`SubFields`和`Tables`属性构建多表查询[^1] 4. **如何优化大数据量查询性能?** 结合`ISpatialFilter`空间过滤与属性条件,并添加`IQueryFilter.PostfixClause = "INDEXED"`使用空间索引[^1] 5. **条件面板如何实现动态字段加载?** 通过`IFeatureClass.Fields`获取图层字段列表绑定到下拉菜单: ```csharp foreach (IField field in featureClass.Fields) { cmbFields.Items.Add(field.Name); } ``` > 提示:实际开发中需处理线程阻塞问题,大数据查询应在后台线程执行[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值