C# 在使用directx渲染的视频上使用GDI绘制覆盖图

C# 在使用directx渲染的视频上使用GDI绘制覆盖图,c#,c++,gdi,directx-9,C#,C++,Gdi,Directx 9,我正在使用ffmpeg、硬件加速和directx 9进行视频流应用。该应用程序包括C接口和C++接口。开始时,我使用directx进行简单的叠加,如直线、矩形、多边形、三角形、文本等。但现在,我需要更复杂的叠加。然后,我想对视频使用directx,对叠加使用GDI 当directx呈现完成时,我尝试调用c#side中的GDI函数来处理相同的句柄。实际上,它是有效的,但由GDI绘制的覆盖图正在闪烁 我将D3DPRESENT\u参数中的PresentationInterval更改为D3DPRESEN

我正在使用ffmpeg、硬件加速和directx 9进行视频流应用。该应用程序包括C接口和C++接口。开始时,我使用directx进行简单的叠加,如直线、矩形、多边形、三角形、文本等。但现在,我需要更复杂的叠加。然后,我想对视频使用directx,对叠加使用GDI

当directx呈现完成时,我尝试调用c#side中的GDI函数来处理相同的句柄。实际上,它是有效的,但由GDI绘制的覆盖图正在闪烁

我将
D3DPRESENT\u参数中的PresentationInterval更改为
D3DPRESENT\u INTERVAL\u TWO
D3DPRESENT\u INTERVAL\u TWO
。结果是应用程序崩溃

我在directx出现之前调用了
LockWindowUpdate(myHandle)
,在GDI函数之后调用了
LockWindowUpdate(IntPtr.Zero)
。结果是应用程序崩溃

1.在directx上使用GDI进行绘图覆盖是一个不错的解决方案吗?
如果,有没有办法做到不闪烁?
如果,我是否应该使用directx完成所有工作

更新:显示视频的面板控件已设置为双缓冲

System.Reflection.PropertyInfo prop=
typeof(System.Windows.Forms.Control).GetProperty(
“双缓冲”,
System.Reflection.BindingFlags.NonPublic|
System.Reflection.BindingFlags.Instance);
prop.SetValue(displayPnl、true、null);

我在这里完全不是专家,但当我看到“GDI”和“闪烁”时,我总是开始搜索“如何启用双缓冲?”抱歉,我忘了提到我的显示面板已经是双缓冲的,问题已更新。感谢您的建议,我还想注意,只需设置
someControl.DoubleBuffered=true不适用于所有用例(例如,这当然不适用于
TreeView
),因此您可能会选择其中一个,或解决方案。