これは、Windows で実行されているネイティブの Windows winforms アプリであるという前提に基づいて回答します。これが正しくない場合は、質問を編集して、プロジェクトとターゲット プラットフォームに関する詳細を提供してください。
選択肢 1 は DirectX です
この種のマルチメディア アプリは、DirectX を使用して作成するのが最適です。あなたは本質的に、ビデオパフォーマンスの観点から(そして可能なユーザー入力の観点から)「ゲーム」を書いています。メニューを表示している間もビデオ ストリーミングを維持したい (おそらくメニューのアニメーション化中も)。DirectX を使用すると、最新のグラフィック プロセッサを利用して、画面上のどこかにビデオを含む素敵なメニュー/UI を描画/レンダリングできます。
DirectX を使用して独自のメニュー レンダリングを作成せずにこれを行うことができますか? おそらく。しかし、それは重く、システムのパフォーマンス、または少なくともビデオのパフォーマンスと全体的なアプリケーションのパフォーマンスに影響を与える可能性があります.
したがって、選択肢 1 は DirectX です。Web で「C# ゲーム プログラミング」を検索すると、この種のプログラミングの例が見つかります。
DirectX のようなものを使用し、アプリ サーフェス全体でユーザー入力を処理することで、ユーザー入力をより細かく制御できるようになります。たとえば、ドラッグ スタイルのスクロールをサポートすることにしたとします。メニュー全体をスムーズに上にスクロールして、下のチャネルをさらに表示することができます...これは、ボタンのような多数の winform コントロールのコレクションでは非常に難しく、DirectX ではかなり簡単 (または少なくとも現実的) になります。
選択肢 #2 - Winforms
質問でほのめかしていた選択肢 #2 は、ボタン、ラベル、パネルなどのネイティブ C# コントロールを使用することでした。これを機能させることはできますが、多くの機能が犠牲になり、パフォーマンスが大幅に低下します。
たとえば、投稿したスクリーンショットを見てみましょう。テーブルは、各セルがパネル上の 1 つのボタンであるボタンに分割されると思いますか? チャンネルをクリックして選択するか、番組をクリックしてその番組の視聴を開始できますか? (私はここで推測しています。) そのスクリーン ショットでは、少なくとも 22 個のボタンのように見えます。ここで、画面を下にスクロールしてより多くのチャンネルを表示するか、右にスクロールしてタイムラインを後で見るとします。その操作では、すべてのボタンを破棄/破棄し、必要な新しいボタンを見つけ出し、それらをすべて作成し、サイズ/位置を設定する必要があります。それらをパネルに追加します(特に、ショー/ブロックサイズの長さがいつでもすべてのシャネルで変わるショーエリアで)。ボタンを破棄してボタンを作成する操作は面倒で、多くのパフォーマンスが必要です。UI が少なくとも 1 回点滅し、スムーズにアニメーション化されない可能性があります。また、ユーザー インタラクションは個々のボタンごとにローカルであり、各ボタンには独自のマウス イベントがあるため、スワイプ スタイルのスクロールなどを実装するのは非常に困難です。
わかりました、もう 1 つ winforms の手法を考えました。これは恐ろしいものですが、頭に浮かぶことはわかっています。利用可能なすべてのチャンネル用の膨大な数のボタンを含むスクロールバーを備えたパネルを作成したらどうなるでしょうか? これにより、スクロールがスムーズになり、新しいボタンの破棄/作成の問題が軽減されますよね? それもパフォーマンスの悪夢になるでしょう!スクロール パネルに 100 ~ 200 個のボタンを配置してみると、これが悪い考えであることがすぐにわかります。
より良い Winforms テクニック
winforms ルートを使用する必要がある場合 (DirectX を使用できない/使用しないため)、DirectX スタイルの方法でメニューを実装する必要があります。
- パネルから継承するメニュー コントロール クラスを作成する
- 描画/ペイント (
Control.OnPaintBackground
およびControl.OnPaint
) をオーバーライドし、キーボードおよびマウス ハンドラなどをオーバーライドします。
- .Net Graphics クラス (OnPaint イベントで提供
PaintEventArgs
)を使用して、パネル内にメニューを描画します。
- すべてのマウス/キーボード イベントを処理し、必要に応じてコントロールを再描画します (
Control.Invalidate()
またはControl.Refresh()
.
DirectX のパフォーマンスは得られませんが、多数のコントロールを配置するよりははるかに優れています。(テクニックは正しくても、DirectX が利用できるグラフィックス プロセッサ アクセラレーションのパフォーマンス上の利点が得られない場合があります。)