Click here to Skip to main content
14,363,648 members

A Tab Control Similar to that of Internet Explorer 7

Rate this:
4.33 (14 votes)
Please Sign up or sign in to vote.
4.33 (14 votes)
8 Dec 2006
A (fairly) simple tab control with closeable tabs
Sample Image - TabPages.jpg


Recently, several of my projects have required the ability to handle multiple documents. I figured IE7's tabs were a pretty good way of handling this, and here is the control that resulted.


This control is basically a managed collection of pages (or controls). It is event driven, indicating when a page has been added, removed, selected, or closed. The close event is cancellable, allowing you to prevent pages from being closed unless certain criteria are met.

I should probably add that there is no support for adding tabs via the IDE. I'd considered doing this, but it didn't really make sense. All of my projects are dealing with documents which will be opened and closed at runtime, and so I designed this control with that in mind.

Using the Control

Creating the Control

To create the control, add a reference to TabPages.dll, then create the TabPages.PageCollection control either programmatically or through the IDE.

Adding Pages

To add a page, call the Add method. This method takes a TabPage object as a parameter.  The TabPage object has text, a control (the control you wish to display when the tab is selected), and an optional toolTip string which will be displayed when the mouse hovers over the tab.

Removing Pages

To remove a page, call the Remove, RemoveAt, or Clear methods. These methods correspond to IList(Of TabPage) methods.

You can also call the Close method of the TabPage you wish to close (this will raise the PageClosing event, whereas the Remove methods will not).


There are several events which will be of interest to users of the PageCollection control, and they are defined as follows:

Public Event PageAdded(ByVal page As TabPage)

Public Event PageRemoved(ByVal page As TabPage)

Public Event CurrentPageChanged_
	(ByVal currentPage As TabPage, ByVal previousPage As TabPage)

Public Event PageClosing(ByVal page As TabPage, ByRef cancel As Boolean)

The PageAdded event fires when a page is added to the collection.

The PageRemoved event fires when a page is removed from the collection.

The CurrentPageChanged event fires when the currently selected page changes (when a different tab becomes the active tab). This event gets passed the currently selected tab as well as the previously selected tab.

The PageClosing event fires when a page is attempting to close. This gets fired when the user clicks close, or when the TabPage's Close method is called. This does not fire when Remove, RemoveAt, or Clear are called. The page parameter indicates which page is attempting to close, and the cancel parameter allows cancellation of the close. If the close is not cancelled, the page will be removed from the collection and the PageRemoved event will fire.


The appearance of this control could be more flexible, but for now, it is adequate. There are two properties of interest when customizing the PageCollection control's appearance.

The TabColor property specifies the color which will be used to generate the control's theme. All gradients, borders, and menu colors are generated from this color. Play around with it and see what you like. My favorite TabColors are LightGray and LightSteelBlue.

The TopMargin property specifies the difference between the height of the selected tab and the non selected-tabs.

Points Of Interest

As I said earlier, this control is pretty simple.  But there were two semi-challenges while developing it.


The initial version flickered something awful, even though I was double buffering. I was able to get around this by passing the WM_SETREDRAW message to the SendMessage API method.  It's now smooth as... er... Bono or some similarly smooth person.

Private Const WM_SETREDRAW As Integer = &HB

Private Declare Auto Function SendMessage Lib "User32" Alias "SendMessage" _
	(ByVal hWnd As IntPtr, ByVal msg As Integer, _
	ByVal wParam As Integer, ByVal lParam As Integer) As Boolean

What was happening is each time I resized (or added/removed controls), I would regenerate the list of displayed tab controls. Each time the list was regenerated, each tab would invalidate. It was ugly. WM_SETREDRAW basically tells a handle (control) that you don't want it to paint any more until you say so. For more information on this, see the FlickerFreeControl in the project.

Menu Theme

The other thing I wanted was menus which matched the color scheme of the tabs. To accomplish this, I inherited from the ToolStripRenderer.  I'd never used this before, but what it allows you to do is customize the painting of a toolstrip object (in this case, my context menu). See the DropDownRenderer class in the source for the implementation.


I'm not going to repeat myself.  I hope you like this control. If you make significant improvements to it, please send them my way so I can capitalize on them. Peace.


  • 8th December, 2006: Initial post


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Software Developer
United States United States
I'm a professional geek.

Comments and Discussions

QuestionIe8 Tab Pin
Gabee812-Sep-14 21:24
memberGabee812-Sep-14 21:24 
Generaltab pages Pin
Tsoperas18-Feb-11 3:27
memberTsoperas18-Feb-11 3:27 
QuestionHow can i use this "dll" in C# Project ? Pin
himan136515-Sep-10 5:24
memberhiman136515-Sep-10 5:24 
GeneralNew C# version Pin
Habufe2-Jan-10 5:54
memberHabufe2-Jan-10 5:54 
GeneralRe: New C# version Pin
LloydA11115-Sep-10 7:43
memberLloydA11115-Sep-10 7:43 
Generalblank page after minimize application Pin
DonSalieri8617-Sep-09 6:57
memberDonSalieri8617-Sep-09 6:57 
QuestionChange background color Pin
Radu_2020-Jan-09 6:30
memberRadu_2020-Jan-09 6:30 
GeneralAny suggestions Pin
eyanson14-Jan-09 9:24
membereyanson14-Jan-09 9:24 
QuestionHi Pin
Radu_2013-Jan-09 3:18
memberRadu_2013-Jan-09 3:18 
GeneralVS 2008 C# version Pin
wejaya2-Dec-08 9:20
memberwejaya2-Dec-08 9:20 
GeneralVS 2008 c# version Pin
sodevrom17-Nov-08 12:03
membersodevrom17-Nov-08 12:03 
GeneralRe: VS 2008 c# version Pin
Caglow22-Nov-08 10:15
memberCaglow22-Nov-08 10:15 
GeneralRe: VS 2008 c# version Pin
MicheleLaPietra17-Sep-09 2:08
memberMicheleLaPietra17-Sep-09 2:08 
QuestionC# implementation Pin
leyroyjenkins2-Oct-08 15:51
memberleyroyjenkins2-Oct-08 15:51 
AnswerRe: C# implementation Pin
Caglow19-Oct-08 12:15
memberCaglow19-Oct-08 12:15 
GeneralRe: C# implementation Pin
sodevrom10-Nov-08 4:55
membersodevrom10-Nov-08 4:55 
AnswerRe: C# implementation Pin
Osama Khalil15-Nov-08 2:07
memberOsama Khalil15-Nov-08 2:07 
GeneralRe: C# implementation Pin
sodevrom16-Nov-08 9:29
membersodevrom16-Nov-08 9:29 
GeneralWhy didn't you implement it as a subclassed control? [modified] Pin
Paul Owen2-Apr-08 1:56
memberPaul Owen2-Apr-08 1:56 
GeneralLicensing Pin
Sam N8-Feb-08 5:50
memberSam N8-Feb-08 5:50 
GeneralA very nice control - a couple of suggestions. Pin
gabriel6623-Oct-07 0:44
membergabriel6623-Oct-07 0:44 
GeneralRe: A very nice control - a couple of suggestions. Pin
Thord Johansson7-Mar-09 12:23
memberThord Johansson7-Mar-09 12:23 
GeneralUsage terms and conditions Pin
kumar431-Sep-07 15:38
memberkumar431-Sep-07 15:38 
GeneralNice Tab Control - One Suggestion Pin
viettho4-Jun-07 13:29
memberviettho4-Jun-07 13:29 
GeneralVisual Studio 2003 keeps throwing error... Pin
cdawg20-Apr-07 13:17
membercdawg20-Apr-07 13:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Posted 8 Dec 2006


90 bookmarked