yangyin
2025-01-13 809cab44fa1cbea94d84c42cce94a35cc49ce5ad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// *********************************
// Message from Original Author:
//
// 2008 Jose Menendez Poo
// Please give me credit if you use this code. It's all I ask.
// Contact me for more info: menendezpoo@gmail.com
// *********************************
//
// Original project from http://ribbon.codeplex.com/
// Continue to support and maintain by http://officeribbon.codeplex.com/
 
using System.ComponentModel;
using System.Drawing;
 
namespace System.Windows.Forms
{
    /// <summary>
    /// Large menu item with a description below the text
    /// </summary>
    public class RibbonDescriptionMenuItem
         : RibbonButton
    {
        #region Fields
 
        #endregion
 
        #region Ctor
 
        public RibbonDescriptionMenuItem()
        {
            DropDownArrowDirection = RibbonArrowDirection.Left;
            SetDropDownMargin(new Padding(10));
        }
 
        /// <summary>
        /// Creates a new menu item with description
        /// </summary>
        /// <param name="text">Text of the menuitem</param>
        public RibbonDescriptionMenuItem(string text)
            : this(null, text, null)
        { }
 
        /// <summary>
        /// Creates a new menu item with description
        /// </summary>
        /// <param name="text">Text of the menuitem</param>
        /// <param name="description">Descripion of the menuitem</param>
        public RibbonDescriptionMenuItem(string text, string description)
            : this(null, text, description)
        { }
 
        /// <summary>
        /// Creates a new menu item with description
        /// </summary>
        /// <param name="image">Image for the menuitem</param>
        /// <param name="text">Text for the menuitem</param>
        /// <param name="description">Description for the menuitem</param>
        public RibbonDescriptionMenuItem(Image image, string text, string description)
        {
            Image = image;
            Text = text;
            Description = description;
        }
 
        #endregion
 
        #region Props
 
        /// <summary>
        /// Gets or sets the bounds of the description
        /// </summary>
        public Rectangle DescriptionBounds { get; set; }
 
        /// <summary>
        /// This property is not relevant for this class
        /// </summary>
        [Browsable(false)]
        public override Image LargeImage
        {
            get => base.Image;
            set => base.Image = value;
        }
 
        [DefaultValue(null)]
        [Browsable(true)]
        [Category("Appearance")]
        public override Image Image
        {
            get => base.Image;
            set
            {
                base.Image = value;
 
                SmallImage = value;
            }
        }
 
        /// <summary>
        /// This property is not relevant for this class
        /// </summary>
        [Browsable(false)]
        public override Image SmallImage
        {
            get => base.SmallImage;
            set => base.SmallImage = value;
        }
 
        /// <summary>
        /// Gets or sets the description of the button
        /// </summary>
        [DefaultValue(null)]
        public string Description { get; set; }
 
        #endregion
 
        #region Methods
 
        protected override void OnPaintText(RibbonElementPaintEventArgs e)
        {
            if (e.Mode == RibbonElementSizeMode.DropDown)
            {
                StringFormat sf = StringFormatFactory.NearCenter();
 
                Owner.Renderer.OnRenderRibbonItemText(new RibbonTextEventArgs(
                     Owner, e.Graphics, e.Clip, this, TextBounds, Text, Color.Empty, FontStyle.Bold, sf));
 
                sf.Alignment = StringAlignment.Near;
 
                Owner.Renderer.OnRenderRibbonItemText(new RibbonTextEventArgs(
                     Owner, e.Graphics, e.Clip, this, DescriptionBounds, Description, sf));
            }
            else
            {
                base.OnPaintText(e);
            }
        }
 
        public override Size MeasureSize(object sender, RibbonElementMeasureSizeEventArgs e)
        {
            if (!Visible && !Owner.IsDesignMode())
            {
                SetLastMeasuredSize(new Size(0, 0));
                return LastMeasuredSize;
            }
 
            Size s = base.MeasureSize(sender, e);
 
            s.Height = 52;
 
            SetLastMeasuredSize(s);
 
            return s;
        }
 
        internal override Rectangle OnGetTextBounds(RibbonElementSizeMode sMode, Rectangle bounds)
        {
            Rectangle r = base.OnGetTextBounds(sMode, bounds);
            DescriptionBounds = r;
 
            r.Height = 20;
 
            DescriptionBounds = Rectangle.FromLTRB(DescriptionBounds.Left, r.Bottom, DescriptionBounds.Right, DescriptionBounds.Bottom);
 
            return r;
        }
 
        #endregion
    }
}