Transparence partielle avec C # .NET 3.5 WinForms?

Je crée une application .NET 3.5 avec un formulaire qui dessine un arrière-plan noir partiellement transparent. Je remplace OnPaintBackground pour accomplir ceci:

protected override void OnPaintBackground( PaintEventArgs e ) { using ( Brush brush = new SolidBrush( Color.FromArgb( 155, Color.Black ) ) ) { e.Graphics.FillRectangle( brush, e.ClipRectangle ); } } 

Cela fonctionne, mais il arrive que le formulaire se dessine sur lui-même sans vider l’écran, ce qui rend la transparence plus sombre qu’elle ne devrait l’être. J’ai essayé de jouer avec Graphics.Flush() et Graphics.Clear() , mais cela n’aide en rien ou supprime complètement la transparence. Aucune suggestion?

Edit: Voici à quoi ça ressemble, après avoir démarré l’application à gauche et après que le formulaire se redessine plusieurs fois (en réponse à la tabulation d’un contrôle à l’autre) à droite:

Problème de transparence http://www.quicksnapper.com/files/5085/17725729384A10347269148_m.png

Edit 2: J’essayais quelques trucs ce matin et j’ai remarqué que lorsque le bureau situé derrière les parties transparentes change, il n’est pas en train d’être redessiné. Par exemple, si j’ouvre le gestionnaire de tâches et le place derrière la fenêtre, vous ne le voyez pas se rafraîchir. Cela fait sens avec ce que j’ai vu avec les niveaux de transparence. Existe-t-il une fonction permettant à Windows de redessiner la zone située derrière votre fenêtre?

Edit 3: J’ai essayé de modifier quelques propriétés du formulaire, mais elles ont toutes pour résultat que le formulaire est dessiné en noir non transparent:

 this.AllowTransparency = true; this.DoubleBuffered = true; this.Opacity = .99; 

Je vais essayer de créer une fenêtre distincte pour la partie transparente, comme mentionné dans le texte surligné, mais toute autre idée est toujours la bienvenue.

Je pense que j’appellerais ce comportement attendu, en fait. Ce que je voudrais faire, c’est rendre mon arrière-plan en bitmap en mémoire et, dans l’événement paint, le copier dans le formulaire (double buffering de base).

Si je m’éloigne de la base, pourriez-vous poster une capture d’écran? Je ne sais pas si j’imagine ce que vous décrivez correctement.

MODIFIER:

Je me demandais si vous utilisiez OnPaintBackground … pre-.NET. Si vous utilisiez la double mise en tampon, vous captureriez et ignoreriez le message WM_ERASKBKGND (pour éviter le scintillement), restituiez votre image dans une mémoire tampon hors écran et copiez-la à partir de le tampon à l’écran sur WM_PAINT. Alors, essayez de passer de OnPaintBackground à OnPaint.

Je n’ai pas trop fait ce genre de choses dans .NET, mais je maîsortingsais assez bien tout cela auparavant; Je ne sais pas si ça va bien traduire ou pas!

EDIT 2:

Marc, plus je pense à ce que vous essayez de faire, plus de problèmes apparaissent. J’allais suggérer de créer un fil de fond dédié à la capture de l’écran et à son assombrissement; toutefois, pour supprimer votre propre formulaire, vous devez définir la visibilité sur false, ce qui créerait d’autres problèmes ….

Si vous ne souhaitez pas abandonner, je vous suggère de créer deux fenêtres et de les “lier” ensemble. Créez une fenêtre semi-opaque (en définissant l’opacité) pour votre fenêtre d’arrière-plan et créez une seconde fenêtre “normale” pour le premier plan. Utilisez SetWindowRgn sur la fenêtre de premier plan pour couper l’arrière-plan et les positionner les uns sur les autres.

Bonne chance!

Est-ce que Graphics.CompositingMode est défini sur CompositingMode.SourceCopy ? Cela devrait faire en sorte que peindre deux fois l’arrière-plan soit équivalent à le peindre une fois, car il remplacera les données alpha / couleur existantes au lieu d’être composites.