C# 4.0 NET中的覆盖样式设计

C# 4.0 NET中的覆盖样式设计,c#-4.0,video-streaming,television,overlays,epg,C# 4.0,Video Streaming,Television,Overlays,Epg,我目前正在开发一个应用程序,它将在C#NET中创建一个电视指南应用程序。问题是,当用户选择打开电视指南的选项时,我希望保持当前流的播放,但将其最小化到右上角并保持播放,同时允许用户浏览EPG数据并进行较小的视频播放 我应该把所有的标签/按钮等放在面板的顶部(我用来显示实际的视频),并根据需要隐藏/显示它们,还是有更好的方法 另一方面,我认为标签将是显示当前频道信息的最佳解决方案,但如果有更好的选择,我希望听到他们 我的回答基于这样一个假设:这是一个在windows中运行的本机windows wi

我目前正在开发一个应用程序,它将在C#NET中创建一个电视指南应用程序。问题是,当用户选择打开电视指南的选项时,我希望保持当前流的播放,但将其最小化到右上角并保持播放,同时允许用户浏览EPG数据并进行较小的视频播放

我应该把所有的标签/按钮等放在面板的顶部(我用来显示实际的视频),并根据需要隐藏/显示它们,还是有更好的方法

另一方面,我认为标签将是显示当前频道信息的最佳解决方案,但如果有更好的选择,我希望听到他们


我的回答基于这样一个假设:这是一个在windows中运行的本机windows winforms应用程序。如果这是不正确的,请编辑您的问题,并提供有关您的项目和目标平台的更多详细信息

选项1是DirectX 这些多媒体应用程序最好使用DirectX编写。您实际上是从视频性能角度(以及可能的用户输入角度)编写“游戏”。您希望在显示菜单时保持视频流(甚至可以设置菜单动画)。DirectX将允许您利用现代图形处理器在屏幕上的某个位置绘制/呈现一个带有视频的漂亮菜单/ui

您是否可以在不使用DirectX编写自己的菜单渲染的情况下执行此操作?可能但这将是沉重的,并且可能会影响系统性能,或者至少会影响视频性能和整个应用程序性能

因此,选择#1是DirectX——通过在web上搜索“C#游戏编程”,将有此类编程的示例

使用DirectX之类的工具,并在整个应用程序界面上处理用户输入,也将允许对用户输入进行更多的控制。例如,您可能决定支持拖动样式滚动。整个菜单可以平滑地向上滚动以显示更多的频道,等等。。。对于大量winform控件(如按钮)的集合来说,这将是非常困难的,而对于DirectX来说,这将是相当容易的(或者至少是现实的)

选择#2-Winforms 好吧,现在你在问题中暗示的选择2是使用本机C控件,如按钮、标签、面板等。你可以做到这一点,但你将牺牲很多功能和性能成本

例如,让我们看看您发布的屏幕截图。我假设表格会被分成多个按钮,每个单元格是面板上的一个按钮?你可以点击一个频道来选择它,或者点击一个节目来开始观看那个节目?(我在这里猜。)屏幕截图中至少有22个按钮。现在让我们假设您向下滚动屏幕以显示更多频道,或者向右滚动屏幕以稍后查看时间线,操作将需要销毁/处置所有按钮,找出需要的新按钮,创建所有按钮,调整它们的大小/位置,并将其添加到面板中(特别是在展会区域,每个香奈儿在任何时间点的展会/展区长度都会发生变化)。销毁按钮和创建按钮的操作非常笨拙,其性能成本非常高,可能会使UI至少闪烁一次,并且不会顺利进行动画。此外,用户交互是每个按钮的本地操作,很难实现滑动式滚动,因为每个按钮都有自己的鼠标事件,等等

好的,我刚刚想到了另一种winforms技术,一种令人敬畏的技术,但我知道它会突然出现在你的脑海中!如果你制作了一个带有滚动条的面板,其中包含了所有可用频道的大量按钮阵列,会怎么样?这会让你滚动更平滑,并减少销毁/创建新按钮的问题,对吗?那将是一场性能噩梦也一样!试着在滚动面板中放置100-200个按钮,你会很快发现这是个坏主意

更好的Winforms技术 如果您必须使用winforms路径(因为您不能/不会使用DirectX),那么您应该以DirectX样式的方式实现菜单

  • 创建从面板继承的菜单控件类
  • 覆盖绘图/绘制(
    Control.OnPaintBackground
    Control.OnPaint
    ),覆盖键盘和鼠标处理程序等
  • 使用.Net图形类(在OnPaint事件
    PaintEventArgs
    中提供)在面板内绘制菜单
  • 处理所有鼠标/键盘事件,并在必要时重新绘制控件(使用
    control.Invalidate()
    control.Refresh()

  • 您将无法获得DirectX性能,但它将比大量控件要好得多。(您将掌握正确的技术,但可能无法获得DirectX可以利用的图形处理器加速的性能优势。)

    能否添加一个屏幕截图,说明如何显示实际视频及其控件?感谢您的帮助和详尽的回答。我现在肯定觉得您是对的,因为winform控件肯定不是解决问题的办法。我过去曾与DX合作过很多次,但它是通过Ogre3D等游戏引擎实现的,所以我从未想过R直接与它一起工作。QT窗口小部件是否会成为一个更理想的解决方案?我使用VLC API来播放/暂停/停止/记录/流等,当前在PInvoke中用C实现,但是可能切换到使用C++ API代替。