1

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

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

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

在此处输入图像描述

4

1 回答 1

2

我将基于这是在 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. PaintEventArgs使用 .Net Graphics 类(在 OnPaint 事件中提供)在面板内绘制菜单
  4. 处理所有鼠标/键盘事件并在必要时重绘您的控件(使用Control.Invalidate()Control.Refresh().

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

于 2012-08-10T16:22:09.660 回答