利用ComboBox和SymbologyControl控件实现下拉式颜色带
转自:https://blog.csdn.net/u010520626/article/details/42804703
C#自带的ComboBox无法实现显示图片,需要对ComboBox控件进行重写,如下:
1、新建一个组件,继承ComboBox,并对部分方法进行重写

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace InversionTools { public class ComboBoxColorRamp : ComboBox { public ComboBoxColorRamp() { DrawMode = DrawMode.OwnerDrawFixed; DropDownStyle = ComboBoxStyle.DropDownList; } protected override void OnDrawItem(DrawItemEventArgs e) { e.DrawBackground(); e.DrawFocusRectangle(); try { //显示图片 Image image = (Image)Items[e.Index]; System.Drawing.Rectangle rect = e.Bounds; e.Graphics.DrawImage(image, rect); } catch { } finally { base.OnDrawItem(e); } } } }
2、新建一个用户自定义控件,添加步骤1中生成好的组件,并添加一个axSymbologyControl1,将axSymbologyControl1的可见性设为false;如图所示:
3、添加如下代码:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Controls; namespace InversionTools { public partial class ColorRampControl : UserControl { private IStyleGalleryItem pStyleGalleryItem = null;//用于获取颜色坡面 public ColorRampControl() { InitializeComponent(); } /// <summary> /// 加载颜色坡面 /// </summary> /// <param name="serverStyle">ServerStyle文件路径</param> public void LoadColorRamp(string serverStyle) { //在axSymbologyControl1中加载颜色坡面文件 this.axSymbologyControl1.LoadStyleFile(serverStyle); axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassColorRamps; //清理comboBox中的内容 comboBoxColorRamp1.Items.Clear(); //获取axSymbologyControl1中Item的数量 int itemCount = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps).get_ItemCount(Type.Missing); //添加样式到ComboBox IStyleGalleryItem pStyleGalleryItem = null; Image image; for (int i = 0; i < itemCount; i++) { pStyleGalleryItem = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps).GetItem(i); image = GetImageFromColorRamp(pStyleGalleryItem, comboBoxColorRamp1.Width, comboBoxColorRamp1.Height); comboBoxColorRamp1.Items.Add(image); } //初始化ComboBox选中项 comboBoxColorRamp1.SelectedIndex = 0; this.pStyleGalleryItem = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps).GetItem(0); currentColorRamp = (IColorRamp)this.pStyleGalleryItem.Item; } /// <summary> /// 将IStyleGalleryItem类型的ColorRamp转成图片 /// </summary> /// <param name="pStyleGalleryItem"></param> /// <param name="width"></param> /// <param name="height"></param> /// <returns></returns> private Image GetImageFromColorRamp(IStyleGalleryItem pStyleGalleryItem, int width, int height) { ISymbologyStyleClass symbologyStyleClass = axSymbologyControl1.GetStyleClass(axSymbologyControl1.StyleClass); stdole.IPictureDisp picture = symbologyStyleClass.PreviewItem(pStyleGalleryItem, width, height); System.Drawing.Image image = System.Drawing.Image.FromHbitmap(new System.IntPtr(picture.Handle)); return image; } private IColorRamp currentColorRamp; /// <summary> /// 获取 当前颜色色带,返回 一个IColorRamp类型值; /// </summary> public IColorRamp CurrentColorRamp { get { return currentColorRamp; } } private void comboBoxColorRamp1_SelectedIndexChanged(object sender, EventArgs e) { this.pStyleGalleryItem = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassColorRamps).GetItem(comboBoxColorRamp1.SelectedIndex); currentColorRamp = (IColorRamp)this.pStyleGalleryItem.Item;//注意后面的Item,否则无法QI } } }
4、生成用户自定义控件,在系统中添加该控件,调用方法
colorRampControl1为控件名字
1.加载样式文件
colorRampControl1.LoadColorRamp(@"C:\Program Files (x86)\ArcGIS\Engine10.2\Styles\ESRI.ServerStyle");
2.用于获取当前选中的ColorRamp;
ESRI.ArcGIS.Display.IColorRamp pColorRamp = colorRampControl1.CurrentColorRamp;
即可实现如图效果