質問
背景:私は、由緒あるSasami2kからインスピレーションを得たUIを備えた小さなビデオ再生アプリを持っています。VMR9を使用するように更新されたばかりです(つまり、Direct3D9 (DirectShow を使用))、不安定性が低くなります。現在、これは必要に応じて生の 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/size、moving/moved、poschanging/poschanged のウィンドウ メッセージがあり、それらはすべて便利です。なぜ WPF は同じ一連のイベントを複製しないのでしょうか?機能的には不必要なギャップのように思えます。
さらに、これは、WPF が特定の USER32 依存の実装に関連付けられていることを意味します。これは、MS が (Windows 7 や 8 などで) 表示レイヤーを反転して WPF を「ネイティブ」にし、レガシー アプリの HWND と WndProcs をエミュレートすることができないことを意味します。これがまさに MS が行うべきことであるにもかかわらずです。
解決
そして、私はシステムがサイズ変更について通知する場所を完全に見落としているようです。ヒットテストも同様。
サイズ変更については、実際に不足しています サイズが変更されました イベント。私の知る限り、悲しいことに、OnSizeChanging、OnLocationChanging、およびOnStateChangingイベントはありません。 窓 .NETで
私はそれを見ましたが、私の知る限り、サイズが変更された後にのみ起動しますが、サイズ変更中にイベントを起動する必要があります。ドキュメントを誤解していて、実際に継続的に発射しない限り?
連続発射はできませんが、おそらく使用できます。 サイズ変更開始 そして サイズ変更終了 イベントやそれができるようになります。
WinForms イベントではないですか?
うーん、その通りです。
他のヒント
OK、私自身の質問に答えると、私は Adorners を見逃していました (私が行ったどの検索でも戻ってこなかったので、彼らはおそらく必要なほど広く知られていないようです)。
残念ながら、これらは WndProc オーバーライドよりもかなり複雑に見えますが、これらを手動で操作して、希望どおりに実行することは可能だと思います。
コードでは、WindowStyle プロパティを「None」に、WindowsState を「Maximized」に設定できます。
Xaml がどのようになるかはわかりません。
ArrangeOverride や MeasureOverride をオーバーライドして、不足しているサイズ変更イベントを補うことはできますか?測定は最初のパスであり、レイアウトを新しいサイズに合わせて調整する必要があるときに発生するため、サイズ変更イベントのようなものです。