2017-01-19 2 views
0

J'ai intégré WindowsMediaPlayer dans mon application C# (bureau) et je veux y placer un transparent Panel ou PictureBox.Panneau transparent de PictureBox sur WindowsMediaPlayer

Puisque ni Panel ni PictureBox n'a la propriété TransparencyKey, je ne peux pas utiliser l'approche BackColor=TransparencyKey=Color.Magenta.

J'ai essayé de régler le BackColor du Panel à Color.Transparent. Cela ne semble pas fonctionner. [Ou peut-être que oui, mais la vidéo WMP n'apparaît simplement pas dans le panneau (transparent).]

L'objectif (ultime) est d'empêcher les utilisateurs d'interagir directement avec le WMP et, idéalement, d'avoir une superposition sur quelles informations "utiles" pourraient être transmises aux utilisateurs.

Quelqu'un a réussi à faire quelque chose comme ça avec succès? Je suis ouvert à la plupart des idées sur la façon de résoudre ce problème.

EDIT:

En utilisant l'exemple de 'How to Make a UserControls BackColor Transparent in C#?', j'ai créé "mon" Panel comme suit:

class TransarentPanel : Panel { 

    public bool  drag = false; 
    public bool  enab = false; 
    private int  m_opacity = 100; 

    private int  alpha; 

    System.Drawing.Font   drawFont; 
    System.Drawing.SolidBrush drawBrush; 
    System.Drawing.StringFormat drawFormat; 

    public TransarentPanel() { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     SetStyle(ControlStyles.Opaque, true); 
     this.BackColor = Color.Transparent; 
    } 

    public int Opacity { 
     get { 
      if (m_opacity > 100) { 
       m_opacity = 100; 
      } else if (m_opacity < 1) { 
       m_opacity = 1; 
      } 
      return this.m_opacity; 
     } 
     set { 
      this.m_opacity = value; 
      if (this.Parent != null) { 
       Parent.Invalidate(this.Bounds, true); 
      } 
     } 
    } 

    protected override CreateParams CreateParams { 
     get { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | 0x20; 
      return cp; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); 

     Color frmColor = this.Parent.BackColor; 
     Brush bckColor = default(Brush); 

     alpha = (m_opacity * 255)/100; 

     if (drag) { 
      Color dragBckColor = default(Color); 

      if (BackColor != Color.Transparent) { 
       int Rb = BackColor.R * alpha/255 + frmColor.R * (255 - alpha)/255; 
       int Gb = BackColor.G * alpha/255 + frmColor.G * (255 - alpha)/255; 
       int Bb = BackColor.B * alpha/255 + frmColor.B * (255 - alpha)/255; 
       dragBckColor = Color.FromArgb(Rb, Gb, Bb); 
      } else { 
       dragBckColor = frmColor; 
      } 

      alpha = 255; 
      bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); 
     } else { 
      bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); 
     } 

     if (this.BackColor != Color.Transparent | drag) { 
      g.FillRectangle(bckColor, bounds); 
     } 

     // Display overlay info 
     { 
      drawFont = new System.Drawing.Font("Arial", 24); 
      drawBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black); 
      drawFormat = new System.Drawing.StringFormat(); 

      g.DrawString("Overlay", drawFont, drawBrush, this.Location.X + 50, this.Location.Y + 30, drawFormat); 

      drawFont.Dispose(); 
      drawBrush.Dispose(); 
      drawFormat.Dispose(); 
     } 

     bckColor.Dispose(); 
     g.Dispose(); // Should this object be disposed of here since it was not created here? 
     base.OnPaint(e); 
    } 

    protected override void OnBackColorChanged(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      Parent.Invalidate(this.Bounds, true); 
     } 
     base.OnBackColorChanged(e); 
    } 

    protected override void OnParentBackColorChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnParentBackColorChanged(e); 
    } 
} // end class TransparentPanel 

Cela permet d'atteindre l'objectif de faire un panneau "invisible" qui recouvre la WMP tout en laissant apparaître l'affichage WMP. Cependant, j'ai encore besoin d'afficher quelques informations au-dessus de (en face de) la fenêtre WMP.

J'ai essayé de 'Dessiner' directement sur ce panneau transparent, [voir le bloc de code dans '// Afficher les infos de superposition' dans OnPaint()], mais cela ne s'affiche pas. Cependant, si je 'Hide()' la fenêtre WMP, l'écriture montre (mais, bien sûr, WMP ne le fait pas). Si je fais que mon panneau transparent ne couvre que la moitié de l'écran et ajoute un panneau "normal" (avec une BackgroundImage), il apparaît à moins qu'une partie de celui-ci chevauche le panneau transparent, auquel cas il n'apparaît pas.

J'ai noté des commentaires à propos du Parent dessinant l'arrière-plan du Panel. Je ne comprends pas cela, mais faire du parent de mon panel transparent le WMP (TP.Parent = WMP;) n'a pas fait de différence.

Je suis prêt à croire qu'il me manque quelque chose de basique ici, puisque ma connaissance des Formes/Contrôles est au mieux rudimentaire. Cependant, étant donné que je suis si proche, j'aimerais vraiment comprendre ce qui me manque pour pouvoir l'ajouter à ma base de connaissances, régler mon problème ici et passer à autre chose.

[Et bénissez George Birbilis sans qui je serais encore à la case départ! :-)]

+0

Je pense que vous pouvez désactiver les contrôles sur le WMP pour empêcher les utilisateurs d'interagir avec it. Lorsque vous placez un contrôle transparent (en changeant l'opacité) vous pouvez cliquer dessus, donc je doute que vous atteigniez votre objectif avec un contrôle transparent – Yaman

+0

Vous pouvez désactiver/masquer les contrôles visibles (et j'ai), mais pas le clic droit sur l'écran qui affiche une liste d'actions. Quoi qu'il en soit, l'une des autres raisons pour essayer d'avoir une superposition transparente est d'autoriser l'affichage d'informations (en tant que données supplémentaires) sur la vidéo en cours d'exécution. – JudgeRoyBean

+0

vous pouvez également ajouter une classe descendante de ceux-ci et remplacer la méthode qu'ils utilisent pour se peindre pour ne pas effacer le fond et/ou ne rien peindre –

Répondre

0

Blockquote

Dans la forme de chargement, l'arrière-plan de l'PictureBox1 spécifié comme transparent, puis le PictureBox1 désigné comme le parent du récipient de PictureBox2 peut être réalisé en PictureBox2 transparent et transparent avec l'arrière-plan de PictureBox1. Environnement VB2010. Le code est le suivant: fixé sur le côté gauche de l'écran est l'effet en cours d'exécution, le droit est l'environnement de programmation, je l'espère cet effet, vous serez satisfait

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    PictureBox1.BackColor = Color.Transparent 
    PictureBox2.Parent = PictureBox1 

ou gdi +

la peinture Ajouter Dans le fichier designer.cs événement

Dim g As Graphics = Me.CreateGraphics 
+0

Je crois que cela pourrait fonctionner si je travaillais avec deux instances de PictureBox. Malheureusement, mon "producteur d'image" sous-jacent est un objet COM intégré, donc je ne suis pas tout à fait sûr de savoir comment appliquer ce que vous avez suggéré. – JudgeRoyBean

0

ajouter cette déclaration, this.YOURWINDOWSMEDIAPLAYER.Controls.Add (this.YOURTRANSPARENTPANEL);

L'ordre des contrôles dépend de l'ordre que vous suivez dans designer.cs pour ajouter les contrôles enfants.

Espérons que cela aidera à résoudre votre problème, même s'il est un peu tard.