图片文字的控件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