Wpf 在DirectX内容上覆盖WinForms控件
我正在尝试用图形控件创建一个图形库。该控件允许添加覆盖控件。控件上的图形使用DirectX,是库的一部分,而叠加控件由库的最终用户提供,这些用户不是图形专家。因此,稳定性和方便的API是最重要的问题 出于技术原因,我需要通过DirectX直接在控件上显示图形,并且无法使用另一个框架作为WPF主持DirectX场景(有关更多信息,请参阅我前面的问题:) 我认为最有问题的问题是:Wpf 在DirectX内容上覆盖WinForms控件,wpf,winforms,directx,transparency,gdi,Wpf,Winforms,Directx,Transparency,Gdi,我正在尝试用图形控件创建一个图形库。该控件允许添加覆盖控件。控件上的图形使用DirectX,是库的一部分,而叠加控件由库的最终用户提供,这些用户不是图形专家。因此,稳定性和方便的API是最重要的问题 出于技术原因,我需要通过DirectX直接在控件上显示图形,并且无法使用另一个框架作为WPF主持DirectX场景(有关更多信息,请参阅我前面的问题:) 我认为最有问题的问题是: 控件本身区域内的透明度(和半透明度…) 覆盖控件上的动画:这就是为什么控件光栅化(例如,通过WPF)不是一个选项 我
- 控件本身区域内的透明度(和半透明度…)
- 覆盖控件上的动画:这就是为什么控件光栅化(例如,通过WPF)不是一个选项
class GDIGraphicsControl : UserControl
{
private const int WS_EX_TRANSPARENT = 0x20;
protected override CreateParams CreateParams
{
get
{
CreateParams p = base.CreateParams;
p.ExStyle |= WS_EX_TRANSPARENT;
return p;
}
}
public GDIGraphicsControl()
{
this.Dock = DockStyle.Fill;
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do nothing
}
protected override void OnPaint(PaintEventArgs e)
{
for (int i = 0; i < 10; ++i)
{
int alpha = 25 * i;
int yPos = 10 * i;
e.Graphics.FillRectangle(
new SolidBrush(Color.FromArgb(alpha, Color.Green)),
5, 5 + yPos, 100, 10);
}
e.Graphics.FillEllipse(new SolidBrush(Color.Red), 110, 5, 100, 100);
}
}
我在这方面做了很多研究,我得出结论,空域是一条出路。我已经收集了来自web上许多项目的源代码,并将它们放在一个项目中,该项目允许您将WPF与XNA集成。我还做了一个纯DirectX版本,但说实话,XNA版本更简单,更适合C。我没有足够的空间在这里发布所有的细节,但是你可以并且可能知道从那里走到哪里。祝你好运 我在这方面做了很多研究,我得出结论,空域是一条必经之路。我已经收集了来自web上许多项目的源代码,并将它们放在一个项目中,该项目允许您将WPF与XNA集成。我还做了一个纯DirectX版本,但说实话,XNA版本更简单,更适合C。我没有足够的空间在这里发布所有的细节,但是你可以并且可能知道从那里走到哪里。祝你好运 非常感谢。实际上,我已经成功地使用ElementHost将WPF控件放置在DirectX内容上,并将BackColorTransparent设置为True。不过,我也希望支持WinForms控件。WPF ElementHost(我猜也是从您的源代码弹出的)不能与同一层次结构级别中的其他覆盖WinForms控件很好地互操作(它隐藏了它下面的WinForms控件,甚至在透明区域中)。此外,透明的WinForms闪烁(没有任何WPF控件,如您的示例中所示),并且您的源代码没有处理此类WinForms控件。您是否也有一个DirectX上WinForms的示例?或者根据您的经验为我理解问题提供建议?非常感谢。实际上,我已经成功地使用ElementHost将WPF控件放置在DirectX内容上,并将BackColorTransparent设置为True。不过,我也希望支持WinForms控件。WPF ElementHost(我猜也是从您的源代码弹出的)不能与同一层次结构级别中的其他覆盖WinForms控件很好地互操作(它隐藏了它下面的WinForms控件,甚至在透明区域中)。此外,透明的WinForms闪烁(没有任何WPF控件,如您的示例中所示),并且您的源代码没有处理此类WinForms控件。您是否也有一个DirectX上WinForms的示例?或者根据您的经验为我理解问题提供建议?
public partial class RenderingForm : Form
{
public RenderingForm()
{
InitializeComponent();
ControlStyles styles =
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint |
ControlStyles.Opaque;
this.SetStyle(styles, true);
Button button = new Button()
{
Text = "Just a button",
Left = 5,
Top = 210,
Width = 200
};
this.Controls.Add(button);
this.Controls.Add(new GDIGraphicsControl());
}
protected override void OnPaintBackground(PaintEventArgs e)
{
// Do nothing
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(Color.Blue);
this.Invalidate();
base.OnPaint(e);
}
}