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! :-)]
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
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
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 –