⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 customrenderer.cs

📁 章立民-visual stadio 2005 c#编程技巧
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Collections;
using System.Drawing.Drawing2D;

namespace CH9
{
    [DefaultProperty("Color1")]
    class CustomRenderer : ToolStripRenderer
    {
        #region "变量宣告"
        // 用来储存我们所要描绘的工具列系列控件。
        private ArrayList m_toolstrips;

        // 用来储存我们所要描绘的 ToolStripPanel 控件。
        private ArrayList m_ToolStripPanels;

        // 用来储存我们所要描绘的 ToolStripItem 控件与衍生型别。
        // 这仅仅是用来储存拥有它们自己之描绘设定的项目,m_toolStrips 中之
        // ToolStrip、thisnuStrip 与 StatusStrip 所内含的 ToolStripItem 控件
        // 不需要分开储存。
        private ArrayList m_toolstripitems;

        // 我们使用此定时器对象来判断何时该重新描绘并更新背景的外观。
        private Timer m_timer = new Timer();

        // 此用于 DrawToolbarBorder 属性 -- 控制是否要在工具列系列控件的周围绘制一个单线框。
        private bool m_drawToolbarBorder;

        // 此用于 Color1 属性 -- 这是渐层色的起始色彩。
        private Color m_color1;

        /// <summary>
        ///   此用于 Color2 属性 -- 这是渐层色的结束色彩。  
        /// </summary>
        /// 
        private Color m_color2;

        ///
        ///  <summary>    
        /// 这是渐层色描绘之左边界与右边界的实际色彩。每秒钟就会变更几次,由于
        /// 我们不想破坏 Color1 值,因此我们另存于此。
        /// </summary>
        /// 
        private Color m_currentc1;

        ///
        ///  <summary>    
        ///   这是渐层色描绘之右边界与下边界的实际色彩。每秒钟就会变更几次,由于
        ///   我们不想破坏 Color1 值,因此我们另存于此。
        /// </summary>
        /// 
        private Color m_currentc2;

        ///
        /// <summary>
        ///   这是用来绘制项目边界的色彩。    
        /// </summary>
        /// 
        private Color m_itemBorderColor;

        /// 
        /// <summary>
        ///   这是用来绘制箭号的色彩。
        /// </summary>
        /// 
        private Color m_arrowColor;

        /// 
        /// <summary>
        /// 当我们取得前两个色彩(Color1 与 Color2),我们会计算它们个别色彩组件之间的增量,
        /// 并且使用该增量来。
        /// </summary>
        /// 
        private short m_rinc;

        private short m_ginc;

        private short m_binc;

        private const short NUM_INCREthisNTS = 30;

        private int m_currentTick;

        private bool m_positiveDirection;

        private const int TIthisR_SPEED_MS = 250;
        #endregion

        public CustomRenderer()
            : base()
        {
            this.m_color1 = SystemColors.ActiveCaption;
            this.m_color2 = scaleColorPct(SystemColors.InactiveCaption, 120);
            OnColorChanged();

            this.m_drawToolbarBorder = true;

            this.m_toolstrips = new ArrayList();
            this.m_toolstripitems = new ArrayList();
            this.m_ToolStripPanels = new ArrayList();

            this.m_timer.Tick += new System.EventHandler(this.m_timer_Tick);
            m_timer.Start();
        }

        public void Dispose(bool disposing)
        {
            this.m_timer.Stop();
            this.m_timer = null;

            this.m_toolstrips.Clear();
            this.m_toolstripitems.Clear();
            this.m_ToolStripPanels.Clear();

            this.m_toolstrips = null;
            this.m_toolstripitems = null;
            this.m_ToolStripPanels = null;
        }

        #region "属性"
        // 渐层色彩的起始色彩。
        public Color Color1
        {
            get
            {
                return this.m_color1;
            }

            set
            {
                if (!(value.Equals(this.m_color1)))
                {
                    this.m_color1 = value;
                    OnColorChanged();
                }
            }
        }

        // 渐层色彩的结束色彩。
        public Color Color2
        {
            get
            {
                return this.m_color2;
            }

            set
            {
                if (!(value.Equals(this.m_color2)))
                {
                    this.m_color2 = value;
                    OnColorChanged();
                }
            }
        }

        // 决定是否要替工具列系列控件描绘边框。
        public bool DrawToolbarBorder
        {
            get
            {
                return this.m_drawToolbarBorder;
            }

            set
            {
                this.m_drawToolbarBorder = value;
            }
        }
        #endregion

