2010-12-15 23 views
12

Hier, j'ai trouvé quelque chose de très étrange (je pense). Il semble que Form.TransparencyKey donne des résultats différents en fonction de la couleur utilisée comme BackgroundColor et TransparencyKey. Si vous voulez reproduire ce, faire ce qui suit:C# Form.TransparencyKey travail différent pour différentes couleurs, pourquoi?

  1. Créer nouvelle application Windows Forms
  2. déposer une Panel sur le formulaire
  3. Give it "vert" comme BackgroundColor et mettre TransparencyKey de Form1 également Green
  4. Exécutez le programme et mettez Form avec "trou" sur quelque chose et vous verrez que vous pouvez cliquer à travers ce trou (comme décrit par MSDN)
  5. Maintenant, changez les deux couleurs en "Rouge" et lancez l'application - vous verrez le " trou "mais vous ne pouvez plus cliquer si

Savez-vous pourquoi cela se passe-t-il? Quelle est la règle? J'utilise .NET 4 avec VS2010, testé sur deux ordinateurs avec la même configuration.

Pas beaucoup de code pour cela ... Mais je peux poster des paramètres dans le concepteur:

private void InitializeComponent() 
{ 
    this.panel1 = new System.Windows.Forms.Panel(); 
    this.SuspendLayout(); 
    // 
    // panel1 
    // 
    this.panel1.BackColor = System.Drawing.Color.Red; 
    this.panel1.Location = new System.Drawing.Point(23, 26); 
    this.panel1.Name = "panel1"; 
    this.panel1.Size = new System.Drawing.Size(229, 176); 
    this.panel1.TabIndex = 0; 
    // 
    // Form1 
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.ClientSize = new System.Drawing.Size(284, 262); 
    this.Controls.Add(this.panel1); 
    this.Name = "Form1"; 
    this.Text = "Form1"; 
    this.TransparencyKey = System.Drawing.Color.Red; 
    this.ResumeLayout(false); 
} 
//that outside: 
private System.Windows.Forms.Panel panel1; 
+1

Pouvez-vous poster votre code? – ChrisF

+0

Pas de repro avec XP SP3 et .NET 2.0, désolé. – Bobby

+0

Quelqu'un peut-il essayer avec .NET 4.0? – Episodex

Répondre

9

J'ai déjà entendu parler de ce problème mais je n'ai jamais réalisé qu'il était lié au choix TransparencyKey. Belle trouvaille. C'est presque certainement causé par Aero. Avec cette option désactivée, l'effet est implémenté par l'utilisation d'une superposition matérielle dans la carte vidéo. Avec cette option activée, la fonction de composition de fenêtre de bureau l'implémente. Vous pouvez généralement dire par un bref éclair de la couleur de transparence avant que DWM rattrape et remplace la zone avec les pixels des fenêtres en arrière-plan. Désactiver DWM pour votre fenêtre pourrait résoudre le problème mais vous perdrez également les effets de verre.

Je peux voir peu de rimes ou de raison à la valeur de la couleur, semble assez aléatoire pour moi. Difficile d'appeler ça autre chose qu'un bug. Je n'ai jamais rencontré ça avant moi, j'utilise toujours la même touche de transparence. Color.Fuchsia, une excellente couleur fuchsée. Conseillé.

+0

Merci pour votre réponse. Je l'ai testé et vous avez raison. Je peux cliquer sans Aero activé. Maintenant, la chose amusante est que j'ai effectivement fait usage de ce bug. J'ai une fenêtre transparente sur laquelle je ne peux pas cliquer (donc je peux utiliser l'événement OnMouseMove avec) et la seconde avec une autre touche de transparence que je peux cliquer (ce que je veux). Maintenant je sais que sans Aero ou sur XP ça ne marchera pas ... Heureusement c'est pour mon usage personnel seulement;). – Episodex

+0

Hehe, ouais, ce bug existe depuis longtemps. Quand ils ne le réparent pas, cela devient une caractéristique qui rend nos vies plutôt difficiles. –

0

j'ai eu le même problème. Cela fonctionnera si votre TransparencyKey est blanche.