Click here to Skip to main content
6,630,901 members and growing! (20,900 online)
Email Password   helpLost your password?
Desktop Development » Miscellaneous » Custom Controls     Intermediate License: The Code Project Open License (CPOL)

Vista Internet Explorer 7 Style Navigate Button Control

By YuReng

Imitate a Vista Internet Explorer 7 style navigate button control
C# 2.0, Windows, .NET 2.0VS2005, VS2008, Dev
Version:2 (See All)
Posted:29 Sep 2006
Updated:25 Feb 2008
Views:72,639
Bookmarked:43 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
19 votes for this article.
Popularity: 4.85 Rating: 3.79 out of 5
4 votes, 21.1%
1

2
4 votes, 21.1%
3
2 votes, 10.5%
4
9 votes, 47.4%
5
IE7_style_TravelButton.gif

Introduction

This is a Vista Internet Explorer 7 style navigate button control. Sorry! My English is bad. Please download the source and try it.

The Code Preview

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;

namespace Demo.Controls
{
    #region TravelButton
    [DefaultEvent("ItemClicked")]
    public partial class TravelButton : Control
    {
        #region Fields
        [Browsable(true)]
        public event TravelButtonItemClickedEventHandler ItemClicked;
        [Browsable(false)]
        public event EventHandler DropDownMenuChanged;

        private readonly Rectangle BACKGROUND_RECT = 
                         new Rectangle(0, 0, 74, 29);
        private readonly Rectangle BACK_BUTTON_RECT = 
                         new Rectangle(2, 2, 25, 25);
        private readonly Rectangle FORWARD_BUTTON_RECT = 
                         new Rectangle(30, 2, 25, 25); 
        private readonly Rectangle DROPDOWN_ARROW_RECT = 
                         new Rectangle(57, 4, 17, 20);

        private Image _backGround = null;
        private Image _backButton = null;
        private Image _forwardButton = null;

        private ControlState _bButtonState = ControlState.Normal;
        private ControlState _fButtonState = ControlState.Normal;
        private ControlState _ddArrowState = ControlState.Normal;

        private bool _bButtonEnabled = true;
        private bool _fButtonEnabled = true;
        private bool _showMenu = true;

        private string _bToolTip = null;
        private string _fToolTip = null;
        private string _curToolTip = null;

        private ContextMenuStrip _dropDownMenu = null;

        private enum ControlState
        {
            Normal,
            Hover,
            Pressed,
            Disabled
        }
        #endregion

        #region Constructors
        public TravelButton()
        {
            Assembly assembly = Assembly.GetAssembly(typeof(TravelButton));

            _backGround = new Bitmap(
              assembly.GetManifestResourceStream(
              "Demo.Resources.BACKGROUND.PNG"));
            _backButton = new Bitmap(
              assembly.GetManifestResourceStream(
              "Demo.Resources.LEFTBUTTON.PNG"));
            _forwardButton = new Bitmap(
              assembly.GetManifestResourceStream(
              "Demo.Resources.RIGHTBUTTON.PNG"));

            this.DoubleBuffered = true;

            InitializeComponent();
        }
        #endregion

        #region Properties
        [Category("Behavior"), Browsable(true), DefaultValue(true)]
        public bool BackEnabled
        {
            get
            {
                return _bButtonEnabled;
            }
            set
            {
                _bButtonEnabled = value;
                this.Invalidate();
            }
        }

        [Category("Behavior"), Browsable(true), DefaultValue(true)]
        public bool ForwardEnabled
        {
            get
            {
                return _fButtonEnabled;
            }
            set
            {
                _fButtonEnabled = value;
                this.Invalidate();
            }
        }

        [Browsable(true)]
        public string BackToolTip
        {
            get
            {
                return _bToolTip;
            }
            set
            {
                _bToolTip = value;
            }
        }

        [Browsable(true)]
        public string ForwardToolTip
        {
            get
            {
                return _fToolTip;
            }
            set
            {
                _fToolTip = value;
            }
        }

