/// <summary>
/// 图片文字控件
/// </summary>
public sealed partial class ImageTextControl : Control
{
/// <summary>
/// 需要显示的文字
/// </summary>
private string _text = string.Empty;
/// <summary>
/// 原始中间需展现的图片
/// </summary>
private Image _img = null;
/// <summary>
/// 图片高度
/// </summary>
private float imgheight = 0;
/// <summary>
/// 图片宽度
/// </summary>
private float imgwidth = 0;
/// <summary>
/// 文字高度
/// </summary>
private float textheight = 0;
/// <summary>
/// 文字宽度
/// </summary>
private float textwidth = 0;
/// <summary>
/// 间隙,边框与图片(文字)的间距
/// </summary>
private int boundaryWidth = 10;
/// <summary>
/// 自动宽度
/// </summary>
private bool _automaticWidth = false;
/// <summary>
/// 字段高度
/// </summary>
private bool _automaticHeight = false;
/// <summary>
/// 数据源的类型
/// </summary>
private DataSourceCategory mCategory;
/// <summary>
/// 菜单数据项
/// </summary>
private MenuModel menuModel;
/// <summary>
/// 是否被按下
/// </summary>
private bool isPressed = false;
/// <summary>
/// 按下时的背景图片
/// </summary>
private Image pressedbackgroundImage = null;
/// <summary>
/// 原始的背景图片
/// </summary>
private Image originalImage = null;
/// <summary>
/// 原始的文字颜色
/// </summary>
private Color foreColor = Color.FromKnownColor(KnownColor.ControlText);
/// <summary>
/// 按下时的文字颜色
/// </summary>
private Color pressColor = Color.FromKnownColor(KnownColor.ControlText);
/// <summary>
/// 原始的背景颜色
/// </summary>
private Color backColor = Color.FromKnownColor(KnownColor.Control);
/// <summary>
/// 按下时的背景颜色
/// </summary>
private Color pressBackColor = Color.FromKnownColor(KnownColor.Control);
/// <summary>
/// 按下时中间的图片
/// </summary>
private Image pressCenterImage = null;
/// <summary>
/// 是否可用
/// </summary>
private bool isEnable = true;
/// <summary>
/// 单击事件
/// </summary>
private event ImageTextControlEventHandler imageTextControlClick;
/// <summary>
/// 需要绘制的图片
/// </summary>
private Image writeImage = null;
/// <summary>
/// 需要绘制的文字的颜色.默认值=ControlText
/// </summary>
private Color writecolor = Color.FromKnownColor(KnownColor.ControlText);
/// <summary>
/// 是否显示右侧显示三角形
/// </summary>
private bool isShowTriangle = true;
public ImageTextControl()
{
InitializeComponent();
}
/// <summary>
/// 按下时需要切换的图片
/// </summary>
[Category("控件自定义项")]
[Description("按下时需要切换的图片")]
public Image PressedBackgroundImage
{
get { return this.pressedbackgroundImage; }
set
{
this.pressedbackgroundImage = value;
}
}
/// <summary>
/// 数据源的类型
/// </summary>
[DefaultValue("Default")]
[Category("控件自定义项")]
[Description("数据源的类型")]
public DataSourceCategory Category
{
get { return this.mCategory; }
set { this.mCategory = value; }
}
/// <summary>
/// 与控件关联的文本
/// </summary>
[Category("控件自定义项")]
[Description("与控件关联的文本")]
public override string Text
{
get
{
return _text;
}
set
{
_text = value;
SizeF f = base.CreateGraphics().MeasureString(value, base.Font);
textheight = f.Height;
textwidth = f.Width;
Invalidate();
}
}
[Category("控件自定义项")]
[Description("显示的文字颜色")]
public override Color ForeColor
{
get
{
return this.foreColor;
}
set
{
foreColor = value;
Invalidate();
}
}
[Category("控件自定义项")]
[Description("按下时显示的文字颜色")]
public Color PressedColor
{
get { return this.pressColor; }
set { this.pressColor = value; }
}
/// <summary>
/// 显示的图片
/// </summary>
[Category("控件自定义项")]
[Description("显示的图片")]
public Image CenterImage
{
get { return this._img; }
set
{
this._img = value;
imgheight = value == null ? 0 : value.Height;
imgwidth = value == null ? 0 : value.Width;
Invalidate();
}
}
/// <summary>
/// 按下时需切换的图片
/// </summary>
[Category("控件自定义项")]
[Description("按下时需切换的图片")]
public Image PressedCenterImage
{
get { return this.pressCenterImage; }
set
{
this.pressCenterImage = value;
}
}
/// <summary>
/// 间隙,边框与图片(文字)的间距
/// </summary>
[Category("控件自定义项")]
[Description("间隙,边框与图片(文字)的间距")]
[DefaultValue(10)]
public int BoundaryWidth
{
get { return this.boundaryWidth; }
set
{
this.boundaryWidth = value;
Invalidate();
}
}
/// <summary>
/// 自动宽度
/// </summary>
[Category("控件自定义项")]
[DefaultValue(false)]
[Description("自动宽度")]
public bool AutomaticWidth
{
get { return this._automaticWidth; }
set
{
this._automaticWidth = value;
Invalidate();
}
}
/// <summary>
/// 自动高度
/// </summary>
[Category("控件自定义项")]
[DefaultValue(false)]
[Description("自动高度")]
public bool AutomaticHeight
{
get { return this._automaticHeight; }
set
{
this._automaticHeight = value;
Invalidate();
}
}
/// <summary>
/// 菜单数据项
/// </summary>
[Browsable(false)]
public MenuModel MenuModel
{
get { return this.menuModel; }
set { this.menuModel = value; }
}
/// <summary>
/// 背景图片
/// </summary>
[Category("控件自定义项")]
[Description("背景图片")]
public sealed override Image BackgroundImage
{
get
{
return originalImage;
}
set
{
originalImage = value;
Invalidate();
}
}
/// <summary>
/// 背景图片
/// </summary>
[Category("控件自定义项")]
[Description("背景颜色")]
public sealed override Color BackColor
{
get
{
return backColor;
}
set
{
backColor = value;
Invalidate();
}
}
/// <summary>
/// 按下时背景颜色
/// </summary>
[Category("控件自定义项")]
[Description("按下时背景颜色")]
public Color PressBackColor
{
get { return this.pressBackColor; }
set
{
this.pressBackColor = value;
}
}
/// <summary>
/// 是否显示右侧显示三角形
/// </summary>
[Category("控件自定义项")]
[Description("是否显示右侧显示三角形")]
[DefaultValue(true)]
public bool IsShowTriangle
{
get { return this.isShowTriangle; }
set { this.isShowTriangle = value; }
}
/// <summary>
/// 背景图片的处理方式,此控件不使用
/// </summary>
[Browsable(false)]
public sealed override ImageLayout BackgroundImageLayout
{
get
{
return base.BackgroundImageLayout;
}
set
{
base.BackgroundImageLayout = ImageLayout.Zoom;
}
}
/// <summary>
/// 控件单击事件
/// </summary>
public event ImageTextControlEventHandler ImageTextControlClick
{
add
{
imageTextControlClick += value;
}
remove
{
imageTextControlClick -= value;
}
}
/// <summary>
/// 重新绘制背景
/// </summary>
/// <param name="pevent"></param>
protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
//当控件的Parent不为空的时候,取Parent的背景颜色绘制
if (this.Parent != null)
pevent.Graphics.FillRectangle(new SolidBrush(Parent.BackColor), 0, 0, this.Width, this.Height);
pevent.Graphics.SmoothingMode = SmoothingMode.HighQuality;
if (isPressed)
{
//被按下的状态,判断如果有背景图片则以背景图片处理,没有则判断背景颜色
if (pressedbackgroundImage != null)
pevent.Graphics.DrawImage(pressedbackgroundImage, 0, 0, this.Width, this.Height);
else
{
if (pressBackColor != Color.FromKnownColor(KnownColor.Control))
{
//pressBackColor还是为Control的默认值的时候不进行处理
//填充按下时的背景颜色pressBackColor
pevent.Graphics.FillRectangle(new SolidBrush(pressBackColor), 0, 0, this.Width, this.Height);
if (isShowTriangle)
{
//判断在右边中间位置画出三角形
Point[] curvePoints = { new Point(base.Width - 6, base.Height / 2), new Point(Width, (Height / 2) - 6), new Point(Width, (Height / 2) + 6) };
//填充多边形
pevent.Graphics.FillPolygon(new SolidBrush(Parent.BackColor), curvePoints);
}
}
}
}
else
{
//不被按下的情况
if (originalImage != null)
//绘制原始的背景的图片
pevent.Graphics.DrawImage(originalImage, 0, 0, this.Width, this.Height);
else
{
//处理背景颜色
if (backColor != Color.FromKnownColor(KnownColor.Control))
pevent.Graphics.FillRectangle(new SolidBrush(backColor), 0, 0, this.Width, this.Height);
}
}
}
/// <summary>
/// 禁用与启用的改变事件
/// </summary>
/// <param name="e"></param>
protected sealed override void OnEnabledChanged(EventArgs e)
{
base.OnEnabledChanged(e);
//当禁用启用改变时触发控件重新刷新,已恢复或执行图片的灰度处理
this.isEnable = base.Enabled;
Invalidate();
}
/// <summary>
/// 触发事件的方法
/// </summary>
/// <param name="e">图片文字控件单击的事件数据类</param>
private void OnImageTextControlClick(ImageTextControlEventArgs e)
{
//如果控件被禁用,则取消单击事件执行
if (!isEnable)
return;
//触发事件
if (imageTextControlClick != null)
imageTextControlClick(this, e);
//如果后续有操作固化在此处可以进行将事件继承CancelEventArgs
}
/// <summary>
///控件重绘的方法重写
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//呈现质量
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
//控件被按下时取值pressCenterImage,否则取_img
writeImage = !isPressed ? _img : pressCenterImage;
//writeImage为按下时,若不传入pressCenterImage,则取值_img
if (writeImage == null)
writeImage = _img;
//writeImage不为空的时候
if (writeImage != null)
{
if (isEnable)
//可用状态下绘制图片
e.Graphics.DrawImage(writeImage, new PointF((base.Width - writeImage.Width) / 2, 15));
else
//不可用的状态下将图片设置成灰度图
ControlPaint.DrawImageDisabled(e.Graphics, writeImage, (base.Width - writeImage.Width) / 2, 15, Color.FromArgb(20, Color.Gray));
}
//文字的颜色 控件被按下时取值pressColor,否则取foreColor
writecolor = !isPressed ? foreColor : pressColor;
//绘制文字
e.Graphics.DrawString(_text, base.Font, new SolidBrush(writecolor), new PointF((base.Width - textwidth) / 2,imgheight + 15));
if (_automaticHeight)
//调整自动高度
base.Height = (int)(30 + imgheight + textheight);
if (_automaticWidth)
//调整自动宽度
base.Width = (int)(textwidth > imgwidth ? textwidth : imgwidth + boundaryWidth * 2);
}
/// <summary>
/// 控件单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ImageTextControl_Click(object sender, EventArgs e)
{
//将按下设置成true并且触发控件刷新
isPressed = true;
Invalidate();
//调用OnImageTextControlClick触发点击事件
ImageTextControlEventArgs eArgs = new ImageTextControlEventArgs();
eArgs.ControlName = this.Name;
eArgs.Item = menuModel;
OnImageTextControlClick(eArgs);
if (this.Parent == null)
return;
if (this.Parent is XtraScrollableControlEx)
{
//获取该控件的parent下所有的子控件
ImageTextControlCollection Collection = this.Parent.Controls as ImageTextControlCollection;
if (Collection != null && Collection.Count > 0)
{
//设定列表选中项为单击的控件
Collection.SelectControl = this;
//将除了该单击的控件项排除,其他的复原
foreach (Control n in Collection)
if (n is ImageTextControl)
{
if (!n.Equals(this))
(n as ImageTextControl).Reset();
}
}
}
}
/// <summary>
/// 重写比较方法,如果Text相同则返回True
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public sealed override bool Equals(object obj)
{
if (obj == null)
return false;
ImageTextControl p = obj as ImageTextControl;
if (p == null)
return false;
if (string.IsNullOrEmpty(this.Text))
return false;
return p.Text.Equals(this.Text);
}
/// <summary>
/// 重写GetHashCode方法
/// </summary>
/// <returns></returns>
public sealed override int GetHashCode()
{
return this.Text.GetHashCode();
}
/// <summary>
/// 密封掉单击事件
/// </summary>
/// <param name="e"></param>
protected sealed override void OnClick(EventArgs e)
{
base.OnClick(e);
}
/// <summary>
/// 还原到原始状态
/// </summary>
public void Reset()
{
//调用控件重写刷新
isPressed = false;
Invalidate();
}
}
/// <summary>
/// ImageTextControl控件的容器类
/// </summary>
public partial class XtraScrollableControlEx : XtraScrollableControl
{
private ImageTextControlCollection mlist = null;
/// <summary>
/// ImageTextControl控件的容器类
/// </summary>
public XtraScrollableControlEx()
{
InitializeComponent();
}
/// <summary>
/// 重构方法,以能返回ImageTextControlCollection,实现列表切换时能触发SelectChange事件
/// </summary>
/// <returns></returns>
protected override Control.ControlCollection CreateControlsInstance()
{
if (mlist == null)
mlist = new ImageTextControlCollection(this);
return mlist;
}
}
/// <summary>
/// ImageTextControl集合类
/// </summary>
public partial class ImageTextControlCollection : System.Windows.Forms.Control.ControlCollection
{
//选定项的Index
private int selectindex = -1;
/// <summary>
/// 获取或设置选中控件
/// </summary>
internal ImageTextControl SelectControl
{
get
{
if (selectindex != -1 && selectindex < Count)
return base[selectindex] as ImageTextControl;
return null;
}
set
{
if (value != null)
{
//查找index位置
int index = base.IndexOf(value);
if (index != -1 && selectindex != index)
{
//两者不相等的是进行事件触发
ImageTextControl pervious = selectindex == -1 ? null : base[selectindex] as ImageTextControl;
selectindex = index;
ImageTextControl current = value;
OnImageTextControlChange(new ImageTextControlCollectionEventArgs(pervious, current));
}
}
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="owner">Parent控件</param>
public ImageTextControlCollection(Control owner)
: base(owner)
{
}
/// <summary>
/// 选择项切换的事件
/// </summary>
private event ImageTextControlSelectChangeEventHandler imageTextControlCollectionEventHandler;
/// <summary>
/// 选择项切换的事件
/// </summary>
public event ImageTextControlSelectChangeEventHandler SeclectControlChange
{
add
{
imageTextControlCollectionEventHandler += value;
}
remove
{
imageTextControlCollectionEventHandler -= value;
}
}
/// <summary>
/// 事件触发
/// </summary>
/// <param name="e"></param>
public virtual void OnImageTextControlChange(ImageTextControlCollectionEventArgs e)
{
if (imageTextControlCollectionEventHandler != null)
imageTextControlCollectionEventHandler(this, e);
}
}
/// <summary>
/// 列表切换的事件数据类
/// </summary>
public class ImageTextControlCollectionEventArgs : EventArgs
{
/// <summary>
/// 前一个单击的控件
/// </summary>
private ImageTextControl previousControl;
/// <summary>
/// 当前单击的控件
/// </summary>
private ImageTextControl currentControl;
public ImageTextControlCollectionEventArgs()
{
}
public ImageTextControlCollectionEventArgs(ImageTextControl previousControl, ImageTextControl currentControl)
{
this.currentControl = currentControl;
this.previousControl = previousControl;
}
/// <summary>
/// 前一个单击的控件
/// </summary>
public ImageTextControl PreviousControl
{
get { return this.previousControl; }
set { this.previousControl = value; }
}
/// <summary>
/// 当前单击的控件
/// </summary>
public ImageTextControl CurrentControl
{
get { return this.currentControl; }
set { this.currentControl = value; }
}
}
/// <summary>
/// 图片文字控件单击的事件数据类
/// </summary>
public class ImageTextControlEventArgs : EventArgs
{
/// <summary>
/// 菜单项数据
/// </summary>
private MenuModel item;
//控件名称
private string controlName;
/// <summary>
/// 图片文字控件单击的事件数据类
/// </summary>
public ImageTextControlEventArgs() { }
/// <summary>
/// 控件名称
/// </summary>
public string ControlName
{
get { return this.controlName; }
set { this.controlName = value; }
}
/// <summary>
/// 菜单项数据
/// </summary>
public MenuModel Item
{
get { return this.item; }
set { this.item = value; }
}
}
/// <summary>
/// 事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void ImageTextControlEventHandler(object sender, ImageTextControlEventArgs e);
public delegate void ImageTextControlSelectChangeEventHandler(object sender, ImageTextControlCollectionEventArgs e);
<pre name="code" class="csharp"> public class MenuModel
{
public List<MenuModel> SubModel { get; set; }
/// <summary>
/// 功能节点名
/// </summary>
public string FunctionName { get; set; }
/// <summary>
/// 功能节点显示名称
/// </summary>
public string FunctionDispayName { get; set; }
/// <summary>
/// 功能节点编号
/// </summary>
public int FunctionId { get; set; }
/// <summary>
/// 上级节点编号
/// </summary>
public int ParentFunctionId { get; set; }
/// <summary>
/// 功能编号
/// </summary>
public string ProgId { get; set; }
/// <summary>
/// 功能类型
/// </summary>
public LibDL.Comm.Models.MenuStyle Style { get; set; }
public RegionType Region { get; set; }
/// <summary>
/// 所属区域
/// </summary>
public Point Location { get; set; }
/// <summary>
/// 是否有使用权限
/// </summary>
public bool Usable { get; set; }
/// <summary>
/// 版本号
/// </summary>
public string Version { get; set; }
}
public enum RegionType
{
Busi,
BaseDoc,
Report
}