利用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);
            }

        }
    }
}
对ComboBox控件进行重写

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;

即可实现如图效果

 

posted @ 2018-08-27 22:27  ParanoiaApe  阅读(636)  评论(0)    收藏  举报