1

背景: 由緒ある Sasami2k にインスパイアされた UI を備えた小さなビデオ再生アプリがあり、VMR9 (DirectShow を使用した Direct3D9) を使用するように更新され、不安定になりません。現在、必要に応じて生の Win32 を使用する C++ アプリになっています。特に WPF は、空域の制限により不可能でした。

さて、D3DImage が存在するようになったので、D3D/VMR9/DirectShow と WPF を組み合わせて使用​​できる可能性があります。Win32 の非拡張性に対する過去のフラストレーションを考えると、これは良いことのように思えます。

でもほら、ここで最初のハードルに落ちています。

Win32 を使用して、サイズ変更可能で比例的にサイズ変更され、画面の端にスナップし、最大化すると画面全体 (タスクバー領域を含む) を占めるボーダレス ウィンドウを (非常に簡単に) 作成しました。これは動画アプリなので、これらはすべて非常に望ましいプロパティです。

では、WPF で同じことを行うにはどうすればよいでしょうか。

Win32 では、次を使用します。 WM_GETMINMAXINFO を使用して最大化動作を制御します WM_NCHITTEST 境界のサイズ変更を制御します

ただし、ドキュメントを誤解していない限り、WPF を見ると、さまざまなイベントの到着が遅すぎるようです。

たとえば、LocationChanged は、ウィンドウが移動したときにのみ起動すると言うため (これは遅すぎます)、いつ移動しているのかわかりません。同様に、StateChanged は、ウィンドウが復元/最大化された後にのみ発生するようです (システムに正しい最大化サイズを伝えるために、最大化の前に情報が必要な場合)。

そして、システムがサイズ変更について教えてくれるところを完全に見落としているようです。ヒットテストも同様です。

それで、ええと、ここで何かが足りないのでしょうか、それとも、とにかくこのことの wndproc をフックすることに戻るしかありませんか? WndProc をフックせずにやりたいことができますか?

WndProc を使用する必要がある場合は、既存のコードベースに固執することもできます。よりシンプルでクリーンな UI コードが必要であり、WndProc から離れることはその基本です。

WndProc をフックする必要がある場合は、疑問に思う必要があります-なぜですか? Win32 には、sizing/sized、moving/moved、poschanged/poschanged ウィンドウ メッセージがあり、それらはすべて役に立ちます。WPF が同じ一連のイベントをレプリケートしないのはなぜですか? 機能の不必要なギャップのようです。

さらに、WPF が特定の USER32 依存の実装に関連付けられていることを意味します。これは、MS が (たとえば Windows 7 または 8 で) 表示レイヤーを反転して WPF を「ネイティブ」にし、レガシ アプリの HWND と WndProcs をエミュレートできないことを意味します。

4

4 に答える 4

3

OK、私自身の質問に答えるために、私はAdornersがいませんでした(私が行った検索のいずれにも戻ってこなかったので、おそらく彼らがそうあるべきほど広く知られているようには見えません)。

残念ながら、これらはWndProcのオーバーライドよりもかなり複雑に見えますが、私が望むことを実行するようにそれらを操作することは可能であると思います。

于 2008-08-29T01:31:41.527 に答える
1

コードでは、WindowStyle プロパティを "None" に設定し、WindowsState を "Maximized" に設定できます。

Xamlがどのように見えるかわかりません。

于 2008-08-26T11:54:35.330 に答える
1

そして、システムがサイズ変更について教えてくれるところを完全に見落としているようです。ヒットテストも同様です。

サイズ変更については、実際にSizeChangedイベントがありません。私の知る限り、悲しいことに.NETのウィンドウにはOnSizeChanging、OnLocationChanging、およびOnStateChangingイベントはありません


私はそれを見ましたが、私が知る限り、サイズが変更された後にのみ発生しますが、サイズ変更中にイベントを発生させる必要があります。ドキュメントを読み間違えていて、実際に継続的に起動しない限り?

継続的に発生するわけではありませんが、おそらくResizeBeginおよびResizeEndイベントを使用してそれを行うことができます。


それらは WinForms イベントではありませんか?

うーん、あなたは正しいです。

于 2008-08-26T12:12:58.407 に答える
0

欠落しているサイズ変更イベントを補うために、ArrangeOverride および/または MeasureOverride をオーバーライドできますか? Measure は最初のパスであり、レイアウトを新しいサイズに合わせて調整する必要があるときに発生するため、サイズ変更イベントのようなものです。

于 2008-12-10T19:31:41.447 に答える