ProgressBar.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / WinForms / Managed / System / WinForms / ProgressBar.cs / 1305376 / ProgressBar.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

/* 
 */ 
namespace System.Windows.Forms {
    using System.Runtime.Serialization.Formatters; 
    using System.Runtime.Remoting;
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis;
    using System; 
    using System.Security.Permissions;
    using System.Drawing; 
    using System.ComponentModel; 
    using System.ComponentModel.Design;
    using System.Windows.Forms; 
    using Microsoft.Win32;
    using System.Runtime.InteropServices;
    using System.Windows.Forms.Layout;
    using System.Globalization; 

    ///  
    ///  
    ///    
    ///       Represents a Windows progress bar control. 
    ///    
    /// 
    [
    ComVisible(true), 
    ClassInterface(ClassInterfaceType.AutoDispatch),
    DefaultProperty("Value"), 
    DefaultBindingProperty("Value"), 
    SRDescription(SR.DescriptionProgressBar)
    ] 
    public class ProgressBar : Control {


        //# VS7 205: simcooke 
        //REMOVED: AddOnValueChanged, RemoveOnValueChanged, OnValueChanged and all designer plumbing associated with it.
        //         OnValueChanged event no longer exists. 
 
        // these four values define the range of possible values, how to navigate
        // through them, and the current position 
        //
        private int minimum = 0;
        private int maximum = 100;
        private int step = 10; 
        private int value = 0;
 
        //this defines marquee animation speed 
        private int marqueeSpeed = 100;
 
        private Color defaultForeColor = SystemColors.Highlight;

        private ProgressBarStyle style = ProgressBarStyle.Blocks;
 
        private EventHandler onRightToLeftLayoutChanged;
        private bool rightToLeftLayout = false; 
 

        ///  
        /// 
        ///    
        ///       Initializes a new instance of the  class in its default
        ///       state. 
        ///    
        ///  
        public ProgressBar() 
        : base() {
            SetStyle(ControlStyles.UserPaint | 
                     ControlStyles.UseTextForAccessibility |
                     ControlStyles.Selectable, false);
            ForeColor = defaultForeColor;
        } 

