Xpthemedtabcontrol

Description

L'idée de ce contrôle m'est venue à la suite de la publication de mon article (http://www.dotnet-tech.com/tutoriels/XPLook/).

Le but n'est pas refaire un TabControl de A à Z... non le but et de faire en sorte que le TabControl standard utilise les thèmes de Windows XP sans forcément tout redéfinir.

Source / Exemple :


public class XPThemeTabControl : System.Windows.Forms.TabControl
{
	/// <summary> 
	/// Variable nécessaire au concepteur.
	/// </summary>
	private System.ComponentModel.Container components = null;
	private IntPtr hTheme = IntPtr.Zero;

	public XPThemeTabControl()
	{
		// Cet appel est requis par le Concepteur de formulaires Windows.Forms.
		this.SetStyle(
			ControlStyles.DoubleBuffer,
			true);
		InitializeComponent();

		// TODO : ajoutez les initialisations après l'appel à InitializeComponent
		if (isWindowsXP) {
			hTheme = UXTheme.OpenThemeData(this.Handle, "TAB");
		}
	}

	private bool isWindowsXP {
		get {
			return (System.Environment.OSVersion.Platform == PlatformID.Win32NT	&&
				((System.Environment.OSVersion.Version.Major == 5 && System.Environment.OSVersion.Version.Minor > 0) ||
				System.Environment.OSVersion.Version.Minor > 5));
		}
	}

	protected override void OnControlAdded(ControlEventArgs e) {
		if (this.DesignMode || !this.isWindowsXP || this.hTheme.Equals(IntPtr.Zero)) {
			base.OnControlAdded(e);
			return;
		}

		TabPage page = e.Control as TabPage;
		if (page != null) {
			page.Paint += new PaintEventHandler(page_Paint);
		}
		base.OnControlAdded (e);
	}

	/// <summary> 
	/// Nettoyage des ressources utilisées.
	/// </summary>
	protected override void Dispose( bool disposing )
	{
		if( disposing )
		{
			UXTheme.CloseThemeData(hTheme);
			if(components != null)
			{
				components.Dispose();
			}
		}
		base.Dispose( disposing );
	}

	#region Code généré par le Concepteur de composants
	/// <summary> 
	/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 
	/// le contenu de cette méthode avec l'éditeur de code.
	/// </summary>
	private void InitializeComponent()
	{
		components = new System.ComponentModel.Container();
	}
	#endregion

	private void page_Paint(object sender, PaintEventArgs e) {
		
		TabPage page = sender as TabPage;
		Graphics g = page.CreateGraphics();
		hTheme = UXTheme.OpenThemeData(this.Handle, "TAB");
		UXTheme.RECT rect1 = new UXTheme.RECT(0,0,page.Width, page.Height);
		UXTheme.RECT rect2 = new UXTheme.RECT(e.ClipRectangle);
		IntPtr hdc = g.GetHdc();
		UXTheme.DrawThemeBackground( this.hTheme,
			hdc,
			UXTheme.TABP_BODY,
			1,
			ref rect1,
			ref rect2);
		g.ReleaseHdc(hdc);
	}
}

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.