2010-10-04 4 views
0

J'ai créé un panneau personnalisé (hérité de Panel) qui remplace la méthode OnPaint pour peindre le rectangle intérieur avec LinearGradientBrush.Panneau personnalisé Windows Form avec enfant transparent Problème

public void PaintPanel() 
{ 
    // Re-calculate the 
    CalculatePanelHeight(); 
    Graphics _g = this.CreateGraphics(); 

    Point _startPoint = new Point(0, m_TopAreaHeight); 
    Size _size = new Size(Width, m_BtmAreaHeight); 
    Rectangle _btmRect = new Rectangle(_startPoint, _size); 
    LinearGradientBrush _btmGradBrush = new LinearGradientBrush(_btmRect,      BackColorBottom, BackColorBottom2, LinearGradientMode.Vertical); 
     _btmGradBrush.GammaCorrection = true; 
     _g.FillRectangle(_btmGradBrush, _btmRect); 
     ... 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    PaintPanel(); 
    base.OnPaint(e); 
} 

Cependant, il y a 2 bizarreries: sommes

  1. Chaque fois qu'un contrôle avec un fond transparent est entraîné dans le panneau personnalisé, son arrière-plan devient blanc.

  2. Mon panneau personnalisé ne prend pas en charge l'arrière-plan transparent (la couleur devient blanche à chaque fois que je place l'une des couleurs du dégradé sur transparent).

Quelqu'un pourrait-il nous donner votre avis?

Merci.

Répondre

0

La transparence réelle n'existe pas dans Windows Forms. C'est une restriction Windows, elle ne le supporte pas sur les fenêtres enfants. Il y a quelques astuces de contournement, comme le style de la fenêtre WS_EX_TRANSPARENT et un peu de support intégré dans les winforms pour un BackColor transparent. Ils fonctionnent tous les deux en demandant au parent du contrôle de se dessiner dans la fenêtre de contrôle, fournissant les pixels d'arrière-plan.

Cela se décompose lorsque vous commencez à chevaucher les contrôles, vous voyez l'arrière-plan du parent (le formulaire habituellement), pas le contrôle qui se chevauchent. Et si le BackColor de votre formulaire est blanc alors vous verrez en effet blanc, pas le dégradé du contrôle intermédiaire.

Il n'y a pas de solution pratique pour cela. Si vous voulez une vraie transparence, vous devriez considérer WPF. Il n'utilise pas de fenêtres, juste des couches de peinture. La transparence est maintenant triviale, ne dessinez pas.