2009-09-06 10 views
2

Je voudrais savoir s'il existe un moyen de rendre l'arrière-plan d'un TabControl transparent (le TabControl, pas les TabPages), au lieu de prendre la couleur d'arrière-plan du formulaire parent. J'ai quelques formes avec la peinture personnalisée où je dessine un dégradé en arrière-plan mais ce dégradé ne peint pas derrière les tabcontrols. J'ai essayé de définir TabControl.Backcolor = Color.Transparent mais il me dit que ce n'est pas supporté. J'utilise VS2005 et framework 2.0. (le style de jeu n'aide pas) Est-ce que quelqu'un a une bonne solution à ce problème?Arrière-plan transparent TabControl

Répondre

1

Selon le this thread on msdn, le tabcontrol ne prend pas en charge le changement de backcolor en transparent, mais vous pouvez supposément remplacer la méthode drawitem.

3

onglet personnalisés conrol:

[DllImport("uxtheme", ExactSpelling = true)] 
public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc, ref Rectangle pRect); 

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    if (this.BackColor == Color.Transparent) 
    { 
     IntPtr hdc = e.Graphics.GetHdc(); 
     Rectangle rec = new Rectangle(e.ClipRectangle.Left, 
      e.ClipRectangle.Top, e.ClipRectangle.Width, e.ClipRectangle.Height); 
     DrawThemeParentBackground(this.Handle, hdc, ref rec); 
     e.Graphics.ReleaseHdc(hdc); 
    } 
    else 
    { 
     base.OnPaintBackground(e); 
    } 
} 
+0

J'ai supprimé l'instruction if/else de votre code d'origine car TabControl ne semblait pas avoir de propriété BackColor, même s'il a un événement OnBackColorChanged – series0ne

+0

, mais que vous devez effectuer un contrôle de tabulation personnalisé. Cependant, j'ai essayé de faire '[Browsable (true)] public nouveau Color BackColor { get {return base.BackColor; } set {base.BackColor = valeur; } } ', mais pour certaines raisons, je ne peux pas changer' BackColor' de mon 'TabControl', il est toujours bloqué sur' SystemColors.Control', donc il semble que ce 'si 'n'a pas beaucoup de sens. – Sinatr

+0

@Sinatr, 'BackColor' est substituée dans' TabControl', et retourne toujours 'SystemColors.Control'. Je suppose que vous avez déjà compris, compte tenu de votre réponse ci-dessous. – dabide

1

Je vais étendre réponse Golan

Vous pouvez utiliser DrawThemeParentBackground faire la plupart des emplois (comme il est inactif?). Créer TabControl personnalisé:

[System.ComponentModel.DesignerCategory("Code")] 
public class MyTabControl : TabControl 
{ 

    [DllImport("uxtheme", ExactSpelling = true)] 
    public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc, ref Rectangle pRect); 

    // use with care, as it may cause strange effects 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
      return cp; 
     } 
    } 

    public MyTabControl() { } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     IntPtr hdc = e.Graphics.GetHdc(); 
     Rectangle rect = ClientRectangle; 
     DrawThemeParentBackground(this.Handle, hdc, ref rect); 
     e.Graphics.ReleaseHdc(hdc); 
    } 
} 

et définir explicitement pour chaque TabPageBackColor=Transparent (dans Designer ou pendant l'exécution, si vous ne le faites pas - s TabPage de » auront un fond blanc). Fonctionne comme un miracle, TabControl transparent sans scintillement dont je rêvais.

+0

Vous devez définir explicitement BackColor des pages d'onglet sur Transparent, même si cela est déjà indiqué dans le concepteur. Sinon, vous pouvez surcharger 'OnCreateControl()' et faire une boucle dans la collection TabPages, en définissant 'BackColor' sur' Color.Transparent'. – dabide

+0

Oui, «explicitement» est le mot juste, merci. Une autre chose, soyez prudent avec 'CreateParams' (peut-être le supprimer complètement), car cela peut causer des problèmes étranges. Cela reviendrait à scintiller si>< – Sinatr

0

Comme explained on MSDN, vous devriez

  • Vérifiez si Application.RenderWithVisualStyles renvoie true
  • ont la propriété de TabPage UseVisualStyleBackColor définie sur true
  • ont la propriété TabControl Appearance mis à Normal

alors votre TabPage doit avoir un arrière-plan transparent.