我正在开发一个需要看起来像附加屏幕截图的项目。
我有一个带有VideoPanelCtl面板的WinForm。面板的句柄被传递给实例化的VLC组件/控件,导致该面板上显示视频。
我还尝试将另一个面板放在视频面板上端的VideoPanelCtl顶部并使其透明,位于此顶部面板顶部的控件也应具有透明背景,如附带的屏幕截图所示。然而,尽管我使用了一个从面板控件派生的自定义面板并使用bkg重新绘制,但我的方法仍无效(请参阅下面的代码)我在这样的代码中创建的面板很容易被视频遮挡......如果我放了它们上面的控件(按钮和标签)也可能会被遮挡......
我从表单的WinForm的Load处理程序中调用它:
private void InitTopPanel()
{
mExtendedPanelTop = new ExtendedPanel();
mExtendedPanelTop.Opacity = 50; // totally transparent
videoPanelCtl.Controls.Add(mExtendedPanelTop);
mExtendedPanelTop.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
mExtendedPanelTop.Dock = System.Windows.Forms.DockStyle.Top;
mExtendedPanelTop.Location = new System.Drawing.Point(0, 0);
mExtendedPanelTop.Name = "ExtendedPanelTop";
mExtendedPanelTop.Size = new System.Drawing.Size(1090, 48);
mExtendedPanelTop.TabIndex = 0;
//mExtendedPanelTop.Paint += mExtendedPanelTop_Paint;
}
public class ExtendedPanel : Panel
{
private const int WS_EX_TRANSPARENT = 0x20;
public ExtendedPanel()
{
SetStyle(ControlStyles.Opaque, true);
}
private int opacity = 50;
//[DefaultValue(50)]
public int Opacity
{
get
{
return this.opacity;
}
set
{
if (value < 0 || value > 100)
throw new ArgumentException("value must be between 0 and 100");
this.opacity = value;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
base.OnPaint(e);
}
}
答案 0 :(得分:0)
我通过使用包含Canvas和包含MediaElement和Label(或其他控件)的Canvas的WPF控件来解决它。然后将标签的ZIndex设置得更高以引起可见性。因此,我在运行视频(在MediaElement中)上获得可见标签,其中Label具有透明背景。