Exemple #1
0
                    //    _background.Dispose();
                    //    _background = _bmp;
                    //    _bmp = null;
                    //}
        protected virtual bool RedrawBackgroundIfRequired(bool force = false)
        {

            //if (!force && lineLength == _lastLineLength && _background != null && this.Size.Equals(_backgroundSize) && this.BackColor.Equals(_backgroundBackColor))
            //{
            //    return false;
            //}

            Graphics dc;


            if (!redraw && _background != null && this.Size.Equals(_backgroundSize) && this.BackColor.Equals(_backgroundBackColor))
            {
                return false;
                // We can skip redrawing the background, since the line is just getting bigger
                // dc = Graphics.FromImage(_background);
            }
            else
            {
                int ShadowSkipLeft = (ShadowLeft ? 0 : 6);
                int ShadowSkipRight = (ShadowRight ? 0 : 6);

                if (_background != null)
                {
                    _background.Dispose();
                }

                if (this.GreenPartition_Left == null || hue != lastHue || saturation != lastSaturation || luminance != lastLuminance)
                {
                    lastHue = hue;
                    lastLuminance = luminance;
                    lastSaturation = saturation;

                    GreenPartition_Left = CSharpFilters.ColorSpace.Hue(VhdDirectorApp.Properties.Resources.GreenPartition_Left, hue, saturation, luminance);
                    GreenPartition_Right = CSharpFilters.ColorSpace.Hue(VhdDirectorApp.Properties.Resources.GreenPartition_Right, hue, saturation, luminance);
                    GreenPartition_Fill_Unused = CSharpFilters.ColorSpace.Hue(VhdDirectorApp.Properties.Resources.GreenPartition_Fill_Unused, hue, saturation, luminance);

                }

                _background = new Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                dc = Graphics.FromImage(_background);
                {

                    // Draw Partition

                    using (Brush brushBackColor = new SolidBrush(BackColor))
                    {
                        dc.FillRectangle(brushBackColor, ClientRectangle);  // NB: Using ClientRectangle, not Size. Should we change the size checks and events to match?
                    }

                    // Clipping - http://codeidol.com/csharp/windows-forms-programming/Drawing-Basics/Images/
                    // Clip the image to the destination rectangle

                    //Rectangle srcRect = new Rectangle(...);
                    //Rectangle destRect = srcRect;
                    //g.DrawImage(bmp, destRect, srcRect, g.PageUnit);

                    int x = 0;

                    // PartitionLeft
                    {
                        Rectangle srcRect = new Rectangle(new Point(0, 0), this.GreenPartition_Left.Size);
                        Rectangle dstRect = srcRect;
                        if (ShadowSkipLeft > 0)
                        {
                            srcRect.X += ShadowSkipLeft;
                            srcRect.Width -= ShadowSkipLeft;
                            dstRect.Width -= ShadowSkipLeft;
                        }


                        dc.DrawImage(this.GreenPartition_Left, dstRect, srcRect, GraphicsUnit.Pixel);
                        x += this.GreenPartition_Left.Width - ShadowSkipLeft;
                    }

                    // PartitionFill

                    int RightWidth = this.GreenPartition_Right.Width - ShadowSkipRight;
                    for (int i = x; i < ClientRectangle.Width - RightWidth; i += this.GreenPartition_Fill_Unused.Width)
                    {

                        {
                            if (i + this.GreenPartition_Fill_Unused.Width < ClientRectangle.Width - RightWidth)
                            {
                                dc.DrawImageUnscaled(this.GreenPartition_Fill_Unused, i, 0);
                            }
                            else
                            {
                                dc.DrawImageUnscaledAndClipped(this.GreenPartition_Fill_Unused, new Rectangle(i, 0, ClientRectangle.Width - RightWidth - i, this.GreenPartition_Fill_Unused.Height));
                            }
                        }
                    }

                    // PartitionRight

                    // dc.DrawImageUnscaled(this.GreenPartition_Left, 0, 0);
                    // Outer Border
                    dc.DrawImageUnscaled(this.GreenPartition_Right, ClientRectangle.Width - RightWidth, 0);



                    //}

                    //// 0.25F = Burnt Orange
                    //// 0.40F = Yellow
                    //// 2.80F = Upside-down Sunrise
                    //// 0.6 Lime
                    //// 0.4 Gold
                    //// 0.3 Bronze
                    //// 0.2 Orange
                    //// 0.1 Red
                    //// 1.4 Blue
                    //// 1.6 Indigo


                    redraw = false;

                    // Draw white progress hole

                    if (ProgressBar)
                    {
                        // using (Graphics dc = Graphics.FromImage(_background))
                        {

                            // Outer Border
                            // dc.DrawImageUnscaled(Resources.PartitionBar_Left, 0, 0);

                            {
                                Rectangle srcRect = new Rectangle(new Point(0, 0), Resources.PartitionBar_Left.Size);
                                Rectangle dstRect = srcRect;
                                if (ShadowSkipLeft > 0)
                                {
                                    srcRect.X += ShadowSkipLeft;
                                    srcRect.Width -= ShadowSkipLeft;
                                    dstRect.Width -= ShadowSkipLeft;
                                }


                                dc.DrawImage(Resources.PartitionBar_Left, dstRect, srcRect, GraphicsUnit.Pixel);
                                // x += this.GreenPartition_Left.Width - ShadowSkipLeft;
                            }

                            int startX = Resources.PartitionBar_Left.Width - ShadowSkipLeft;
                            int endX = ClientRectangle.Width - Resources.PartitionBar_Right.Width + ShadowSkipRight;

                            for (int i = startX; i < endX; i += Resources.PartitionBar_Fill_Unused.Width)
                            {
                                if (i + Resources.PartitionBar_Fill_Unused.Width < endX)
                                {
                                    dc.DrawImageUnscaled(Resources.PartitionBar_Fill_Unused, i, 0);
                                }
                                else
                                {
                                    dc.DrawImageUnscaledAndClipped(Resources.PartitionBar_Fill_Unused, new Rectangle(i, 0, endX - i, Resources.PartitionBar_Fill_Unused.Height));
                                }
                            }
                            dc.DrawImageUnscaled(Resources.PartitionBar_Right, endX, 0);

                        }
                    }

                    // return false;

                }
#if true
                if (ProgressBar)
                {

                    // Progress Bar (Inner)
                    // int startX = Resources.InnerLeft.Width - ShadowSkipLeft;
                    // int endX = ClientRectangle.Width - Resources.InnerRight.Width + ShadowSkipLeft + ShadowSkipRight;

                    int innerMargin = 16; // 16 pixels to start or end of where the black line is drawn (13 pixels to start/end of white space itself)
                    int innerLeftPadding = innerMargin + Resources.InnerLeft.Width - ShadowSkipLeft;
                    int innerRightPadding = innerMargin + Resources.InnerRight.Width - ShadowSkipRight;
                    int innerStart = innerLeftPadding;
                    int innerEnd = Width - innerRightPadding;
                    int fillPixels = innerEnd - innerStart;
                    double pixelsPerUnit = (_maximum - 3D) / fillPixels; // Maximum = Full (with closing corner), 0 = No inner line, 1 = opening corner. (hence, -3).
                    int lineLength = (int)(fillPixels * pixelsPerUnit * _value); // +6;

                    // Progress bar
                    // using (Graphics dc = Graphics.FromImage(_background))
                    {

                        // BitArray shaded progress bar
                        if (bitArray != null)
                        {

                            // Draw opening curve?
                            if (bitArray.Get(0))
                            {
                                dc.DrawImageUnscaled(Resources.InnerLeft, innerStart - Resources.InnerLeft.Width, 56);
                            }

                            // Draw the progress line using BitArrayBar
                            if (babar == null)
                            {
                                babar = new BitArrayBar();

                                babar.SuspendLayout();
                                babar.Group256 = true;
                                babar.Height = 6;
                                babar.FalseColor = Color.White;
                                babar.TrueColor = Color.Black;
                                babar.ba = bitArray;
                                babar.MakeBitmap();
                                this._value = babar.baValue;
                                this._maximum = babar.baMaximum;
                                babar.ResumeLayout();
                            }
                            babar.Width = fillPixels;

                            using (Bitmap baBitmap = babar.MakeScreenBitmap())
                            {
                                // dc.DrawImageUnscaled(baBitmap, innerStart, 4);
                                dc.DrawImageUnscaled(baBitmap, innerStart, 60);
                            }




                            // Draw closing curve?
#if false
                        if (bitArray.Get(bitArray.Length - 1))
                        {
                            dc.DrawImageUnscaled(Resources.InnerRight, innerEnd, 0);

                        }
#endif


                        }
                        else
                        {
                            // Standard linear progress bar

                            // Draw opening curve?
                            if (_value > 0)
                            {
                                dc.DrawImageUnscaled(Resources.InnerLeft, innerMargin, 56);
                                for (int i = innerStart; i < lineLength; i++)
                                {
                                    dc.DrawImageUnscaled(Resources.InnerFill, i, 56);
                                }
                            }

                            // Draw closing curve?
                            if (_value > 0 && _value >= _maximum)
                            {
                                dc.DrawImageUnscaled(Resources.InnerRight, innerEnd, 56);
                            }
                        }
                    }

                    // _lastLineLength = lineLength;
#endif
                }
            }
            dc.Dispose();

            if (bufferInvalidated != null)
            {
                bufferInvalidated(this, _background);
            }
            _backgroundSize = Size;
            _backgroundBackColor = BackColor;
            return true;
        }
        protected virtual bool RedrawBackgroundIfRequired(bool force = false)
        {
            // Progress Bar (Inner)
            int    innerMargin   = 5;
            int    innerLeft     = innerMargin + Resources.InnerLeft.Width;
            int    innerRight    = innerMargin + Resources.InnerRight.Width;
            int    innerStart    = innerLeft;
            int    innerEnd      = Width - innerRight;
            int    fillPixels    = innerEnd - innerStart;
            double pixelsPerUnit = (_maximum - 3D) / fillPixels; // Maximum = Full (with closing corner), 0 = No inner line, 1 = opening corner. (hence, -3).



            int lineLength = (int)(fillPixels * pixelsPerUnit * _value);

            lineLength = (int)(((double)_value / _maximum) * fillPixels);
            if (!force && lineLength == _lastLineLength && _background != null && this.Size.Equals(_backgroundSize) && this.BackColor.Equals(_backgroundBackColor))
            {
                return(false);
            }

            Graphics dc;

            if (_background != null && this.Size.Equals(_backgroundSize) && this.BackColor.Equals(_backgroundBackColor) && (bitArray == null && lineLength >= _lastLineLength))
            {
                // We can skip redrawing the background, since the line is just getting bigger
                dc = Graphics.FromImage(_background);
            }
            else
            {
                if (_background != null)
                {
                    _background.Dispose();
                }

                _background = new Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                dc          = Graphics.FromImage(_background);

                using (Brush brushBackColor = new SolidBrush(BackColor))
                {
                    dc.FillRectangle(brushBackColor, ClientRectangle);  // NB: Using ClientRectangle, not Size. Should we change the size checks and events to match?
                }

                // Outer Border
                dc.DrawImageUnscaled(Resources.OuterLeft, 0, 0);
                for (int i = Resources.OuterLeft.Width; i < ClientRectangle.Width - Resources.OuterRight.Width; i++)
                {
                    dc.DrawImageUnscaled(Resources.OuterFill, i, 0);
                }
                dc.DrawImageUnscaled(Resources.OuterRight, ClientRectangle.Width - Resources.OuterRight.Width, 0);
            }

            // Progress bar

            // BitArray shaded progress bar
            if (bitArray != null)
            {
                // Draw opening curve?
                if (bitArray.Get(0))
                {
                    dc.DrawImageUnscaled(Resources.InnerLeft, innerMargin, 0);
                }

                // Draw the progress line using BitArrayBar
                if (babar == null)
                {
                    babar = new BitArrayBar();

                    babar.SuspendLayout();
                    babar.Group256   = true;
                    babar.Height     = 6;
                    babar.FalseColor = Color.White;
                    babar.TrueColor  = Color.Black;
                    babar.ba         = bitArray;
                    babar.MakeBitmap();
                    this._value   = babar.baValue;
                    this._maximum = babar.baMaximum;
                    babar.ResumeLayout();
                }
                babar.Width = fillPixels;

                using (Bitmap baBitmap = babar.MakeScreenBitmap())
                {
                    // this.Controls.Add(babar);
                    dc.DrawImageUnscaled(baBitmap, innerStart, 4);
                }



                // Draw closing curve?
                if (bitArray.Get(bitArray.Length - 1))
                {
                    dc.DrawImageUnscaled(Resources.InnerRight, innerEnd, 0);
                }
            }
            else
            {
                // Draw opening curve?
                if (_value > 0)
                {
                    dc.DrawImageUnscaled(Resources.InnerLeft, innerMargin, 0);
                    for (int i = innerStart; i < lineLength; i++)
                    {
                        dc.DrawImageUnscaled(Resources.InnerFill, i, 0);
                    }
                }

                // Draw closing curve?
                if (_value > 0 && _value >= _maximum)
                {
                    dc.DrawImageUnscaled(Resources.InnerRight, innerEnd, 0);
                }
            }

            dc.Dispose();

            _backgroundSize      = Size;
            _backgroundBackColor = BackColor;
            _lastLineLength      = lineLength;

            return(true);
        }