        [Category("Behavior"), Browsable(true), DefaultValue(null)]
        public ContextMenuStrip DropDownMenu
        {
            get
            {
                return _dropDownMenu;
            }
            set
            {
                if (!DesignMode && _dropDownMenu != null)
                    _dropDownMenu.VisibleChanged -= 
                      new EventHandler(DropDownMenu_VisibleChanged);
                
                _dropDownMenu = value;

                if (!DesignMode && _dropDownMenu != null)
                    _dropDownMenu.VisibleChanged += 
                      new EventHandler(DropDownMenu_VisibleChanged);

                if (DropDownMenuChanged != null)
                    DropDownMenuChanged(this, EventArgs.Empty);
            }
        }
        #endregion

        #region Override
        protected override void OnEnabledChanged(EventArgs e)
        {
            base.OnEnabledChanged(e);
            this.Invalidate();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            if (this.Enabled)
            {
                if (ForwardEnabled)
                    DrawItem(pe.Graphics, TravelButtonItem.BackGround, 
                             _ddArrowState);
                else
                    DrawItem(pe.Graphics, TravelButtonItem.BackGround, 
                             ControlState.Disabled);

                if (BackEnabled)
                    DrawItem(pe.Graphics, TravelButtonItem.BackButton, 
                             _bButtonState);
                else
                    DrawItem(pe.Graphics, TravelButtonItem.BackButton, 
                             ControlState.Disabled);

                if (ForwardEnabled)
                    DrawItem(pe.Graphics, TravelButtonItem.ForwardButton,
                             _fButtonState);
                else
                    DrawItem(pe.Graphics, TravelButtonItem.ForwardButton, 
                             ControlState.Disabled);
            }
            else
            {
                DrawItem(pe.Graphics, TravelButtonItem.BackGround, 
                         ControlState.Disabled);
                DrawItem(pe.Graphics, TravelButtonItem.BackButton, 
                         ControlState.Disabled);
                DrawItem(pe.Graphics, TravelButtonItem.ForwardButton, 
                         ControlState.Disabled);
            }

            base.OnPaint(pe);
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);

            _bButtonState = ControlState.Normal;
            _fButtonState = ControlState.Normal;

            if (_dropDownMenu != null && _dropDownMenu.Visible)
                _ddArrowState = ControlState.Pressed;
            else
                _ddArrowState = ControlState.Normal;

            this.Invalidate();

            _showMenu = true;
            _curToolTip = null;
            //toolTip.Hide(this);
        }

        protected override void OnMouseDown(MouseEventArgs me)
        {
            base.OnMouseDown(me);

            if (this.Enabled)
            {
                if (me.Button == MouseButtons.Left)
                {
                    if (BackEnabled && 
                        BACK_BUTTON_RECT.Contains(me.X, me.Y))
                    {
                        _bButtonState = ControlState.Pressed;
                        _fButtonState = ControlState.Normal;
                        _ddArrowState = ControlState.Normal;
                        _showMenu = true;
                    }
                    else if (ForwardEnabled && 
                             FORWARD_BUTTON_RECT.Contains(me.X, me.Y))
                    {
                        _bButtonState = ControlState.Normal;
                        _fButtonState = ControlState.Pressed;
                        _ddArrowState = ControlState.Normal;
                        _showMenu = true;
                    }
                    else if (ForwardEnabled && 
                             DROPDOWN_ARROW_RECT.Contains(me.X, me.Y))
                    {
                        _bButtonState = ControlState.Normal;
                        _fButtonState = ControlState.Normal;

                        if (_dropDownMenu != null)
                        {
                            if (_showMenu)
                            {
                                _dropDownMenu.Show(this, 
                                  new Point(BACKGROUND_RECT.X, 
                                  BACKGROUND_RECT.Height),
                                  ToolStripDropDownDirection.Default);
                                _ddArrowState = ControlState.Pressed;
                            }
                            else
                            {
                                _ddArrowState = ControlState.Hover;
                            }
                            _showMenu = !_showMenu;
                        }
                        else
                        {
                            _ddArrowState = ControlState.Hover;
                            _showMenu = true;
                        }
                    }
                    else
                    {
                        _bButtonState = ControlState.Normal;
                        _fButtonState = ControlState.Normal;
                        _ddArrowState = ControlState.Normal;
                        _showMenu = true;
                    }

                    this.Invalidate();
                }
            }
        }

