2009-05-19 3 views
2

il semble y avoir une question similaire à ceci ici mais avec le problème 'opposé' (Il ne voulait pas que les événements de souris soient capturés).(C#) Windows Forms - Arrière-plan transparent lors de la capture d'événements de souris?

J'ai un formulaire avec un panneau. La fenêtre est sans bordure et définie à la taille exacte du panneau (à toutes fins pratiques, c'est comme si le panneau flottait librement). Je peux définir BackColor du panneau à SystemColors.Control, puis définissez le TransparencyKey de la fenêtre à la même chose. Cela fonctionne en ce sens qu'il réalise l'effet désiré (transparence), mais le panneau ne peut plus capturer les événements de la souris (ce qui est vital pour la fonctionnalité)!

Existe-t-il un autre moyen de contourner ce problème ou un moyen de réactiver la capture de la souris? J'ai essayé de surcharger OnPaintBackground et de faire un noop, mais cela n'a pas permis d'obtenir une réelle transparence car il ne met pas à jour l'arrière-plan après chaque tick (donc tout ce qui se trouve derrière le panel au tirage initial reste vous déplacez le panneau ou le mettez à jour d'une autre manière). Il a cependant permis au panneau de capturer des événements de souris.

Ce n'est pas si gênant à ce stade du projet, mais je suis tombé sur le problème lors d'un prototype rapide et ça commence à m'énerver maintenant. Si quelqu'un a des conseils, ils seraient très appréciés.

Répondre

1

Si vous utilisiez VC++, je dirais que vous aviez besoin d'une pompe de message pour traiter les messages d'événement de la souris WM_.

Une recherche rapide révèle ce fil qui peut être utile pour vous:

Capturing ALL mouse events

Je pense que vous avez déjà essayé d'utiliser les éléments suivants:

/// <summary> 
/// A transparent control. 
/// </summary> 
public class TransparentPanel : Panel 
{ 
    public TransparentPanel() 
    { 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 
      createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
      return createParams; 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do not paint background. 
    } 
} 
+0

Salut ChrisBD - merci pour votre aide. La méthode ci-dessus "sorte de" travaillé. Je vais continuer à expérimenter avec cela et voir si je peux l'obtenir à zéro. Merci encore! – Beardy

+0

même problème! s'il vous plaît mettre à jour le sujet si vous avez trouvé la solution! – Pedro77

0

Je n'ai pas vraiment de réponse pour vous, mais j'ai une autre façon (peut-être un peu "hacky") pour vous d'accomplir ce que vous essayez de faire.

Définissez la propriété Opacité des formulaires à 1% (ne modifiez pas la clé de transparence) et maintenant, elle capturera les événements. Le formulaire ne sera pas visible (au moins sur ma machine à 1% je ne pourrais pas le voir du tout) et vous serez toujours capable de capturer tous les clics de souris.

+0

Salut Bfree - merci pour répondre, mais malheureusement ce n'est pas une option viable pour moi - car le Panel a des contrôles des enfants qui doivent être visibles. Merci quand même! – Beardy

+0

Oui, j'avais peur que tu dises ça. Pardon! Bonne chance ... En fait, je suis curieux de savoir s'il y a une solution. – BFree