【问题标题】:Overlay Style Designs in .NET.NET 中的叠加样式设计
【发布时间】:2012-08-01 23:48:03
【问题描述】:

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

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

顺便说一句,我假设标签将是显示当前频道信息的最佳解决方案,但如果有更好的选择,我很想听听。

【问题讨论】:

  • 您能否添加一个屏幕截图,说明您如何显示实际视频及其控件?

标签: c#-4.0 video-streaming television overlays epg


【解决方案1】:

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

选择 #1 是 DirectX

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

您能否在不使用 DirectX 编写自己的菜单渲染的情况下做到这一点?大概。但它会很重,并且可能会影响系统性能,或者至少会影响视频性能和整体应用程序性能。

所以选择 #1 是 DirectX - 通过在网络上搜索“C# 游戏编程”将会有这种编程的示例。

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

选择 #2 - Winforms

好的,现在您在问题中暗示的选项 #2 是使用本机 C# 控件,例如按钮、标签、面板等。您可以完成这项工作,但您将牺牲很多功能并在性能。

例如,让我们看看您发布的屏幕截图。我假设表格将被分成按钮,每个单元格都是面板上的一个按钮?您可以单击一个频道来选择它,或者单击一个节目开始观看那个节目? (我在这里猜。)该屏幕截图中看起来至少有 22 个按钮。现在假设您向下滚动屏幕以显示更多频道或向右滚动以稍后在时间轴中查看,该操作将需要销毁/处置所有按钮,找出它需要哪些新按钮,全部创建它们,大小/位置它们并将它们添加到您的面板中(特别是在显示区域中,在任何时间点,每个通道的显示/块大小的长度都会发生变化)。销毁按钮和创建按钮的操作很笨重,它会消耗大量性能,可能会至少闪烁一次 UI,并且动画效果不流畅。此外,用户交互对于每个单独的按钮都是本地的,很难实现像滑动样式滚动这样的东西,因为每个按钮都有自己的鼠标事件等。

好的,我只是想到了另一种 winforms 技术,一种很棒的技术,但我知道它会突然出现在您的脑海中!如果您制作了一个带有滚动条的面板,其中包含所有可用频道的大量按钮,该怎么办?这使您滚动更顺畅并减少了销毁/创建新按钮的问题,对吗?好吧,那也将是一场表演噩梦!尝试在滚动面板中放置 100-200 个按钮,您很快就会发现这是个坏主意。

更好的 Winforms 技术

如果您必须走 winforms 路线(因为您不能/不会使用 DirectX),那么您应该以 DirectX 风格的方式实现菜单。

  1. 创建一个继承自面板的菜单控件类
  2. 覆盖绘图/绘画(Control.OnPaintBackgroundControl.OnPaint),覆盖键盘和鼠标处理程序等。
  3. 使用 .Net Graphics 类在面板内绘制菜单(在 OnPaint 事件中提供 PaintEventArgs
  4. 处理所有鼠标/键盘事件并在必要时重绘控件(使用Control.Invalidate()Control.Refresh()

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

【讨论】:

  • 感谢您的帮助和详尽的回答。我绝对觉得你现在是我更多地考虑它,因为 winform 控件绝对不是要走的路。过去我与 DX 合作过很多次,但它是通过像 Ogre3D 这样的游戏引擎,所以从未直接使用它。像 Qt Widgets 这样的东西会是一个更优化的解决方案吗?我正在使用 VLC API 播放/暂停/停止/录制/等。在流上,当前在 C# 中使用 PInvoke 实现,但可能会改用 C++ API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2017-10-10
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多