2009-09-16 5 views
2

Utilisation de formulaires C#/windows. Essayer de rendre l'arrière-plan d'un formulaire transparent, sans perdre sa capacité à recevoir des clics.Formulaire Windows avec un arrière-plan transparent qui ne peut pas être cliqué

  1. this.Opacity rend la forme entière transparent (pas seulement le fond

  2. BackColor = Color.Red;
    TransparencyKey = BackColor;

rend le fond de la forme Je souhaite que le formulaire soit transparent, mais il doit pouvoir recevoir des clics

comment?

Répondre

3

Vous devez gérer WM_NCHITTEST. Notez dans l'extrait ci-dessous que m.lParam contient les coordonnées X et Y compressées de la position de la souris, par rapport au coin supérieur gauche de l'écran, et vous devez vérifier si l'emplacement correspond à votre région transparente.

Dans cet exemple, je renvoie HTCAPTION, ce qui signifie que cette région se comportera comme une légende de la fenêtre, c'est-à-dire que l'utilisateur pourra faire glisser la fenêtre en cliquant et en faisant glisser cet emplacement. Voir here quelles autres valeurs peuvent être retournées et ce qu'elles signifient

protected override void WndProc(ref Message m) { 
    switch (m.Msg) { 
    case 0x84: // this is WM_NCHITTEST 
     base.WndProc(ref m); 
     if ((/*m.LParam.ToInt32() >> 16 and m.LParam.ToInt32() & 0xffff fit in your transparen region*/) 
      && m.Result.ToInt32() == 1) { 
      m.Result = new IntPtr(2); // HTCAPTION 
     } 
     break; 
    default: 
     base.WndProc(ref m); 
     break; 
    } 
} 
+0

C'était une chose intéressante à apprendre, mais cela ne semble pas fonctionner dans ce cas. Lorsque je remplace WndProc dans mon formulaire et que RedColor et TransparencyKey sont rouges, WndProc n'est pas appelé du tout lorsque je déplace la souris sur la zone transparente, donc je n'ai pas la possibilité de définir m.Result HTCAPTION. Pourriez-vous essayer cela? Je suis très curieux de voir si cela fonctionnera correctement. – MusiGenesis

+0

Vérifiez si vous appelez base.WndProc (ref m) pour tous les autres cas dans le commutateur(), car vous devriez. J'ai omis cela pour la simplicité, mais je pense que j'ai besoin de l'ajouter à l'extrait – Rom

+0

Je ne comprenais pas tout à fait - m.LParam.ToInt32() >> 16 et m.LParam.ToInt32() & 0xffff .... En tout cas j'ai enlevé ce code, le bloc if fonctionne de toute façon, le formulaire est défini sur htcaption, la forme transparente se comporte comme une légende, mais il est toujours click-throughable :( –

Questions connexes