        protected override void OnMouseMove(MouseEventArgs me)
        {
            base.OnMouseMove(me);

            if (this.Enabled && !this.Capture)
            {
                if (BackEnabled && BACK_BUTTON_RECT.Contains(me.X, me.Y))
                {
                    _bButtonState = ControlState.Hover;
                    _fButtonState = ControlState.Normal;
                    _ddArrowState = ControlState.Normal;

                    SetToolTip(TravelButtonItem.BackButton);
                }
                else if (ForwardEnabled && FORWARD_BUTTON_RECT.Contains(me.X, me.Y))
                {
                    _bButtonState = ControlState.Normal;
                    _fButtonState = ControlState.Hover;
                    _ddArrowState = ControlState.Normal;

                    SetToolTip(TravelButtonItem.ForwardButton);
                }
                else if (ForwardEnabled && DROPDOWN_ARROW_RECT.Contains(me.X, me.Y))
                {
                    _bButtonState = ControlState.Normal;
                    _fButtonState = ControlState.Normal;
                    _ddArrowState = ControlState.Hover;

                    SetToolTip(TravelButtonItem.DropDownArrow);
                }
                else
                {
                    _bButtonState = ControlState.Normal;
                    _fButtonState = ControlState.Normal;
                    _ddArrowState = ControlState.Normal;

                    SetToolTip(TravelButtonItem.BackGround);
                }

                this.Invalidate();
            }
        }

        protected override void OnMouseDoubleClick(MouseEventArgs me)
        {
            if (DROPDOWN_ARROW_RECT.Contains(me.X, me.Y))
                return;
            else
                base.OnMouseDoubleClick(me);
        }

        protected override void OnClick(EventArgs e)
        {
            if (this.Enabled)
            {
                Point p = this.PointToClient(Control.MousePosition);
                TravelButtonItem item = TravelButtonItem.BackGround;

                if (BackEnabled && BACK_BUTTON_RECT.Contains(p.X, p.Y))
                {
                    item = TravelButtonItem.BackButton;
                    _bButtonState = ControlState.Hover;
                }
                else if (ForwardEnabled && FORWARD_BUTTON_RECT.Contains(p.X, p.Y))
                {
                    item = TravelButtonItem.ForwardButton;
                    _fButtonState = ControlState.Hover;
                }
                else if (ForwardEnabled && DROPDOWN_ARROW_RECT.Contains(p.X, p.Y))
                {
                    item = TravelButtonItem.DropDownArrow;
                    //_dropDownArrowState = ControlState.Hover;
                }

                this.Invalidate();

                if (item != TravelButtonItem.BackGround && 
                    ItemClicked != null)
                    ItemClicked(this, new TravelButtonItemClickedEventArgs(item));
            }

            base.OnClick(e);
        }
        #endregion

        #region Pulbic
        public void SetEnabled(TravelButtonItem item, bool enable)
        {
            if (item == TravelButtonItem.BackButton)
                this.BackEnabled = enable;
            else if (item == TravelButtonItem.ForwardButton
                || item == TravelButtonItem.DropDownArrow)
                this.ForwardEnabled = enable;
        }

        public void SetToolTip(TravelButtonItem item, string tip)
        {
            if (item == TravelButtonItem.BackButton)
                this.BackToolTip = tip;
            else if (item == TravelButtonItem.ForwardButton
                || item == TravelButtonItem.DropDownArrow)
                this.ForwardToolTip = tip;
        }
        #endregion

        #region Private
        private void SetToolTip(TravelButtonItem item)
        {
            if (item == TravelButtonItem.BackButton)
            {
                if (_curToolTip != _bToolTip)
                {
                    _curToolTip = _bToolTip;
                    toolTip.SetToolTip(this, _curToolTip);
                }
            }
            else if (item == TravelButtonItem.ForwardButton)
            {
                if (_curToolTip != _fToolTip)
                {
                    _curToolTip = _fToolTip;
                    toolTip.SetToolTip(this, _curToolTip);
                }
            }
            else
            {
                _curToolTip = null;
                toolTip.Hide(this);
            }
        }

        private void DropDownMenu_VisibleChanged(object sender, EventArgs e)
        {
            ContextMenuStrip menu = sender as ContextMenuStrip;
            if (menu != null)
            {
                if (!menu.Visible)
                {
                    _ddArrowState = ControlState.Normal;
                }

                this.Invalidate();
            }
        }

        private void DrawItem(Graphics g, TravelButtonItem item, 
                              ControlState state)
        {
            Rectangle srcRect;
            switch (item)
            {
                case TravelButtonItem.BackButton:
                    srcRect = new Rectangle(new Point(0, 0),
                              BACK_BUTTON_RECT.Size);
                    break;
                case TravelButtonItem.ForwardButton:
                    srcRect = new Rectangle(new Point(0, 0), 
                              FORWARD_BUTTON_RECT.Size);
                    break;
                default:
                    srcRect = BACKGROUND_RECT;
                    break;
            }

            int xOffset = 0;
            switch (state)
            {
                case ControlState.Normal:
                    xOffset = 0;
                    break;
                case ControlState.Pressed:
                    xOffset = srcRect.Width;
                    break;
                case ControlState.Hover:
                    xOffset = srcRect.Width * 2;
                    break;
                case ControlState.Disabled:
                    xOffset = srcRect.Width * 3;
                    break;
            }

            srcRect.X = xOffset;

            if (item == TravelButtonItem.BackButton)
            {
                g.DrawImage(_backButton, BACK_BUTTON_RECT, srcRect, 
                            GraphicsUnit.Pixel);
            }
            else if (item == TravelButtonItem.ForwardButton)
            {
                g.DrawImage(_forwardButton, FORWARD_BUTTON_RECT, 
                            srcRect, GraphicsUnit.Pixel);
            }
            else if (item == TravelButtonItem.BackGround)
            {
                g.DrawImage(_backGround, BACKGROUND_RECT, 
                            srcRect, GraphicsUnit.Pixel);
            }
        }
        #endregion
    }
    #endregion

    #region Other
    public delegate void TravelButtonItemClickedEventHandler(
           object sender, TravelButtonItemClickedEventArgs e);

    public enum TravelButtonItem
    {
        BackGround,
        BackButton,
        ForwardButton,
        DropDownArrow
    }
    
    public class TravelButtonItemClickedEventArgs : EventArgs
    {
        private readonly TravelButtonItem _item = 
                         TravelButtonItem.BackGround;

        public TravelButtonItemClickedEventArgs(TravelButtonItem clickedItem)
                                                                     : base()
        {
            _item = clickedItem;
        }

        public TravelButtonItem ClickedItem
        {
            get
            {
                return _item;
            }
        }
    }
    #endregion
}

History

  • 2008-2-25: Added ToolStripButton and suboptimal support for Gradient background

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

YuReng


Member
cool chappy.
Occupation: Web Developer
Location: China China

Other popular Miscellaneous articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 10 of 10 (Total in Forum: 10) (Refresh)FirstPrevNext
GeneralVista don't allow AppInit_Dlls to inject Pinmembersunil_200820:41 4 Sep '09  
Generalbackbuttononly should hide the background placeholder so can use it to mimic vista wizard PinmemberMember 71792816:44 14 Jul '09  
GeneralA request... PinmemberJohnny J.5:51 5 Feb '08  
QuestionResources Pinmemberelronalds15:30 9 May '07  
AnswerRe: Resources PinmemberYuReng17:37 7 Jun '07  
AnswerRe: Resources PinmemberThe Dogcow Farmer6:28 13 Aug '08  
GeneralGreat! Support for Gradient background? PinmemberDr. Bonne0:19 20 Oct '06  
GeneralVista button request PinmemberTheCardinal16:49 29 Sep '06  
GeneralRe: Vista button request PinmemberYuReng17:26 6 Jan '07  
Generallearn Pinmemberjswoofer5:20 29 Sep '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 25 Feb 2008
Editor: Deeksha Shenoy
Copyright 2006 by YuReng
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project