        ///  
        ///  
        /// 
        ///     
        ///       This is called when creating a window. Inheriting classes can ovveride
        ///       this to add extra functionality, but should not forget to first call
        ///       base.getCreateParams() to make sure the control continues to work
        ///       correctly. 
        ///    
        ///  
        protected override CreateParams CreateParams { 
            [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
            get { 
                CreateParams cp = base.CreateParams;
                cp.ClassName = NativeMethods.WC_PROGRESS;
                if (this.Style == ProgressBarStyle.Continuous) {
                    cp.Style |= NativeMethods.PBS_SMOOTH; 
                }
                else if (this.Style == ProgressBarStyle.Marquee && !DesignMode) { 
                    cp.Style |= NativeMethods.PBS_MARQUEE; 
                }
 
                if (RightToLeft == RightToLeft.Yes && RightToLeftLayout == true) {
                    //We want to turn on mirroring for Form explicitly.
                    cp.ExStyle |= NativeMethods.WS_EX_LAYOUTRTL;
                    //Don't need these styles when mirroring is turned on. 
                    cp.ExStyle &= ~(NativeMethods.WS_EX_RTLREADING | NativeMethods.WS_EX_RIGHT | NativeMethods.WS_EX_LEFTSCROLLBAR);
                } 
                return cp; 
            }
        } 

        /// 
        /// 
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public override bool AllowDrop { 
            get {
                return base.AllowDrop; 
            }
            set {
                base.AllowDrop = value;
            } 
        }
 
        ///  
        /// 
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public override Image BackgroundImage {
            get { 
                return base.BackgroundImage;
            } 
            set { 
                base.BackgroundImage = value;
            } 
        }


        ///  
        /// 
        ///     
        ///       Gets or sets the style of the ProgressBar. This is can be either Blocks or Continuous. 
        ///    
        ///  
        [
        Browsable(true),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(ProgressBarStyle.Blocks), 
        SRCategory(SR.CatBehavior),
        SRDescription(SR.ProgressBarStyleDescr) 
        ] 
        public ProgressBarStyle Style {
            get { 
                return style;
            }
            set {
                if (style != value) { 
                    //valid values are 0x0 to 0x2
                    if (!ClientUtils.IsEnumValid(value, (int)value, (int)ProgressBarStyle.Blocks, (int)ProgressBarStyle.Marquee)){ 
                        throw new InvalidEnumArgumentException("value", (int)value, typeof(ProgressBarStyle)); 
                    }
                    style = value; 
                    if (IsHandleCreated)
                        RecreateHandle();
                    if (style == ProgressBarStyle.Marquee)
                    { 
                        StartMarquee();
                    } 
                } 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler BackgroundImageChanged {
            add { 
                base.BackgroundImageChanged += value; 
            }
            remove { 
                base.BackgroundImageChanged -= value;
            }
        }
 

        ///  
        ///  
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public override ImageLayout BackgroundImageLayout {
            get {
                return base.BackgroundImageLayout; 
            }
            set { 
                base.BackgroundImageLayout = value; 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler BackgroundImageLayoutChanged {
            add { 
                base.BackgroundImageLayoutChanged += value; 
            }
            remove { 
                base.BackgroundImageLayoutChanged -= value;
            }
        }
 

        ///  
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public new bool CausesValidation {
            get {
                return base.CausesValidation;
            } 
            set {
                base.CausesValidation = value; 
            } 
        }
 
        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler CausesValidationChanged { 
            add {
                base.CausesValidationChanged += value; 
            } 
            remove {
                base.CausesValidationChanged -= value; 
            }
        }

        ///  
        protected override ImeMode DefaultImeMode {
            get { 
                return ImeMode.Disable; 
            }
        } 

        /// 
        /// 
        ///     Deriving classes can override this to configure a default size for their control. 
        ///     This is more efficient than setting the size in the control's constructor.
        ///  
        protected override Size DefaultSize { 
            get {
                return new Size(100, 23); 
            }
        }

        ///  
        /// 
        ///     This property is overridden and hidden from statement completion 
        ///     on controls that are based on Win32 Native Controls. 
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        protected override bool DoubleBuffered {
            get {
                return base.DoubleBuffered;
            } 
            set {
                base.DoubleBuffered = value; 
            } 
        }
 
        /// 
        /// 
        ///    
        ///       Gets or sets the font of text in the . 
        ///    
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public override Font Font {
            get { 
                return base.Font;
            }
            set {
                base.Font = value; 
            }
        } 
 
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler FontChanged {
            add {
                base.FontChanged += value; 
            }
            remove { 
                base.FontChanged -= value; 
            }
        } 

        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public ImeMode ImeMode { 
            get {
                return base.ImeMode; 
            } 
            set {
                base.ImeMode = value; 
            }
        }

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public new event EventHandler ImeModeChanged { 
            add {
                base.ImeModeChanged += value; 
            }
            remove {
                base.ImeModeChanged -= value;
            } 
        }
 
        ///  
        ///    
        ///       Gets or sets the marquee animation speed of the . 
        ///       Sets the value to a positive number causes the progressBar to move, while setting it to 0
        ///       stops the progressBar.
        ///    
        ///  
        [
        DefaultValue(100), 
        SRCategory(SR.CatBehavior), 
        SRDescription(SR.ProgressBarMarqueeAnimationSpeed)]
        public int MarqueeAnimationSpeed { 
            get {
                return marqueeSpeed;
            }
            [SuppressMessage("Microsoft.Usage", "CA2208:InstantiateArgumentExceptionsCorrectly")] 
            set {
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("MarqueeAnimationSpeed must be non-negative"); 
                }
                marqueeSpeed = value; 
                if (!DesignMode) {
                    StartMarquee();
                }
            } 
        }
 
        ///  
        /// 
        ///     
        ///       Start the Marquee rolling (or stop it, if the speed = 0)
        ///    
        /// 
        private void StartMarquee() 
        {
            if (IsHandleCreated && style == ProgressBarStyle.Marquee) 
            { 
                if (marqueeSpeed == 0)
                { 
                    SendMessage(NativeMethods.PBM_SETMARQUEE, 0, marqueeSpeed);
                }
                else
                { 
                    SendMessage(NativeMethods.PBM_SETMARQUEE, 1, marqueeSpeed);
                } 
            } 
        }
 
        /// 
        /// 
        ///    
        ///       Gets or sets the maximum value of the . 
        ///       Gets or sets the maximum value of the .
        ///     
        ///  
        [
        DefaultValue(100), 
        SRCategory(SR.CatBehavior),
        RefreshProperties(RefreshProperties.Repaint),
        SRDescription(SR.ProgressBarMaximumDescr)
        ] 
        public int Maximum {
            get { 
                return maximum; 
            }
            set { 
                if (maximum != value) {
                    // Ensure that value is in the Win32 control's acceptable range
                    // Message: '%1' is not a valid value for '%0'. '%0' must be greater than %2.
                    // Should this set a boundary for the top end too? 
                    if (value < 0)
                        throw new ArgumentOutOfRangeException("Maximum", SR.GetString(SR.InvalidLowBoundArgumentEx, "Maximum", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture))); 
 
                    if (minimum > value) minimum = value;
 
                    maximum = value;

                    if (this.value > maximum) this.value = maximum;
 
                    if (IsHandleCreated) {
                        SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
                        UpdatePos() ; 
                    }
                } 
            }
        }

        ///  
        /// 
        ///     
        ///       Gets or sets the minimum value of the . 
        ///    
        ///  
        [
        DefaultValue(0),
        SRCategory(SR.CatBehavior),
        RefreshProperties(RefreshProperties.Repaint), 
        SRDescription(SR.ProgressBarMinimumDescr)
        ] 
        public int Minimum { 
            get {
                return minimum; 
            }
            set {
                if (minimum != value) {
                    // Ensure that value is in the Win32 control's acceptable range 
                    // Message: '%1' is not a valid value for '%0'. '%0' must be greater than %2.
                    // Should this set a boundary for the top end too? 
                    if (value < 0) 
                        throw new ArgumentOutOfRangeException("Minimum", SR.GetString(SR.InvalidLowBoundArgumentEx, "Minimum", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
                    if (maximum < value) maximum = value; 

                    minimum = value;

                    if (this.value < minimum) this.value = minimum; 

                    if (IsHandleCreated) { 
                        SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
                        UpdatePos() ;
                    } 
                }
            }
        }
 
        protected override void OnBackColorChanged(EventArgs e)
        { 
            base.OnBackColorChanged(e); 
            if (IsHandleCreated)
            { 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            }
        }
 
        protected override void OnForeColorChanged(EventArgs e)
        { 
            base.OnForeColorChanged(e); 
            if (IsHandleCreated)
            { 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor));
            }
        }
 
        /// 
        ///  
        ///     
        ///    [To be supplied.]
        ///     
        /// 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ] 
        public new Padding Padding { 
            get { return base.Padding; }
            set { base.Padding = value;} 
        }

        [
        Browsable(false), 
        EditorBrowsable(EditorBrowsableState.Never)
        ] 
        public new event EventHandler PaddingChanged { 
            add { base.PaddingChanged += value; }
            remove { base.PaddingChanged -= value; } 
        }

        /// 
        ///  
        ///     This is used for international applications where the language
        ///     is written from RightToLeft. When this property is true, 
        //      and the RightToLeft is true, mirroring will be turned on on the form, and 
        ///     control placement and text will be from right to left.
        ///  
        [
        SRCategory(SR.CatAppearance),
        Localizable(true),
        DefaultValue(false), 
        SRDescription(SR.ControlRightToLeftLayoutDescr)
        ] 
        public virtual bool RightToLeftLayout { 
            get {
 
                return rightToLeftLayout;
            }

            set { 
                if (value != rightToLeftLayout) {
                    rightToLeftLayout = value; 
                    using(new LayoutTransaction(this, this, PropertyNames.RightToLeftLayout)) { 
                        OnRightToLeftLayoutChanged(EventArgs.Empty);
                    } 
                }
            }
        }
 

        ///  
        ///  
        ///    [To be supplied.]
        ///  
        [SRCategory(SR.CatPropertyChanged), SRDescription(SR.ControlOnRightToLeftLayoutChangedDescr)]
        public event EventHandler RightToLeftLayoutChanged {
            add {
                onRightToLeftLayoutChanged += value; 
            }
            remove { 
                onRightToLeftLayoutChanged -= value; 
            }
        } 

        /// 
        /// 
        ///     
        ///       Gets or sets the amount that a call to 
        ///       increases the progress bar's current position. 
        ///     
        /// 
        [ 
        DefaultValue(10),
        SRCategory(SR.CatBehavior),
        SRDescription(SR.ProgressBarStepDescr)
        ] 
        public int Step {
            get { 
                return step; 
            }
            set { 
                step = value;
                if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETSTEP, step, 0);
            }
        } 

        ///  
        ///  
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public bool TabStop {
            get {
                return base.TabStop; 
            }
            set { 
                base.TabStop = value; 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler TabStopChanged {
            add { 
                base.TabStopChanged += value; 
            }
            remove { 
                base.TabStopChanged -= value;
            }
        }
 
        /// 
        ///  
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), Bindable(false)] 
        public override string Text {
            get {
                return base.Text;
            } 
            set {
                base.Text = value; 
            } 
        }
 
        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler TextChanged { 
            add {
                base.TextChanged += value; 
            } 
            remove {
                base.TextChanged -= value; 
            }
        }

        ///  
        /// 
        ///     
        ///       Gets or sets the current position of the . 
        ///    
        ///  
        [
        DefaultValue(0),
        SRCategory(SR.CatBehavior),
        Bindable(true), 
        SRDescription(SR.ProgressBarValueDescr)
        ] 
        public int Value { 
            get {
                return value; 
            }
            set {
                if (this.value != value) {
                    if ((value < minimum) || (value > maximum)) 
                        throw new ArgumentOutOfRangeException("Value", SR.GetString(SR.InvalidBoundArgument, "Value", value.ToString(CultureInfo.CurrentCulture), "'minimum'", "'maximum'"));
                    this.value = value; 
                    UpdatePos() ; 
                }
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler DoubleClick { 
            add { 
                base.DoubleClick += value;
            } 
            remove {
                base.DoubleClick -= value;
            }
        } 

        ///  
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event MouseEventHandler MouseDoubleClick { 
            add {
                base.MouseDoubleClick += value;
            }
            remove { 
                base.MouseDoubleClick -= value;
            } 
        } 

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyEventHandler KeyUp {
            add { 
                base.KeyUp += value;
            } 
            remove { 
                base.KeyUp -= value;
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyEventHandler KeyDown { 
            add { 
                base.KeyDown += value;
            } 
            remove {
                base.KeyDown -= value;
            }
        } 

        ///  
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyPressEventHandler KeyPress { 
            add {
                base.KeyPress += value;
            }
            remove { 
                base.KeyPress -= value;
            } 
        } 

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler Enter {
            add { 
                base.Enter += value;
            } 
            remove { 
                base.Enter -= value;
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler Leave { 
            add { 
                base.Leave += value;
            } 
            remove {
                base.Leave -= value;
            }
        } 

        ///  
        ///  
        ///     ProgressBar Onpaint.
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event PaintEventHandler Paint {
            add { 
                base.Paint += value;
            } 
            remove { 
                base.Paint -= value;
            } 
        }


        ///  
        /// 
        ///  
        ///  
        protected override void CreateHandle() {
            if (!RecreatingHandle) { 
                IntPtr userCookie = UnsafeNativeMethods.ThemingScope.Activate();
                try {
                    NativeMethods.INITCOMMONCONTROLSEX icc = new NativeMethods.INITCOMMONCONTROLSEX();
                    icc.dwICC = NativeMethods.ICC_PROGRESS_CLASS; 
                    SafeNativeMethods.InitCommonControlsEx(icc);
                } 
                finally { 
                    UnsafeNativeMethods.ThemingScope.Deactivate(userCookie);
                } 
            }
            base.CreateHandle();
        }
 
        /// 
        ///  
        ///     
        ///       Advances the current position of the  by the
        ///       specified increment and redraws the control to reflect the new position. 
        ///    
        /// 
        public void Increment(int value) {
            if (this.Style == ProgressBarStyle.Marquee) { 
                throw new InvalidOperationException(SR.GetString(SR.ProgressBarIncrementMarqueeException));
            } 
            this.value += value; 

            // Enforce that value is within the range (minimum, maximum) 
            if (this.value < minimum) {
                this.value = minimum;
            }
            if (this.value > maximum) { 
                this.value = maximum;
            } 
 
            UpdatePos();
        } 

        /// 
        /// 
        ///    Overridden to set up our properties. 
        /// 
        ///  
        protected override void OnHandleCreated(EventArgs e) { 
            base.OnHandleCreated(e);
            SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
            SendMessage(NativeMethods.PBM_SETSTEP, step, 0);
            SendMessage(NativeMethods.PBM_SETPOS, value, 0);
            UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor)); 
            StartMarquee();
            SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(UserPreferenceChangedHandler); 
        } 

        ///  
        /// 
        ///    Overridden to remove event handler.
        /// 
        ///  
        protected override void OnHandleDestroyed(EventArgs e)
        { 
            SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(UserPreferenceChangedHandler); 
            base.OnHandleDestroyed(e);
        } 

        /// 
        /// 
        ///    [To be supplied.] 
        /// 
        [EditorBrowsable(EditorBrowsableState.Advanced)] 
        protected virtual void OnRightToLeftLayoutChanged(EventArgs e) { 
            if (GetAnyDisposingInHierarchy()) {
                return; 
            }

            if (RightToLeft == RightToLeft.Yes) {
                RecreateHandle(); 
            }
 
            if (onRightToLeftLayoutChanged != null) { 
                 onRightToLeftLayoutChanged(this, e);
            } 
        }


 
        /// 
        ///  
        ///     
        ///       Advances the current position of the 
        ///       by the amount of the  
        ///       property, and redraws the control to reflect the new position.
        ///    
        /// 
        public void PerformStep() { 
            if (this.Style == ProgressBarStyle.Marquee) {
                throw new InvalidOperationException(SR.GetString(SR.ProgressBarPerformStepMarqueeException)); 
            } 
            Increment(step);
        } 

        /// 
        /// 
        ///     Resets the fore color to be based on the parent's fore color. 
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        public override void ResetForeColor() { 
            ForeColor = defaultForeColor;
        } 


        /// 
        ///  
        ///     Returns true if the ForeColor should be persisted in code gen.
        ///  
        [EditorBrowsable(EditorBrowsableState.Never)] 
        internal override bool ShouldSerializeForeColor() {
            return ForeColor != defaultForeColor; 
        }


        ///  
        /// 
        ///    Returns a string representation for this control. 
        ///  
        /// 
        public override string ToString() { 

            string s = base.ToString();
            return s + ", Minimum: " + Minimum.ToString(CultureInfo.CurrentCulture) + ", Maximum: " + Maximum.ToString(CultureInfo.CurrentCulture) + ", Value: " + Value.ToString(CultureInfo.CurrentCulture);
        } 

        ///  
        ///  
        ///     Sends the underlying window a PBM_SETPOS message to update
        ///     the current value of the progressbar. 
        /// 
        /// 
        private void UpdatePos() {
            if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETPOS, value, 0); 
        }
 
        //Note: ProgressBar doesn't work like other controls as far as setting ForeColor/ 
        //BackColor -- you need to send messages to update the colors
        private void UserPreferenceChangedHandler(object o, UserPreferenceChangedEventArgs e) 
        {
            if (IsHandleCreated)
            {
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor)); 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            } 
        } 
    }
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

/* 
 */ 
namespace System.Windows.Forms {
    using System.Runtime.Serialization.Formatters; 
    using System.Runtime.Remoting;
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis;
    using System; 
    using System.Security.Permissions;
    using System.Drawing; 
    using System.ComponentModel; 
    using System.ComponentModel.Design;
    using System.Windows.Forms; 
    using Microsoft.Win32;
    using System.Runtime.InteropServices;
    using System.Windows.Forms.Layout;
    using System.Globalization; 

    ///  
    ///  
    ///    
    ///       Represents a Windows progress bar control. 
    ///    
    /// 
    [
    ComVisible(true), 
    ClassInterface(ClassInterfaceType.AutoDispatch),
    DefaultProperty("Value"), 
    DefaultBindingProperty("Value"), 
    SRDescription(SR.DescriptionProgressBar)
    ] 
    public class ProgressBar : Control {


        //# VS7 205: simcooke 
        //REMOVED: AddOnValueChanged, RemoveOnValueChanged, OnValueChanged and all designer plumbing associated with it.
        //         OnValueChanged event no longer exists. 
 
        // these four values define the range of possible values, how to navigate
        // through them, and the current position 
        //
        private int minimum = 0;
        private int maximum = 100;
        private int step = 10; 
        private int value = 0;
 
        //this defines marquee animation speed 
        private int marqueeSpeed = 100;
 
        private Color defaultForeColor = SystemColors.Highlight;

        private ProgressBarStyle style = ProgressBarStyle.Blocks;
 
        private EventHandler onRightToLeftLayoutChanged;
        private bool rightToLeftLayout = false; 
 

        ///  
        /// 
        ///    
        ///       Initializes a new instance of the  class in its default
        ///       state. 
        ///    
        ///  
        public ProgressBar() 
        : base() {
            SetStyle(ControlStyles.UserPaint | 
                     ControlStyles.UseTextForAccessibility |
                     ControlStyles.Selectable, false);
            ForeColor = defaultForeColor;
        } 

        ///  
        ///  
        /// 
        ///     
        ///       This is called when creating a window. Inheriting classes can ovveride
        ///       this to add extra functionality, but should not forget to first call
        ///       base.getCreateParams() to make sure the control continues to work
        ///       correctly. 
        ///    
        ///  
        protected override CreateParams CreateParams { 
            [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
            get { 
                CreateParams cp = base.CreateParams;
                cp.ClassName = NativeMethods.WC_PROGRESS;
                if (this.Style == ProgressBarStyle.Continuous) {
                    cp.Style |= NativeMethods.PBS_SMOOTH; 
                }
                else if (this.Style == ProgressBarStyle.Marquee && !DesignMode) { 
                    cp.Style |= NativeMethods.PBS_MARQUEE; 
                }
 
                if (RightToLeft == RightToLeft.Yes && RightToLeftLayout == true) {
                    //We want to turn on mirroring for Form explicitly.
                    cp.ExStyle |= NativeMethods.WS_EX_LAYOUTRTL;
                    //Don't need these styles when mirroring is turned on. 
                    cp.ExStyle &= ~(NativeMethods.WS_EX_RTLREADING | NativeMethods.WS_EX_RIGHT | NativeMethods.WS_EX_LEFTSCROLLBAR);
                } 
                return cp; 
            }
        } 

        /// 
        /// 
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public override bool AllowDrop { 
            get {
                return base.AllowDrop; 
            }
            set {
                base.AllowDrop = value;
            } 
        }
 
        ///  
        /// 
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public override Image BackgroundImage {
            get { 
                return base.BackgroundImage;
            } 
            set { 
                base.BackgroundImage = value;
            } 
        }


        ///  
        /// 
        ///     
        ///       Gets or sets the style of the ProgressBar. This is can be either Blocks or Continuous. 
        ///    
        ///  
        [
        Browsable(true),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(ProgressBarStyle.Blocks), 
        SRCategory(SR.CatBehavior),
        SRDescription(SR.ProgressBarStyleDescr) 
        ] 
        public ProgressBarStyle Style {
            get { 
                return style;
            }
            set {
                if (style != value) { 
                    //valid values are 0x0 to 0x2
                    if (!ClientUtils.IsEnumValid(value, (int)value, (int)ProgressBarStyle.Blocks, (int)ProgressBarStyle.Marquee)){ 
                        throw new InvalidEnumArgumentException("value", (int)value, typeof(ProgressBarStyle)); 
                    }
                    style = value; 
                    if (IsHandleCreated)
                        RecreateHandle();
                    if (style == ProgressBarStyle.Marquee)
                    { 
                        StartMarquee();
                    } 
                } 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler BackgroundImageChanged {
            add { 
                base.BackgroundImageChanged += value; 
            }
            remove { 
                base.BackgroundImageChanged -= value;
            }
        }
 

        ///  
        ///  
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public override ImageLayout BackgroundImageLayout {
            get {
                return base.BackgroundImageLayout; 
            }
            set { 
                base.BackgroundImageLayout = value; 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler BackgroundImageLayoutChanged {
            add { 
                base.BackgroundImageLayoutChanged += value; 
            }
            remove { 
                base.BackgroundImageLayoutChanged -= value;
            }
        }
 

        ///  
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public new bool CausesValidation {
            get {
                return base.CausesValidation;
            } 
            set {
                base.CausesValidation = value; 
            } 
        }
 
        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler CausesValidationChanged { 
            add {
                base.CausesValidationChanged += value; 
            } 
            remove {
                base.CausesValidationChanged -= value; 
            }
        }

        ///  
        protected override ImeMode DefaultImeMode {
            get { 
                return ImeMode.Disable; 
            }
        } 

        /// 
        /// 
        ///     Deriving classes can override this to configure a default size for their control. 
        ///     This is more efficient than setting the size in the control's constructor.
        ///  
        protected override Size DefaultSize { 
            get {
                return new Size(100, 23); 
            }
        }

        ///  
        /// 
        ///     This property is overridden and hidden from statement completion 
        ///     on controls that are based on Win32 Native Controls. 
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        protected override bool DoubleBuffered {
            get {
                return base.DoubleBuffered;
            } 
            set {
                base.DoubleBuffered = value; 
            } 
        }
 
        /// 
        /// 
        ///    
        ///       Gets or sets the font of text in the . 
        ///    
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public override Font Font {
            get { 
                return base.Font;
            }
            set {
                base.Font = value; 
            }
        } 
 
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler FontChanged {
            add {
                base.FontChanged += value; 
            }
            remove { 
                base.FontChanged -= value; 
            }
        } 

        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public ImeMode ImeMode { 
            get {
                return base.ImeMode; 
            } 
            set {
                base.ImeMode = value; 
            }
        }

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        public new event EventHandler ImeModeChanged { 
            add {
                base.ImeModeChanged += value; 
            }
            remove {
                base.ImeModeChanged -= value;
            } 
        }
 
        ///  
        ///    
        ///       Gets or sets the marquee animation speed of the . 
        ///       Sets the value to a positive number causes the progressBar to move, while setting it to 0
        ///       stops the progressBar.
        ///    
        ///  
        [
        DefaultValue(100), 
        SRCategory(SR.CatBehavior), 
        SRDescription(SR.ProgressBarMarqueeAnimationSpeed)]
        public int MarqueeAnimationSpeed { 
            get {
                return marqueeSpeed;
            }
            [SuppressMessage("Microsoft.Usage", "CA2208:InstantiateArgumentExceptionsCorrectly")] 
            set {
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("MarqueeAnimationSpeed must be non-negative"); 
                }
                marqueeSpeed = value; 
                if (!DesignMode) {
                    StartMarquee();
                }
            } 
        }
 
        ///  
        /// 
        ///     
        ///       Start the Marquee rolling (or stop it, if the speed = 0)
        ///    
        /// 
        private void StartMarquee() 
        {
            if (IsHandleCreated && style == ProgressBarStyle.Marquee) 
            { 
                if (marqueeSpeed == 0)
                { 
                    SendMessage(NativeMethods.PBM_SETMARQUEE, 0, marqueeSpeed);
                }
                else
                { 
                    SendMessage(NativeMethods.PBM_SETMARQUEE, 1, marqueeSpeed);
                } 
            } 
        }
 
        /// 
        /// 
        ///    
        ///       Gets or sets the maximum value of the . 
        ///       Gets or sets the maximum value of the .
        ///     
        ///  
        [
        DefaultValue(100), 
        SRCategory(SR.CatBehavior),
        RefreshProperties(RefreshProperties.Repaint),
        SRDescription(SR.ProgressBarMaximumDescr)
        ] 
        public int Maximum {
            get { 
                return maximum; 
            }
            set { 
                if (maximum != value) {
                    // Ensure that value is in the Win32 control's acceptable range
                    // Message: '%1' is not a valid value for '%0'. '%0' must be greater than %2.
                    // Should this set a boundary for the top end too? 
                    if (value < 0)
                        throw new ArgumentOutOfRangeException("Maximum", SR.GetString(SR.InvalidLowBoundArgumentEx, "Maximum", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture))); 
 
                    if (minimum > value) minimum = value;
 
                    maximum = value;

                    if (this.value > maximum) this.value = maximum;
 
                    if (IsHandleCreated) {
                        SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
                        UpdatePos() ; 
                    }
                } 
            }
        }

        ///  
        /// 
        ///     
        ///       Gets or sets the minimum value of the . 
        ///    
        ///  
        [
        DefaultValue(0),
        SRCategory(SR.CatBehavior),
        RefreshProperties(RefreshProperties.Repaint), 
        SRDescription(SR.ProgressBarMinimumDescr)
        ] 
        public int Minimum { 
            get {
                return minimum; 
            }
            set {
                if (minimum != value) {
                    // Ensure that value is in the Win32 control's acceptable range 
                    // Message: '%1' is not a valid value for '%0'. '%0' must be greater than %2.
                    // Should this set a boundary for the top end too? 
                    if (value < 0) 
                        throw new ArgumentOutOfRangeException("Minimum", SR.GetString(SR.InvalidLowBoundArgumentEx, "Minimum", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
                    if (maximum < value) maximum = value; 

                    minimum = value;

                    if (this.value < minimum) this.value = minimum; 

                    if (IsHandleCreated) { 
                        SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
                        UpdatePos() ;
                    } 
                }
            }
        }
 
        protected override void OnBackColorChanged(EventArgs e)
        { 
            base.OnBackColorChanged(e); 
            if (IsHandleCreated)
            { 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            }
        }
 
        protected override void OnForeColorChanged(EventArgs e)
        { 
            base.OnForeColorChanged(e); 
            if (IsHandleCreated)
            { 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor));
            }
        }
 
        /// 
        ///  
        ///     
        ///    [To be supplied.]
        ///     
        /// 
        [
        Browsable(false),
        EditorBrowsable(EditorBrowsableState.Never), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
        ] 
        public new Padding Padding { 
            get { return base.Padding; }
            set { base.Padding = value;} 
        }

        [
        Browsable(false), 
        EditorBrowsable(EditorBrowsableState.Never)
        ] 
        public new event EventHandler PaddingChanged { 
            add { base.PaddingChanged += value; }
            remove { base.PaddingChanged -= value; } 
        }

        /// 
        ///  
        ///     This is used for international applications where the language
        ///     is written from RightToLeft. When this property is true, 
        //      and the RightToLeft is true, mirroring will be turned on on the form, and 
        ///     control placement and text will be from right to left.
        ///  
        [
        SRCategory(SR.CatAppearance),
        Localizable(true),
        DefaultValue(false), 
        SRDescription(SR.ControlRightToLeftLayoutDescr)
        ] 
        public virtual bool RightToLeftLayout { 
            get {
 
                return rightToLeftLayout;
            }

            set { 
                if (value != rightToLeftLayout) {
                    rightToLeftLayout = value; 
                    using(new LayoutTransaction(this, this, PropertyNames.RightToLeftLayout)) { 
                        OnRightToLeftLayoutChanged(EventArgs.Empty);
                    } 
                }
            }
        }
 

        ///  
        ///  
        ///    [To be supplied.]
        ///  
        [SRCategory(SR.CatPropertyChanged), SRDescription(SR.ControlOnRightToLeftLayoutChangedDescr)]
        public event EventHandler RightToLeftLayoutChanged {
            add {
                onRightToLeftLayoutChanged += value; 
            }
            remove { 
                onRightToLeftLayoutChanged -= value; 
            }
        } 

        /// 
        /// 
        ///     
        ///       Gets or sets the amount that a call to 
        ///       increases the progress bar's current position. 
        ///     
        /// 
        [ 
        DefaultValue(10),
        SRCategory(SR.CatBehavior),
        SRDescription(SR.ProgressBarStepDescr)
        ] 
        public int Step {
            get { 
                return step; 
            }
            set { 
                step = value;
                if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETSTEP, step, 0);
            }
        } 

        ///  
        ///  
        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public bool TabStop {
            get {
                return base.TabStop; 
            }
            set { 
                base.TabStop = value; 
            }
        } 

        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
        new public event EventHandler TabStopChanged {
            add { 
                base.TabStopChanged += value; 
            }
            remove { 
                base.TabStopChanged -= value;
            }
        }
 
        /// 
        ///  
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), Bindable(false)] 
        public override string Text {
            get {
                return base.Text;
            } 
            set {
                base.Text = value; 
            } 
        }
 
        /// 
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        new public event EventHandler TextChanged { 
            add {
                base.TextChanged += value; 
            } 
            remove {
                base.TextChanged -= value; 
            }
        }

        ///  
        /// 
        ///     
        ///       Gets or sets the current position of the . 
        ///    
        ///  
        [
        DefaultValue(0),
        SRCategory(SR.CatBehavior),
        Bindable(true), 
        SRDescription(SR.ProgressBarValueDescr)
        ] 
        public int Value { 
            get {
                return value; 
            }
            set {
                if (this.value != value) {
                    if ((value < minimum) || (value > maximum)) 
                        throw new ArgumentOutOfRangeException("Value", SR.GetString(SR.InvalidBoundArgument, "Value", value.ToString(CultureInfo.CurrentCulture), "'minimum'", "'maximum'"));
                    this.value = value; 
                    UpdatePos() ; 
                }
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler DoubleClick { 
            add { 
                base.DoubleClick += value;
            } 
            remove {
                base.DoubleClick -= value;
            }
        } 

        ///  
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event MouseEventHandler MouseDoubleClick { 
            add {
                base.MouseDoubleClick += value;
            }
            remove { 
                base.MouseDoubleClick -= value;
            } 
        } 

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyEventHandler KeyUp {
            add { 
                base.KeyUp += value;
            } 
            remove { 
                base.KeyUp -= value;
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyEventHandler KeyDown { 
            add { 
                base.KeyDown += value;
            } 
            remove {
                base.KeyDown -= value;
            }
        } 

        ///  
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event KeyPressEventHandler KeyPress { 
            add {
                base.KeyPress += value;
            }
            remove { 
                base.KeyPress -= value;
            } 
        } 

        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler Enter {
            add { 
                base.Enter += value;
            } 
            remove { 
                base.Enter -= value;
            } 
        }

        /// 
        ///  
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event EventHandler Leave { 
            add { 
                base.Leave += value;
            } 
            remove {
                base.Leave -= value;
            }
        } 

        ///  
        ///  
        ///     ProgressBar Onpaint.
        ///  
        /// 
        [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
        public new event PaintEventHandler Paint {
            add { 
                base.Paint += value;
            } 
            remove { 
                base.Paint -= value;
            } 
        }


        ///  
        /// 
        ///  
        ///  
        protected override void CreateHandle() {
            if (!RecreatingHandle) { 
                IntPtr userCookie = UnsafeNativeMethods.ThemingScope.Activate();
                try {
                    NativeMethods.INITCOMMONCONTROLSEX icc = new NativeMethods.INITCOMMONCONTROLSEX();
                    icc.dwICC = NativeMethods.ICC_PROGRESS_CLASS; 
                    SafeNativeMethods.InitCommonControlsEx(icc);
                } 
                finally { 
                    UnsafeNativeMethods.ThemingScope.Deactivate(userCookie);
                } 
            }
            base.CreateHandle();
        }
 
        /// 
        ///  
        ///     
        ///       Advances the current position of the  by the
        ///       specified increment and redraws the control to reflect the new position. 
        ///    
        /// 
        public void Increment(int value) {
            if (this.Style == ProgressBarStyle.Marquee) { 
                throw new InvalidOperationException(SR.GetString(SR.ProgressBarIncrementMarqueeException));
            } 
            this.value += value; 

            // Enforce that value is within the range (minimum, maximum) 
            if (this.value < minimum) {
                this.value = minimum;
            }
            if (this.value > maximum) { 
                this.value = maximum;
            } 
 
            UpdatePos();
        } 

        /// 
        /// 
        ///    Overridden to set up our properties. 
        /// 
        ///  
        protected override void OnHandleCreated(EventArgs e) { 
            base.OnHandleCreated(e);
            SendMessage(NativeMethods.PBM_SETRANGE32, minimum, maximum); 
            SendMessage(NativeMethods.PBM_SETSTEP, step, 0);
            SendMessage(NativeMethods.PBM_SETPOS, value, 0);
            UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor)); 
            StartMarquee();
            SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(UserPreferenceChangedHandler); 
        } 

        ///  
        /// 
        ///    Overridden to remove event handler.
        /// 
        ///  
        protected override void OnHandleDestroyed(EventArgs e)
        { 
            SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(UserPreferenceChangedHandler); 
            base.OnHandleDestroyed(e);
        } 

        /// 
        /// 
        ///    [To be supplied.] 
        /// 
        [EditorBrowsable(EditorBrowsableState.Advanced)] 
        protected virtual void OnRightToLeftLayoutChanged(EventArgs e) { 
            if (GetAnyDisposingInHierarchy()) {
                return; 
            }

            if (RightToLeft == RightToLeft.Yes) {
                RecreateHandle(); 
            }
 
            if (onRightToLeftLayoutChanged != null) { 
                 onRightToLeftLayoutChanged(this, e);
            } 
        }


 
        /// 
        ///  
        ///     
        ///       Advances the current position of the 
        ///       by the amount of the  
        ///       property, and redraws the control to reflect the new position.
        ///    
        /// 
        public void PerformStep() { 
            if (this.Style == ProgressBarStyle.Marquee) {
                throw new InvalidOperationException(SR.GetString(SR.ProgressBarPerformStepMarqueeException)); 
            } 
            Increment(step);
        } 

        /// 
        /// 
        ///     Resets the fore color to be based on the parent's fore color. 
        /// 
        [EditorBrowsable(EditorBrowsableState.Never)] 
        public override void ResetForeColor() { 
            ForeColor = defaultForeColor;
        } 


        /// 
        ///  
        ///     Returns true if the ForeColor should be persisted in code gen.
        ///  
        [EditorBrowsable(EditorBrowsableState.Never)] 
        internal override bool ShouldSerializeForeColor() {
            return ForeColor != defaultForeColor; 
        }


        ///  
        /// 
        ///    Returns a string representation for this control. 
        ///  
        /// 
        public override string ToString() { 

            string s = base.ToString();
            return s + ", Minimum: " + Minimum.ToString(CultureInfo.CurrentCulture) + ", Maximum: " + Maximum.ToString(CultureInfo.CurrentCulture) + ", Value: " + Value.ToString(CultureInfo.CurrentCulture);
        } 

        ///  
        ///  
        ///     Sends the underlying window a PBM_SETPOS message to update
        ///     the current value of the progressbar. 
        /// 
        /// 
        private void UpdatePos() {
            if (IsHandleCreated) SendMessage(NativeMethods.PBM_SETPOS, value, 0); 
        }
 
        //Note: ProgressBar doesn't work like other controls as far as setting ForeColor/ 
        //BackColor -- you need to send messages to update the colors
        private void UserPreferenceChangedHandler(object o, UserPreferenceChangedEventArgs e) 
        {
            if (IsHandleCreated)
            {
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBARCOLOR, 0, ColorTranslator.ToWin32(ForeColor)); 
                UnsafeNativeMethods.SendMessage(new HandleRef(this, Handle), NativeMethods.PBM_SETBKCOLOR, 0, ColorTranslator.ToWin32(BackColor));
            } 
        } 
    }
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK