利用ComboBox和SymbologyControl控件实现下拉式颜色带

(转载请注明出处)

C#自带的ComboBox无法实现显示图片,需要对ComboBox控件进行重写,如下:

1、新建一个类,继承ComboBox,并对部分方法进行重写

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace ComboBoxColorRamp
{
    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);
            }
        }
    }
}</span>
生成一个控件类库。

2、新建一个用户自定义控件,添加步骤1中生成的控件,并添加一个axSymbologyControl1,将axSymbologyControl1的可见性设为false;如图所示:



3、添加如下代码:

<span style="font-size:18px;">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 ColorRampControl
{
    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
        }

    }
}</span>

4、生成用户自定义控件,在系统中添加该控件,调用方法

LoadColorRamp()//该方法在步骤3中

即可实现如图效果:



<span style="font-size:18px;">CurrentColorRamp()//用于获取当前选中的ColorRamp;</span>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值