图片文字的控件ImageTextControl
来源:互联网 发布:配电网优化运行 编辑:程序博客网 时间:2024/05/01 10:45
/// <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 }
0 0
- 图片文字的控件ImageTextControl
- 图片加文字的自定义控件
- 自定义图片、文字组合控件
- Android控件之Button图片文字的混排
- (按钮)上面为图片下部为文字的 按钮 控件
- 图片,文字等控件的上下抖动或左右晃动
- 图片,文字等控件的上下抖动或左右晃动
- MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)
- 使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- 使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
- 图片+文字的JList
- 图片+文字的JList
- 自定义组合控件套路(文字+图片+背景)
- android自定义控件Button 带图片文字
- Android自定义控件图片+文字布局
- ios中控制器之间的反向传值之二---代理传值
- eclipse如何生成exe程序
- Java语言基础
- assert.h使用介绍
- Java调用Domino LDAP
- 图片文字的控件ImageTextControl
- C语言编译错误 fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory
- DeviceUuidFactory
- Matrix Factorization, Algorithms, Applications, and Avaliable packages
- 利用OpenCV + PyQt4操作摄像头的demo
- 微信NATIVE动态支付(V3版本)
- Problem - 501B - Codeforces(string+map)
- gnuplot 拟合 fit函数的用法
- 6、文件的路径问题、错误的处理