(转载请注明出处)
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>