图片文字的控件ImageTextControl

    /// <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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值