        // 取得所要绘制的工具列系列控件。
        protected override void Initialize(ToolStrip toolStrip)
        {
            if (!(this.m_toolstrips.Contains(toolStrip)))
            {
                this.m_toolstrips.Add(toolStrip);
            }

            postInitialize();
        }

        // 取得所要绘制的 ToolStripPanel。
        protected override void InitializePanel(System.Windows.Forms.ToolStripPanel toolStripPanel)
        {
            base.InitializePanel(toolStripPanel);

            if (!(this.m_ToolStripPanels.Contains(toolStripPanel)))
            {
                this.m_ToolStripPanels.Add(toolStripPanel);
            }

            postInitialize();
        }

        // 取得所要绘制的 ToolStripItem。
        protected override void InitializeItem(ToolStripItem item)
        {
            if (!(this.m_toolstripitems.Contains(item)))
            {
                this.m_toolstripitems.Add(item);
            }

            postInitialize();
        }

        // 绘制所指定之按钮的背景,我们亦使用此例程来描绘一些其它项目型别的背景,以便让它们看起来很类似。
        protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
        {
            LinearGradientMode lgm;
            Rectangle r;

            if (e.Item is ToolStripButton)
            {
                r = e.Item.ContentRectangle;
            }
            else
            {
                r = new Rectangle(1, 1, e.Item.Bounds.Width - 2, e.Item.Bounds.Height - 2);
            }

            if (e.Item.BackColor == SystemColors.ControlLight || e.Item.Pressed || e.Item.Selected)
            {
                Color c1, c2;

                if (e.Item.Pressed)
                {
                    c1 = scaleColorPct(this.m_color1, 80);
                    c2 = scaleColorPct(this.m_color2, 80);
                }
                else if (e.Item.Selected)
                {
                    c1 = scaleColorPct(this.m_color1, 120);
                    c2 = scaleColorPct(this.m_color2, 120);
                }
                else
                {
                    c1 = this.m_currentc1;
                    c2 = this.m_currentc2;
                }

                if (e.ToolStrip.Orientation == Orientation.Vertical)
                {
                    lgm = LinearGradientMode.Vertical;
                }
                else
                {
                    lgm = LinearGradientMode.Horizontal;
                }

                using (LinearGradientBrush lgb = new LinearGradientBrush(r, c1, c2, lgm))
                {
                    e.Graphics.FillRectangle(lgb, r);
                }
            }
            else
            {
                Color c;
                c = e.Item.BackColor;

                using (SolidBrush b = new SolidBrush(c))
                {
                    e.Graphics.FillRectangle(b, r);
                }
            }

            using (Pen p = new Pen(this.m_itemBorderColor))
            {
                e.Graphics.DrawRectangle(p, r);
            }
        }

        // 绘制边框。
        protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
        {
            if (this.m_drawToolbarBorder)
            {
                using (Pen p = new Pen(this.m_itemBorderColor))
                {
                    Rectangle r = new Rectangle(0, 0, e.ToolStrip.Width - 1, e.ToolStrip.Height - 1);
                    e.Graphics.DrawRectangle(p, r);
                }
            }
        }

        // 描绘一个分隔项目。
        protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
        {
            Point pt1, pt2;

            using (Pen p = new Pen(this.m_itemBorderColor))
            {
                if (e.ToolStrip.Orientation == Orientation.Vertical)
                {
                    pt1 = new Point(0, e.Item.Height / 2);
                    pt2 = new Point(e.Item.Width, e.Item.Height / 2);
                }
                else
                {
                    pt1 = new Point(e.Item.Width / 2, 0);
                    pt2 = new Point(e.Item.Width / 2, e.Item.Height);
                }

                e.Graphics.DrawLine(p, pt1, pt2);
            }
        }

        // 描绘一个 ToolStripDropDownButton 的背景。
        protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e)
        {
            OnRenderItemBackground(e);
        }

        protected override void OnRenderGrip(ToolStripGripRenderEventArgs e)
        {
            LinearGradientMode lgm;
            Rectangle r;

            if (e.GripDisplayStyle == ToolStripGripDisplayStyle.Horizontal)
            {
                lgm = LinearGradientMode.Vertical;
                r = new Rectangle(e.GripBounds.Left + 2,
                    e.GripBounds.Top,
                    e.GripBounds.Width - 5,
                    e.GripBounds.Height - 3);
            }
            else
            {
                lgm = LinearGradientMode.Horizontal;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -