示例#1
0
        /// <summary>
        /// Draw a Windows XP style close button.
        /// </summary>
        protected Bitmap DrawThemeCloseButton(CloseButtonState state)
        {
            Bitmap    output = new Bitmap(closeButton.Width, closeButton.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics  fx     = Graphics.FromImage(output);
            Rectangle rect   = closeButton.ClientRectangle;

            VisualStyleElement vse = null;

            switch (state)
            {
            case CloseButtonState.Hot:
                vse = VisualStyleElement.Window.CloseButton.Hot;
                break;

            case CloseButtonState.Normal:
                vse = VisualStyleElement.Window.CloseButton.Normal;
                break;

            case CloseButtonState.Pushed:
                vse = VisualStyleElement.Window.CloseButton.Pressed;
                break;
            }

            VisualStyleRenderer vsr = new VisualStyleRenderer(vse);

            vsr.DrawBackground(fx, rect);

            fx.Dispose();

            return(output);
        }
        /// <summary>
        /// Draw a Windows 95 style close button.
        /// </summary>
        protected Bitmap DrawLegacyCloseButton(CloseButtonState state)
        {
            var output = new Bitmap(closeButton.Width, closeButton.Height, PixelFormat.Format32bppArgb);

            try
            {
                using (var fx = Graphics.FromImage(output))
                {
                    var rClose = new Rectangle(0, 0, closeButton.Width, closeButton.Height);

                    ButtonState bState;
                    if (state == CloseButtonState.Pushed)
                    {
                        bState = ButtonState.Pushed;
                    }
                    else // the Windows 95 theme doesn't have a "hot" button
                    {
                        bState = ButtonState.Normal;
                    }
                    ControlPaint.DrawCaptionButton(fx, rClose, CaptionButton.Close, bState);

                    fx.DrawImage(output, rClose);
                }
            }
            catch
            {
                output.Dispose();
                throw;
            }

            return(output);
        }
示例#3
0
        // --- mouse ---
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            ClearDragTarget();
            if (e.Button != MouseButtons.Left || e.Clicks >= 2)
            {
                return;
            }

            var tabPage = GetTabPage(e.Location);

            if (tabPage != null)
            {
                if (e.Button == MouseButtons.Left && !KeyUtil.IsShiftPressed() && !KeyUtil.IsControlPressed())
                {
                    var r = GetCloseButtonBounds(tabPage);
                    if (r.Contains(e.Location))
                    {
                        OnCloseButtonPressed(tabPage);
                        _closeButtonState = CloseButtonState.None;
                        Invalidate(r);
                        return;
                    }
                }
            }

            SetupDragTarget(e.X, e.Y);
        }
 protected override void OnMouseMove(MouseEventArgs e)
 {
     if (!ClientRectangle.Contains(e.Location))
     {
         state = CloseButtonState.Normal;
         Invalidate();
     }
     base.OnMouseMove(e);
 }
 protected override void OnMouseMove(MouseEventArgs e)
 {
     if (!ClientRectangle.Contains(e.Location))
     {
         state = CloseButtonState.Normal;
         Invalidate();
     }
     base.OnMouseMove(e);
 }
示例#6
0
 protected override void OnMouseLeave(EventArgs e)
 {
     base.OnMouseLeave(e);
     ClearDragTarget();
     if (_closeButtonState != CloseButtonState.None)
     {
         _closeButtonState = CloseButtonState.None;
         Invalidate(_currentCloseButtonBounds);
     }
     _currentCloseButtonBounds = Rectangle.Empty;
 }
示例#7
0
 protected Bitmap DrawCloseButton(CloseButtonState state)
 {
     if (VisualStyleRenderer.IsSupported)
     {
         return(DrawThemeCloseButton(state));
     }
     else
     {
         return(DrawLegacyCloseButton(state));
     }
 }
示例#8
0
        static Texture GetCloseImage(CloseButtonState state)
        {
            if (state == CloseButtonState.Hovered)
            {
                return(Images.GetHoveredCloseIcon());
            }

            if (state == CloseButtonState.Clicked)
            {
                return(Images.GetClickedCloseIcon());
            }

            return(Images.GetCloseIcon());
        }
示例#9
0
        void SetCloseButtonState(
            CloseButtonState newState,
            Action repaintAction)
        {
            if (mCloseButtonState == newState)
            {
                return;
            }

            mCloseButtonState = newState;

            if (repaintAction != null)
            {
                repaintAction();
            }
        }
示例#10
0
        protected virtual void OnDragStart(DragStartEventArgs e)
        {
            if (_closeButtonState != CloseButtonState.None)
            {
                _closeButtonState = CloseButtonState.None;
                Invalidate(_currentCloseButtonBounds);
            }
            _currentCloseButtonBounds = Rectangle.Empty;

            var handler = DragStart;

            if (handler != null)
            {
                DragStart(this, e);
            }
        }
示例#11
0
        /// <summary>
        /// Draw a Windows XP style close button.
        /// </summary>
        protected Bitmap DrawThemeCloseButton(CloseButtonState state)
        {
            var output = new Bitmap(closeButton.Width, closeButton.Height, PixelFormat.Format32bppArgb);

            try
            {
                using (var fx = Graphics.FromImage(output))
                {
                    var rect = closeButton.ClientRectangle;

                    VisualStyleElement vse = null;

                    switch (state)
                    {
                    case CloseButtonState.Hot:
                        vse = VisualStyleElement.Window.CloseButton.Hot;
                        break;

                    case CloseButtonState.Normal:
                        vse = VisualStyleElement.Window.CloseButton.Normal;
                        break;

                    case CloseButtonState.Pushed:
                        vse = VisualStyleElement.Window.CloseButton.Pressed;
                        break;
                    }

                    var vsr = new VisualStyleRenderer(vse);
                    vsr.DrawBackground(fx, rect);
                }
            }
            catch
            {
                output.Dispose();
                throw;
            }

            return(output);
        }
示例#12
0
        static Rect DrawCloseButton(
            Rect toggleRect,
            CloseButtonState state)
        {
            int closeButtonSize = 15;

            GUIContent closeImage = new GUIContent(GetCloseImage(state));

            Rect closeTabRect = new Rect(
                toggleRect.xMax - closeButtonSize - 1,
                toggleRect.y + (toggleRect.height / 2 - closeButtonSize / 2),
                closeButtonSize,
                closeButtonSize);

            GUI.Button(closeTabRect, closeImage, EditorStyles.label);

            return(new Rect(
                       closeTabRect.x - 1,
                       closeTabRect.y - 1,
                       closeTabRect.width + 2,
                       closeTabRect.height + 2));
        }
示例#13
0
        // ========================================
        // constructor
        // ========================================
        public TabControlEx()
        {
            InitializeComponent();

            AllowDrop = true;
            ClearDragTarget();

            SetStyle(ControlStyles.UserPaint, true);
            //SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            //SetStyle(ControlStyles.DoubleBuffer, true);
            //SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            //SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, false);
            SetStyle(ControlStyles.Opaque, false);
            DoubleBuffered = true;
            ResizeRedraw   = true;

            SizeMode   = TabSizeMode.Fixed;
            Appearance = TabAppearance.Normal;
            Multiline  = true;

            _backColor   = SystemColors.Control;
            _borderColor = SystemColors.ControlDarkDark;

            //_isScrollWndVisible = false;

            //_closeTabImages = new ImageList();
            //_closeTabImages.ColorDepth = ColorDepth.Depth32Bit;
            //var img = Properties.Resources.close_tab;
            //if (img != null) {
            //    _closeTabImages.ImageSize = new Size(img.Height, img.Height);
            //    _closeTabImages.Images.AddStrip(img);
            //}

            //_closeTabImage = Properties.Resources.cross_button;
            _closeButtonState = CloseButtonState.None;
        }
示例#14
0
        /// <summary>
        /// Draw a Windows 95 style close button.
        /// </summary>
        protected Bitmap DrawLegacyCloseButton(CloseButtonState state)
        {
            Bitmap   output = new Bitmap(closeButton.Width, closeButton.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics fx     = Graphics.FromImage(output);

            Rectangle rClose = new Rectangle(0, 0, closeButton.Width, closeButton.Height);

            ButtonState bState;

            if (state == CloseButtonState.Pushed)
            {
                bState = ButtonState.Pushed;
            }
            else             // the Windows 95 theme doesn't have a "hot" button
            {
                bState = ButtonState.Normal;
            }
            ControlPaint.DrawCaptionButton(fx, rClose, CaptionButton.Close, bState);

            fx.DrawImage(output, rClose);
            fx.Dispose();

            return(output);
        }
示例#15
0
 private void EnterNormalCloseButtonState()
 {
     if(_owner.ShowCloseButtons && closeButtonState != CloseButtonState.Normal) {
         closeButtonState = CloseButtonState.Normal;
         ForceUpdate();
     }
 }
示例#16
0
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (
                _dragStartRect != Rectangle.Empty &&
                !_dragStartRect.Contains(e.X, e.Y)
                )
            {
                var tabPage = GetTabPage(_dragStartPoint);
                if (tabPage != null)
                {
                    var dse = new DragStartEventArgs();
                    OnDragStart(dse);

                    var dataObj = new DataObject();
                    if (dse.DragDataObjects != null)
                    {
                        foreach (var obj in dse.DragDataObjects)
                        {
                            dataObj.SetData(obj);
                        }
                    }
                    dataObj.SetData(tabPage);
                    DoDragDrop(dataObj, DragDropEffects.Move | dse.AllowedEffect);
                }
            }
            else
            {
                if (_closeButtonState != CloseButtonState.Pressed)
                {
                    var tabPage = GetTabPage(e.Location);
                    if (tabPage != null)
                    {
                        var r = GetCloseButtonBounds(tabPage);
                        var oldCloseButtonBounds = _currentCloseButtonBounds;
                        if (r.Contains(e.Location))
                        {
                            _closeButtonState = CloseButtonState.Hovered;
                        }
                        else
                        {
                            _closeButtonState = CloseButtonState.Normal;
                        }
                        if (r != oldCloseButtonBounds)
                        {
                            Invalidate(oldCloseButtonBounds);
                            Invalidate(r);
                        }
                        _currentCloseButtonBounds = r;
                    }
                    else
                    {
                        _currentCloseButtonBounds = Rectangle.Empty;
                    }
                }
                else
                {
                    _currentCloseButtonBounds = Rectangle.Empty;
                }
            }
        }
示例#17
0
 private void EnterOverCloseButtonState()
 {
     if(closeButtonState == CloseButtonState.Normal) {
         closeButtonState = CloseButtonState.Over;
         ForceUpdate();
     }
 }
示例#18
0
        protected void DrawCloseButton(Rectangle bounds, CloseButtonState state, Graphics g)
        {
            if(_owner.ShowCloseButtons == false ||
                (_selected == false && _owner.ShowCloseButtons && _owner.CloseButtonsOnlyForSelected) ||
                currentBackBrush == null || currentForeBrush == null) {
                return;
            }

            int x;
            int y;

            // set button position
            if((_owner.TabAlignment == TabAlignment.Top) ||
               (_owner.TabAlignment == TabAlignment.Bottom)) {
                if(_owner.CloseButtonAlignment == CloseButtonAlignment.Left) {
                    x = bounds.Left;
                }
                else {
                    x = bounds.Left + bounds.Width - CloseButtonWidth - CloseButtonDistance / 2;
                }

                // center vertically
                y = bounds.Top + bounds.Height / 2 - CloseButtonHeight / 2;
            }
            else {
                if(_owner.CloseButtonAlignment == CloseButtonAlignment.Left) {
                    y = bounds.Top;
                }
                else {
                    y = bounds.Top + bounds.Height - CloseButtonHeight - CloseButtonDistance / 2;
                }

                // center horizontally
                x = bounds.Left + bounds.Width / 2 - CloseButtonWidth / 2 - 1; // -1 is required
            }

            // set location
            if(state == CloseButtonState.Normal) {
                closeButtonLocation = new Rectangle(x, y, CloseButtonWidth, CloseButtonHeight);
            }

            // draw the button accordingly to the state
            switch(state) {
                case CloseButtonState.Normal: {
                        Brush borderBrush = this.Enabled ? currentForeBrush : Brushes.Silver;
                        Brush backgroundBrush = new SolidBrush(_selected ? _owner.CloseButtonColorSelected :
                                                                           _owner.CloseButtonColor);

                        int borderOpacity = _selected ? _owner.CloseButtonBorderOpacitySelected :
                                                        _owner.CloseButtonBorderOpacity;

                        Pen linePen = new Pen(MakeTransparentColor(((SolidBrush)borderBrush).Color, borderOpacity));
                        DrawCloseButtonInternal(x, y, linePen, backgroundBrush, g);
                        break;
                    }
                case CloseButtonState.Over: {
                        Pen linePen = new Pen(((SolidBrush)currentForeBrush).Color);
                        Brush backgroundBrush = new SolidBrush(_selected ? _owner.CloseButtonOverColorSelected :
                                                                           _owner.CloseButtonOverColor);

                        DrawCloseButtonInternal(x, y, linePen, backgroundBrush, g);
                        break;
                    }
                case CloseButtonState.Pressed: {
                        Pen linePen = new Pen(((SolidBrush)currentForeBrush).Color);
                        DrawCloseButtonInternal(x, y, linePen, new SolidBrush(_owner.CloseButtonPressedColor), g);
                        break;
                    }
            }
        }
示例#19
0
        /// <summary>
        /// Draw a Windows XP style close button.
        /// </summary>
        protected Bitmap DrawThemeCloseButton(CloseButtonState state)
        {
            Bitmap output = new Bitmap(closeButton.Width, closeButton.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics fx = Graphics.FromImage(output);
            Rectangle rect = closeButton.ClientRectangle;

            VisualStyleElement vse = null;

            switch (state)
            {
                case CloseButtonState.Hot:
                    vse = VisualStyleElement.Window.CloseButton.Hot;
                    break;
                case CloseButtonState.Normal:
                    vse = VisualStyleElement.Window.CloseButton.Normal;
                    break;
                case CloseButtonState.Pushed:
                    vse = VisualStyleElement.Window.CloseButton.Pressed;
                    break;
            }

            VisualStyleRenderer vsr = new VisualStyleRenderer(vse);
            vsr.DrawBackground(fx, rect);

            fx.Dispose();

            return output;
        }
 protected override void OnMouseEnter(EventArgs e)
 {
     state = CloseButtonState.Hover;
     Invalidate();
     base.OnMouseEnter(e);
 }
 protected override void OnMouseDown(MouseEventArgs e)
 {
     state = CloseButtonState.Pressed;
     Invalidate();
     base.OnMouseDown(e);
 }
 protected override void OnMouseLeave(EventArgs e)
 {
     state = CloseButtonState.Normal;
     Invalidate();
     base.OnMouseLeave(e);
 }
 protected override void OnMouseEnter(EventArgs e)
 {
     state = CloseButtonState.Hover;
     Invalidate();
     base.OnMouseEnter(e);
 }
 protected override void OnMouseDown(MouseEventArgs e)
 {
     state = CloseButtonState.Pressed;
     Invalidate();
     base.OnMouseDown(e);
 }
示例#25
0
 private void ExitOverCloseButtonState()
 {
     if(closeButtonState == CloseButtonState.Over) {
         closeButtonState = CloseButtonState.Normal;
         ForceUpdate();
     }
 }
示例#26
0
 private void EnterPressedCloseButtonState()
 {
     if(closeButtonState == CloseButtonState.Over) {
         closeButtonState = CloseButtonState.Pressed;
         ForceUpdate();
     }
 }
 protected Bitmap DrawCloseButton(CloseButtonState state)
 {
     if (VisualStyleRenderer.IsSupported) return DrawThemeCloseButton(state);
     else return DrawLegacyCloseButton(state);
 }
示例#28
0
 private void ExitPressedCloseButtonState()
 {
     if(closeButtonState == CloseButtonState.Pressed) {
         closeButtonState = CloseButtonState.Normal;
         ForceUpdate();
     }
 }
        /// <summary>
        /// Draw a Windows 95 style close button.
        /// </summary>
        protected Bitmap DrawLegacyCloseButton(CloseButtonState state)
        {
            var output = new Bitmap(closeButton.Width, closeButton.Height, PixelFormat.Format32bppArgb);
            try
            {
                using (var fx = Graphics.FromImage(output))
                {
                    var rClose = new Rectangle(0, 0, closeButton.Width, closeButton.Height);

                    ButtonState bState;
                    if (state == CloseButtonState.Pushed) bState = ButtonState.Pushed;
                    else // the Windows 95 theme doesn't have a "hot" button
                        bState = ButtonState.Normal;
                    ControlPaint.DrawCaptionButton(fx, rClose, CaptionButton.Close, bState);

                    fx.DrawImage(output, rClose);
                }
            }
            catch
            {
                output.Dispose();
                throw;
            }

            return output;
        }
        /// <summary>
        /// Draw a Windows XP style close button.
        /// </summary>
        protected Bitmap DrawThemeCloseButton(CloseButtonState state)
        {
            var output = new Bitmap(closeButton.Width, closeButton.Height, PixelFormat.Format32bppArgb);
            try
            {
                using (var fx = Graphics.FromImage(output))
                {
                    var rect = closeButton.ClientRectangle;

                    VisualStyleElement vse = null;

                    switch (state)
                    {
                        case CloseButtonState.Hot:
                            vse = VisualStyleElement.Window.CloseButton.Hot;
                            break;
                        case CloseButtonState.Normal:
                            vse = VisualStyleElement.Window.CloseButton.Normal;
                            break;
                        case CloseButtonState.Pushed:
                            vse = VisualStyleElement.Window.CloseButton.Pressed;
                            break;
                    }

                    var vsr = new VisualStyleRenderer(vse);
                    vsr.DrawBackground(fx, rect);
                }
            } 
            catch
            {
                output.Dispose();
                throw;
            }

            return output;
        }
 protected override void OnMouseLeave(EventArgs e)
 {
     state = CloseButtonState.Normal;
     Invalidate();
     base.OnMouseLeave(e);
 }
示例#32
0
        /// <summary>
        /// Draw a Windows 95 style close button.
        /// </summary>
        protected Bitmap DrawLegacyCloseButton(CloseButtonState state)
        {
            Bitmap output = new Bitmap(closeButton.Width, closeButton.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics fx = Graphics.FromImage(output);

            Rectangle rClose = new Rectangle(0, 0, closeButton.Width, closeButton.Height);

            ButtonState bState;
            if (state == CloseButtonState.Pushed)
                bState = ButtonState.Pushed;
            else // the Windows 95 theme doesn't have a "hot" button
                bState = ButtonState.Normal;
            ControlPaint.DrawCaptionButton (fx, rClose, CaptionButton.Close, bState);

            fx.DrawImage(output, rClose);
            fx.Dispose();

            return output;
        }