2016-01-10 1 views
0

Je dessine des rectangles en utilisant GDI sur ma forme transparente.Forme transparente la plus transparente avec des contrôles cliquables C#

Le formulaire est en plein écran et toujours au-dessus. En outre, il est cliquable grâce à l'aide de cette méthode: Topmost form, clicking "through" possible?

Cependant, des rectangles dessinés ne sont pas cliquables à travers comme ma forme et mon application est en train de perdre à chaque fois que je clique de mise au point sur eux. Aussi quand je survole sur eux je peux voir mon curseur de l'application (la fenêtre sous le formulaire est un jeu donc il a un curseur personnalisé).

Pouvez-vous me dire comment rendre toutes les commandes non focalisables et cliquables? Est-ce possible ou je dois utiliser des choses comme le dessin DirectX?

J'ai cherché le web entier et stackoverflow, utilisé diverses solutions mais rien n'a fonctionné.

Merci.

+1

Sons terriblement louche –

+0

Habituellement, les pixels visibles capturent le clic. – TaW

+0

@Kirill: pourquoi est-ce? – Frank

Répondre

0

Je ne suis pas sûr que je comprends parfaitement ce que vous essayez d'accomplir, si vous souhaitez faire un contrôle qui peut recevoir des clics de souris, mais ne pas « voler » mise au point, cela est tout à fait possible:

public class Box : Control 
{ 
    public Box() 
    { 
     // Prevent mouse clicks from 'stealing' focus: 
     TabStop = false; 
    } 

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

    // Display control text so we know what the button does: 
    private void DrawText(Graphics graphics) 
    { 
     using (var brush = new SolidBrush(this.ForeColor)) 
     { 
      graphics.DrawString(
       this.Text, this.Font, brush, 
       new PointF() 
       { 
        X = ((float)this.Width/2f), 
        Y = (((float)this.Height/2f) - (this.Font.GetHeight(graphics)/2f)) 
       }, 
       new StringFormat() 
       { 
        Alignment = StringAlignment.Center 
       }); 
     } 
    } 
} 


Cette commande simple affiche comme un rectangle qui est encore capable de recevoir des clics de souris et les événements de clic de feu, mais ne sera pas voler le focus d'autres contrôles sur le formulaire (ni la forme elle-même).


Définition d'une clé de la transparence sur la forme à sa couleur de fond fera le reste de la forme invisible, de sorte que seuls les rectangulaires « boutons » seront visibles. Cela peut également être combiné avec la propriété Opacity pour faire ce qui est affiché semi-transparent, mais un formulaire avec une opacité de exactement zéro n'interagira pas avec la souris (par la conception de Windows).


simplement la mise en TopMost du formulaire propriété sur true peut ne pas être suffisante pour maintenir la fenêtre au-dessus de toutes les autres fenêtres. Vous devrez peut-être faire l'appel API suivante à partir du formulaire quand il est d'abord créé (par exemple, dans le constructeur, événement OnLoad, etc.):

SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW)); 


documentation MSDN sur cette fonction peut être trouvé here.

Afin de faire cet appel, vous devrez ajouter la déclaration Windows API suivante à la classe de formulaire:

[DllImport("user32.dll")] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); 

et ajoutez également les constantes suivantes:

private const int SWP_NOMOVE  = 0x0002; 
private const int SWP_NOSIZE  = 0x0001; 
private const int SWP_SHOWWINDOW = 0x0040; 

private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 


J'espère que cela aide!