自定义组件 UITypeEditor

 

/Files/tssing/UITypeEditor.rar

 

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace MyLib
{
    
// This UITypeEditor can be associated with Int32, Double and Single
    
// properties to provide a design-mode angle selection interface.
    
//[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    public class AngleEditor : System.Drawing.Design.UITypeEditor
    {
        
public AngleEditor()
        {
        }

        
// Indicates whether the UITypeEditor provides a form-based (modal) dialog, 
        
// drop down dialog, or no UI outside of the properties window.
        public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
        {
            
return UITypeEditorEditStyle.DropDown;
        }

        
// Displays the UI for value selection.
        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
        {
            
// Return the value if the value is not of type Int32, Double and Single.
            if (value.GetType() != typeof(double&& value.GetType() != typeof(float&& value.GetType() != typeof(int))
                
return value;

            
// Uses the IWindowsFormsEditorService to display a 
            
// drop-down UI in the Properties window.
            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            
if (edSvc != null)
            {
                
// Display an angle selection control and retrieve the value.
                AngleControl angleControl = new AngleControl((double)value);
                edSvc.DropDownControl(angleControl);

                
// Return the value in the appropraite data format.
                if (value.GetType() == typeof(double))
                    
return angleControl.angle;
                
else if (value.GetType() == typeof(float))
                    
return (float)angleControl.angle;
                
else if (value.GetType() == typeof(int))
                    
return (int)angleControl.angle;
            }
            
return value;
        }

        
// Draws a representation of the property's value.
        public override void PaintValue(System.Drawing.Design.PaintValueEventArgs e)
        {
            
int normalX = (e.Bounds.Width / 2);
            
int normalY = (e.Bounds.Height / 2);

            
// Fill background and ellipse and center point.
            e.Graphics.FillRectangle(new SolidBrush(Color.DarkBlue), e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
            e.Graphics.FillEllipse(
new SolidBrush(Color.White), e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 3, e.Bounds.Height - 3);
            e.Graphics.FillEllipse(
new SolidBrush(Color.SlateGray), normalX + e.Bounds.X - 1, normalY + e.Bounds.Y - 133);

            
// Draw line along the current angle.
            double radians = ((double)e.Value * Math.PI) / (double)180;
            e.Graphics.DrawLine(
new Pen(new SolidBrush(Color.Red), 1), normalX + e.Bounds.X, normalY + e.Bounds.Y,
                e.Bounds.X 
+ (normalX + (int)((double)normalX * Math.Cos(radians))),
                e.Bounds.Y 
+ (normalY + (int)((double)normalY * Math.Sin(radians))));
        }

        
// Indicates whether the UITypeEditor supports painting a 
        
// representation of a property's value.
        public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
        {
            
return true;
        }
    }

    
// Provides a user interface for adjusting an angle value.
    internal class AngleControl : System.Windows.Forms.UserControl
    {
        
// Stores the angle.
        public double angle;
        
// Stores the rotation offset.
        private int rotation = 0;
        
// Control state tracking variables.
        private int dbx = -10;
        
private int dby = -10;
        
private int overButton = -1;

        
public AngleControl(double initial_angle)
        {
            
this.angle = initial_angle;
            
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        }

        
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            
// Set angle origin point at center of control.
            int originX = (this.Width / 2);
            
int originY = (this.Height / 2);

            
// Fill background and ellipse and center point.
            e.Graphics.FillRectangle(new SolidBrush(Color.DarkBlue), 00this.Width, this.Height);
            e.Graphics.FillEllipse(
new SolidBrush(Color.White), 11this.Width - 3this.Height - 3);
            e.Graphics.FillEllipse(
new SolidBrush(Color.SlateGray), originX - 1, originY - 133);

            
// Draw angle markers.
            int startangle = (270 - rotation) % 360;
            e.Graphics.DrawString(startangle.ToString(), 
new Font("Arial"8), new SolidBrush(Color.DarkGray), (this.Width / 2- 1010);
            startangle 
= (startangle + 90% 360;
            e.Graphics.DrawString(startangle.ToString(), 
new Font("Arial"8), new SolidBrush(Color.DarkGray), this.Width - 18, (this.Height / 2- 6);
            startangle 
= (startangle + 90% 360;
            e.Graphics.DrawString(startangle.ToString(), 
new Font("Arial"8), new SolidBrush(Color.DarkGray), (this.Width / 2- 6this.Height - 18);
            startangle 
= (startangle + 90% 360;
            e.Graphics.DrawString(startangle.ToString(), 
new Font("Arial"8), new SolidBrush(Color.DarkGray), 10, (this.Height / 2- 6);

            
// Draw line along the current angle.         
            double radians = ((((angle + rotation) + 360% 360* Math.PI) / (double)180;
            e.Graphics.DrawLine(
new Pen(new SolidBrush(Color.Red), 1), originX, originY,
                originX 
+ (int)((double)originX * (double)Math.Cos(radians)),
                originY 
+ (int)((double)originY * (double)Math.Sin(radians)));

            
// Output angle information.
            e.Graphics.FillRectangle(new SolidBrush(Color.Gray), this.Width - 8438213);
            e.Graphics.DrawString(
"Angle: " + angle.ToString("F4"), new Font("Arial"8), new SolidBrush(Color.Yellow), this.Width - 842);
            
// Draw square at mouse position of last angle adjustment.
            e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black), 1), dbx - 2, dby - 244);
            
// Draw rotation adjustment buttons.
            if (overButton == 1)
            {
                e.Graphics.FillRectangle(
new SolidBrush(Color.Green), this.Width - 28this.Height - 141212);
                e.Graphics.FillRectangle(
new SolidBrush(Color.Gray), 2this.Height - 1311012);
                e.Graphics.DrawString(
"Rotate 90 degrees left"new Font("Arial"8), new SolidBrush(Color.White), 2this.Height - 14);
            }
            
else
                e.Graphics.FillRectangle(
new SolidBrush(Color.DarkGreen), this.Width - 28this.Height - 141212);
            
if (overButton == 2)
            {
                e.Graphics.FillRectangle(
new SolidBrush(Color.Green), this.Width - 14this.Height - 141212);
                e.Graphics.FillRectangle(
new SolidBrush(Color.Gray), 2this.Height - 1311612);
                e.Graphics.DrawString(
"Rotate 90 degrees right"new Font("Arial"8), new SolidBrush(Color.White), 2this.Height - 14);
            }
            
else
                e.Graphics.FillRectangle(
new SolidBrush(Color.DarkGreen), this.Width - 14this.Height - 141212);
            e.Graphics.DrawEllipse(
new Pen(new SolidBrush(Color.White), 1), this.Width - 11this.Height - 1166);
            e.Graphics.DrawEllipse(
new Pen(new SolidBrush(Color.White), 1), this.Width - 25this.Height - 1166);
            
if (overButton == 1)
                e.Graphics.FillRectangle(
new SolidBrush(Color.Green), this.Width - 25this.Height - 644);
            
else
                e.Graphics.FillRectangle(
new SolidBrush(Color.DarkGreen), this.Width - 25this.Height - 644);
            
if (overButton == 2)
                e.Graphics.FillRectangle(
new SolidBrush(Color.Green), this.Width - 8this.Height - 644);
            
else
                e.Graphics.FillRectangle(
new SolidBrush(Color.DarkGreen), this.Width - 8this.Height - 644);
            e.Graphics.FillPolygon(
new SolidBrush(Color.White), new Point[] { new Point(this.Width - 7this.Height - 8), new Point(this.Width - 3this.Height - 8), new Point(this.Width - 5this.Height - 4) });
            e.Graphics.FillPolygon(
new SolidBrush(Color.White), new Point[] { new Point(this.Width - 26this.Height - 8), new Point(this.Width - 21this.Height - 8), new Point(this.Width - 25this.Height - 4) });
        }

        
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
        {
            
// Handle rotation adjustment button clicks.
            if (e.X >= this.Width - 28 && e.X <= this.Width - 2 && e.Y >= this.Height - 14 && e.Y <= this.Height - 2)
            {
                
if (e.X <= this.Width - 16)
                    rotation 
-= 90;
                
else if (e.X >= this.Width - 14)
                    rotation 
+= 90;
                
if (rotation < 0)
                    rotation 
+= 360;
                rotation 
= rotation % 360;
                dbx 
= -10;
                dby 
= -10;
            }
            
else
                UpdateAngle(e.X, e.Y);
            
this.Refresh();
        }

        
protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
        {
            
if (e.Button == MouseButtons.Left)
            {
                UpdateAngle(e.X, e.Y);
                overButton 
= -1;
            }
            
else if (e.X >= this.Width - 28 && e.X <= this.Width - 16 && e.Y >= this.Height - 14 && e.Y <= this.Height - 2)
                overButton 
= 1;
            
else if (e.X >= this.Width - 14 && e.X <= this.Width - 2 && e.Y >= this.Height - 14 && e.Y <= this.Height - 2)
                overButton 
= 2;
            
else
                overButton 
= -1;
            
this.Refresh();
        }

        
private void UpdateAngle(int mx, int my)
        {
            
// Store mouse coordinates.
            dbx = mx;
            dby 
= my;

            
// Translate y coordinate input to GetAngle function to correct for ellipsoid distortion.
            double widthToHeightRatio = (double)this.Width / (double)this.Height;
            
int tmy;
            
if (my == 0)
                tmy 
= my;
            
else if (my < this.Height / 2)
                tmy 
= (this.Height / 2- (int)(((this.Height / 2- my) * widthToHeightRatio);
            
else
                tmy 
= (this.Height / 2+ (int)((double)(my - (this.Height / 2)) * widthToHeightRatio);

            
// Retrieve updated angle based on rise over run.
            angle = (GetAngle(this.Width / 2this.Height / 2, mx, tmy) - rotation) % 360;
        }

        
private double GetAngle(int x1, int y1, int x2, int y2)
        {
            
double degrees;

            
// Avoid divide by zero run values.
            if (x2 - x1 == 0)
            {
                
if (y2 > y1)
                    degrees 
= 90;
                
else
                    degrees 
= 270;
            }
            
else
            {
                
// Calculate angle from offset.
                double riseoverrun = (double)(y2 - y1) / (double)(x2 - x1);
                
double radians = Math.Atan(riseoverrun);
                degrees 
= radians * ((double)180 / Math.PI);

                
// Handle quadrant specific transformations.       
                if ((x2 - x1) < 0 || (y2 - y1) < 0)
                    degrees 
+= 180;
                
if ((x2 - x1) > 0 && (y2 - y1) < 0)
                    degrees 
-= 180;
                
if (degrees < 0)
                    degrees 
+= 360;
            }
            
return degrees;
        }
    }

    
public class AngleEditorTestControl : System.Windows.Forms.UserControl
    {
        
private double int_angle;

        [BrowsableAttribute(
true)]
        [Editor(
typeof(AngleEditor), typeof(System.Drawing.Design.UITypeEditor))]
        
public double Angle
        {
            
get
            { 
return int_angle; }
            
set
            { int_angle 
= value; }
        }

        
public AngleEditorTestControl()
        {
            int_angle 
= 90;
            
this.Size = new Size(19042);
            
this.BackColor = Color.Beige;
        }

        
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            
if (this.DesignMode)
            {
                e.Graphics.DrawString(
"Use the Properties Window to access"new Font("Arial"8), new SolidBrush(Color.Black), 32);
                e.Graphics.DrawString(
"the AngleEditor UITypeEditor by"new Font("Arial"8), new SolidBrush(Color.Black), 314);
                e.Graphics.DrawString(
"configuring the \"Angle\" property."new Font("Arial"8), new SolidBrush(Color.Black), 326);
            }
            
else
                e.Graphics.DrawString(
"This example requires design mode."new Font("Arial"8), new SolidBrush(Color.Black), 32);
        }
    }
}

 

ContractedBlock.gif ExpandedBlockStart.gif Code
namespace MyLib
{
    
using System;
    
using System.ComponentModel;
    
using System.ComponentModel.Design;
    
using System.Drawing;
    
using System.Drawing.Drawing2D;
    
using System.Drawing.Design;
    
using System.Windows.Forms;
    
using System.Diagnostics;
    
using System.Windows.Forms.Design;
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name 
= "FullTrust")]
    
public class FlashTrackBar : System.Windows.Forms.Control
    {
        
/// <summary>
        
///    Required designer variable.
        
/// </summary>
        private System.ComponentModel.Container components;

        
private const int LeftRightBorder = 10;
        
private int value = 0;
        
private int min = 0;
        
private int max = 100;
        
private bool showPercentage = false;
        
private bool showValue = false;
        
private bool allowUserEdit = true;
        
private bool showGradient = true;
        
private int dragValue = 0;
        
private bool dragging = false;
        
private Color startColor = Color.Red;
        
private Color endColor = Color.LimeGreen;
        
private EventHandler onValueChanged;
        
private Brush baseBackground = null;
        
private Brush backgroundDim = null;
        
private byte darkenBy = 200;


        
public FlashTrackBar()
        {
            
//
            
// Required for Windows Form Designer support
            
//
            InitializeComponent();

            SetStyle(ControlStyles.Opaque, 
true);
            SetStyle(ControlStyles.ResizeRedraw, 
true);
            Debug.Assert(GetStyle(ControlStyles.ResizeRedraw), 
"Should be redraw!");
        }

        
/// <summary>
        
///    Clean up any resources being used.
        
/// </summary>
        protected override void Dispose(bool disposing)
        {
            
if (disposing)
            {
                
if (components != null)
                {
                    components.Dispose();
                }
            }
            
base.Dispose(disposing);
        }

        
/// <summary>
        
///    Required method for Designer support - do not modify
        
///    the contents of this method with the code editor.
        
/// </summary>
        void InitializeComponent()
        {
            
this.components = new System.ComponentModel.Container();
            
this.ForeColor = System.Drawing.Color.White;
            
this.BackColor = System.Drawing.Color.Black;
            
this.Size = new System.Drawing.Size(10023);
            
this.Text = "FlashTrackBar";
        }

        [
            Category(
"Flash"),
            DefaultValue(
true)
        ]
        
public bool AllowUserEdit
        {
            
get
            {
                
return allowUserEdit;
            }
            
set
            {
                
if (value != allowUserEdit)
                {
                    allowUserEdit 
= value;
                    
if (!allowUserEdit)
                    {
                        Capture 
= false;
                        dragging 
= false;
                    }
                }
            }
        }

        [
            Category(
"Flash")
        ]
        
public Color EndColor
        {
            
get
            {
                
return endColor;
            }
            
set
            {
                endColor 
= value;
                
if (baseBackground != null && showGradient)
                {
                    baseBackground.Dispose();
                    baseBackground 
= null;
                }
                Invalidate();
            }
        }

        
public bool ShouldSerializeEndColor()
        {
            
return !(endColor == Color.LimeGreen);
        }


        [
            Category(
"Flash"),
            Editor(
typeof(FlashTrackBarDarkenByEditor), typeof(UITypeEditor)),
            DefaultValue((
byte)200)
        ]
        
public byte DarkenBy
        {
            
get
            {
                
return darkenBy;
            }
            
set
            {
                
if (value != darkenBy)
                {
                    darkenBy 
= value;
                    
if (backgroundDim != null)
                    {
                        backgroundDim.Dispose();
                        backgroundDim 
= null;
                    }
                    OptimizedInvalidate(Value, max);
                }
            }
        }

        [
            Category(
"Flash"),
            DefaultValue(
100)
        ]
        
public int Max
        {
            
get
            {
                
return max;
            }
            
set
            {
                
if (max != value)
                {
                    max 
= value;
                    Invalidate();
                }
            }
        }

        [
            Category(
"Flash"),
            DefaultValue(
0)
        ]
        
public int Min
        {
            
get
            {
                
return min;
            }
            
set
            {
                
if (min != value)
                {
                    min 
= value;
                    Invalidate();
                }
            }
        }

        [
            Category(
"Flash")
        ]
        
public Color StartColor
        {
            
get
            {
                
return startColor;
            }
            
set
            {
                startColor 
= value;
                
if (baseBackground != null && showGradient)
                {
                    baseBackground.Dispose();
                    baseBackground 
= null;
                }
                Invalidate();
            }
        }

        
public bool ShouldSerializeStartColor()
        {
            
return !(startColor == Color.Red);
        }



        [
            Category(
"Flash"),
            RefreshProperties(RefreshProperties.Repaint),
            DefaultValue(
false)
        ]
        
public bool ShowPercentage
        {
            
get
            {
                
return showPercentage;
            }
            
set
            {
                
if (value != showPercentage)
                {
                    showPercentage 
= value;
                    
if (showPercentage)
                    {
                        showValue 
= false;
                    }
                    Invalidate();
                }
            }
        }

        [
            Category(
"Flash"),
            RefreshProperties(RefreshProperties.Repaint),
            DefaultValue(
false)
        ]
        
public bool ShowValue
        {
            
get
            {
                
return showValue;
            }
            
set
            {
                
if (value != showValue)
                {
                    showValue 
= value;
                    
if (showValue)
                    {
                        showPercentage 
= false;
                    }
                    Invalidate();
                }
            }
        }

        [
            Category(
"Flash"),
            DefaultValue(
true)
        ]
        
public bool ShowGradient
        {
            
get
            {
                
return showGradient;
            }
            
set
            {
                
if (value != showGradient)
                {
                    showGradient 
= value;
                    
if (baseBackground != null)
                    {
                        baseBackground.Dispose();
                        baseBackground 
= null;
                    }
                    Invalidate();
                }
            }
        }

        [
            Category(
"Flash"),
            Editor(
typeof(FlashTrackBarValueEditor), typeof(UITypeEditor)),
            DefaultValue(
0)
        ]
        
public int Value
        {
            
get
            {
                
if (dragging)
                {
                    
return dragValue;
                }
                
return value;
            }
            
set
            {
                
if (value != this.value)
                {
                    
int old = this.value;
                    
this.value = value;
                    OnValueChanged(EventArgs.Empty);
                    OptimizedInvalidate(old, 
this.value);
                }
            }
        }

        
// ValueChanged Event
        [Description("Raised when the Value displayed changes")]
        
public event EventHandler ValueChanged
        {
            add
            {
                onValueChanged 
+= value;
            }
            remove
            {
                onValueChanged 
-= value;
            }
        }

        
private void OptimizedInvalidate(int oldValue, int newValue)
        {
            Rectangle client 
= ClientRectangle;

            
float oldPercentValue = ((float)oldValue / ((float)Max - (float)Min));
            
int oldNonDimLength = (int)(oldPercentValue * (float)client.Width);

            
float newPercentValue = ((float)newValue / ((float)Max - (float)Min));
            
int newNonDimLength = (int)(newPercentValue * (float)client.Width);

            
int min = Math.Min(oldNonDimLength, newNonDimLength);
            
int max = Math.Max(oldNonDimLength, newNonDimLength);

            Rectangle invalid 
= new Rectangle(
                client.X 
+ min,
                client.Y,
                max 
- min,
                client.Height);

            Invalidate(invalid);

            
string oldToDisplay;
            
string newToDisplay;

            
if (ShowPercentage)
            {
                oldToDisplay 
= Convert.ToString((int)(oldPercentValue * 100f)) + "%";
                newToDisplay 
= Convert.ToString((int)(newPercentValue * 100f)) + "%";
            }
            
else if (ShowValue)
            {
                oldToDisplay 
= Convert.ToString(oldValue);
                newToDisplay 
= Convert.ToString(newValue);
            }
            
else
            {
                oldToDisplay 
= null;
                newToDisplay 
= null;
            }

            
if (oldToDisplay != null && newToDisplay != null)
            {
                Graphics g 
= CreateGraphics();
                SizeF oldFontSize 
= g.MeasureString(oldToDisplay, Font);
                SizeF newFontSize 
= g.MeasureString(newToDisplay, Font);
                RectangleF oldFontRect 
= new RectangleF(new PointF(00), oldFontSize);
                RectangleF newFontRect 
= new RectangleF(new PointF(00), newFontSize);
                oldFontRect.X 
= (client.Width - oldFontRect.Width) / 2;
                oldFontRect.Y 
= (client.Height - oldFontRect.Height) / 2;
                newFontRect.X 
= (client.Width - newFontRect.Width) / 2;
                newFontRect.Y 
= (client.Height - newFontRect.Height) / 2;

                Invalidate(
new Rectangle((int)oldFontRect.X, (int)oldFontRect.Y, (int)oldFontRect.Width, (int)oldFontRect.Height));
                Invalidate(
new Rectangle((int)newFontRect.X, (int)newFontRect.Y, (int)newFontRect.Width, (int)newFontRect.Height));
            }
        }

        
protected override void OnMouseDown(MouseEventArgs e)
        {
            
base.OnMouseDown(e);
            
if (!allowUserEdit)
            {
                
return;
            }
            Capture 
= true;
            dragging 
= true;
            SetDragValue(
new Point(e.X, e.Y));
        }

        
protected override void OnMouseMove(MouseEventArgs e)
        {
            
base.OnMouseMove(e);
            
if (!allowUserEdit || !dragging)
            {
                
return;
            }
            SetDragValue(
new Point(e.X, e.Y));
        }

        
protected override void OnMouseUp(MouseEventArgs e)
        {
            
base.OnMouseUp(e);
            
if (!allowUserEdit || !dragging)
            {
                
return;
            }
            Capture 
= false;
            dragging 
= false;
            value 
= dragValue;
            OnValueChanged(EventArgs.Empty);
        }

        
protected override void OnPaint(PaintEventArgs e)
        {

            
base.OnPaint(e);
            
if (baseBackground == null)
            {
                
if (showGradient)
                {
                    baseBackground 
= new LinearGradientBrush(new Point(00),
                                                             
new Point(ClientSize.Width, 0),
                                                             StartColor,
                                                             EndColor);
                }
                
else if (BackgroundImage != null)
                {
                    baseBackground 
= new TextureBrush(BackgroundImage);
                }
                
else
                {
                    baseBackground 
= new SolidBrush(BackColor);
                }
            }

            
if (backgroundDim == null)
            {
                backgroundDim 
= new SolidBrush(Color.FromArgb(DarkenBy, Color.Black));
            }

            Rectangle toDim 
= ClientRectangle;
            
float percentValue = ((float)Value / ((float)Max - (float)Min));
            
int nonDimLength = (int)(percentValue * (float)toDim.Width);
            toDim.X 
+= nonDimLength;
            toDim.Width 
-= nonDimLength;


            
string text = Text;
            
string toDisplay = null;
            RectangleF textRect 
= new RectangleF();

            
if (ShowPercentage || ShowValue || text.Length > 0)
            {

                
if (ShowPercentage)
                {
                    toDisplay 
= Convert.ToString((int)(percentValue * 100f)) + "%";
                }
                
else if (ShowValue)
                {
                    toDisplay 
= Convert.ToString(Value);
                }
                
else
                {
                    toDisplay 
= text;
                }

                SizeF textSize 
= e.Graphics.MeasureString(toDisplay, Font);
                textRect.Width 
= textSize.Width;
                textRect.Height 
= textSize.Height;
                textRect.X 
= (ClientRectangle.Width - textRect.Width) / 2;
                textRect.Y 
= (ClientRectangle.Height - textRect.Height) / 2;
            }

            e.Graphics.FillRectangle(baseBackground, ClientRectangle);
            e.Graphics.FillRectangle(backgroundDim, toDim);
            e.Graphics.Flush();
            
if (toDisplay != null && toDisplay.Length > 0)
            {
                e.Graphics.DrawString(toDisplay, Font, 
new SolidBrush(ForeColor), textRect);
            }
        }

        
protected override void OnTextChanged(EventArgs e)
        {
            
base.OnTextChanged(e);
            Invalidate();
        }

        
protected override void OnBackColorChanged(EventArgs e)
        {
            
base.OnTextChanged(e);
            
if ((baseBackground != null&& (!showGradient))
            {
                baseBackground.Dispose();
                baseBackground 
= null;
            }
        }

        
protected override void OnBackgroundImageChanged(EventArgs e)
        {
            
base.OnTextChanged(e);
            
if ((baseBackground != null&& (!showGradient))
            {
                baseBackground.Dispose();
                baseBackground 
= null;
            }
        }

        
protected override void OnResize(EventArgs e)
        {
            
base.OnResize(e);
            
if (baseBackground != null)
            {
                baseBackground.Dispose();
                baseBackground 
= null;
            }
        }

        
protected virtual void OnValueChanged(EventArgs e)
        {
            
if (onValueChanged != null)
            {
                onValueChanged.Invoke(
this, e);
            }
        }

        
private void SetDragValue(Point mouseLocation)
        {

            Rectangle client 
= ClientRectangle;

            
if (client.Contains(mouseLocation))
            {
                
float percentage = (float)mouseLocation.X / (float)ClientRectangle.Width;
                
int newDragValue = (int)(percentage * (float)(max - min));
                
if (newDragValue != dragValue)
                {
                    
int old = dragValue;
                    dragValue 
= newDragValue;
                    OptimizedInvalidate(old, dragValue);
                }
            }
            
else
            {
                
if (client.Y <= mouseLocation.Y && mouseLocation.Y <= client.Y + client.Height)
                {
                    
if (mouseLocation.X <= client.X && mouseLocation.X > client.X - LeftRightBorder)
                    {
                        
int newDragValue = min;
                        
if (newDragValue != dragValue)
                        {
                            
int old = dragValue;
                            dragValue 
= newDragValue;
                            OptimizedInvalidate(old, dragValue);
                        }
                    }
                    
else if (mouseLocation.X >= client.X + client.Width && mouseLocation.X < client.X + client.Width + LeftRightBorder)
                    {
                        
int newDragValue = max;
                        
if (newDragValue != dragValue)
                        {
                            
int old = dragValue;
                            dragValue 
= newDragValue;
                            OptimizedInvalidate(old, dragValue);
                        }
                    }
                }
                
else
                {
                    
if (dragValue != value)
                    {
                        
int old = dragValue;
                        dragValue 
= value;
                        OptimizedInvalidate(old, dragValue);
                    }
                }
            }
        }
    }
    
public class FlashTrackBarDarkenByEditor : FlashTrackBarValueEditor
    {
        
protected override void SetEditorProps(FlashTrackBar editingInstance, FlashTrackBar editor)
        {
            
base.SetEditorProps(editingInstance, editor);
            editor.Min 
= 0;
            editor.Max 
= byte.MaxValue;
        }
    }

    
public class FlashTrackBarValueEditor : System.Drawing.Design.UITypeEditor
    {

        
private IWindowsFormsEditorService edSvc = null;

        
protected virtual void SetEditorProps(FlashTrackBar editingInstance, FlashTrackBar editor)
        {
            editor.ShowValue 
= true;
            editor.StartColor 
= Color.Navy;
            editor.EndColor 
= Color.White;
            editor.ForeColor 
= Color.White;
            editor.Min 
= editingInstance.Min;
            editor.Max 
= editingInstance.Max;
        }

        
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {

            
if (context != null
                
&& context.Instance != null
                
&& provider != null)
            {

                edSvc 
= (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

                
if (edSvc != null)
                {
                    FlashTrackBar trackBar 
= new FlashTrackBar();
                    trackBar.ValueChanged 
+= new EventHandler(this.ValueChanged);
                    SetEditorProps((FlashTrackBar)context.Instance, trackBar);
                    
bool asInt = true;
                    
if (value is int)
                    {
                        trackBar.Value 
= (int)value;
                    }
                    
else if (value is byte)
                    {
                        asInt 
= false;
                        trackBar.Value 
= (byte)value;
                    }
                    edSvc.DropDownControl(trackBar);
                    
if (asInt)
                    {
                        value 
= trackBar.Value;
                    }
                    
else
                    {
                        value 
= (byte)trackBar.Value;
                    }
                }
            }

            
return value;
        }

        
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            
if (context != null && context.Instance != null)
            {
                
return UITypeEditorEditStyle.DropDown;
            }
            
return base.GetEditStyle(context);
        }

        
private void ValueChanged(object sender, EventArgs e)
        {
            
if (edSvc != null)
            {
                edSvc.CloseDropDown();
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/tssing/archive/2009/04/12/1434112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值