5

画面の端にスナップする WPF アプリがあります (画面の端から 20 ピクセル以内にいる場合は、ウィンドウの .Top または .Left を設定するだけです) が、最近、WPF SDK チームから提供されたコードを "ウィンドウクロムを混乱させ、うまく機能していますが(スクリーンショット)、「スナップショット」がウィンドウを予期せず移動させています(例:スナップする必要があるときに左にジャンプします)

私はそれをWM_NCCALCSIZEの処理に絞り込みました...彼らは基本的に何もせず、処理すると言って0を返すだけなので、これは本当に奇妙です。

WM_NCCALCSIZE のドキュメントによると、これはウィンドウ全体がクライアントとして扱われる (クライアント以外のエッジがない) だけの結果になるはずですが、どういうわけか、スナップ先のコードがウィンドウを画面の一番下に移動するたびに、 、それも約134ピクセル左に移動します...(他の端に移動すると同様の副作用があります)、マウスを押したままドラッグしている限り、本来あるべき場所から前後にちらつきます。WM_NCCALCSIZE の処理を​​コメントアウトすると、スナップ先が正常に機能します (ただし、フォームが正しく表示されません)。

WM_NCCALCSIZE ハンドラーでできることはすべて試しましたが、左にジャンプするのを止めることはできません...そしてもちろん、WM_NCCALCSIZE はウィンドウ サイズが変更されたときにのみ呼び出されるため、それがどのように発生するのかわかりませんそもそもこれ!

PSコードを実際に見たい場合は、すでにCodePlexにあり、2つのファイルで_HandleNCCalcSizeOnWindowLocationChangedを探します

4

2 に答える 2

6

これが発生する理由WM_NCCALCSIZEは、ウィンドウの全体的なサイズの変更を処理するためです...しかし、ウィンドウを移動している場合、WM_MOVEまたはWM_WINDOWPOSCHANGED(WPFWindowPositionChangedイベントに対応する)中に位置を変更すると、別のWM_NCCALCSIZEメッセージが発生します...

途中で変更を加えるとWM_NCCALCSIZE(メッセージを処理したと主張するだけでも) WM_MOVE... への別の呼び出しが発生し、positionchanged メッセージの "FROM" 部分が同じままであるループに入ります (開始した場所からウィンドウを "ジャンプ" させます)。WM_MOVE後に元に戻るので、何度も調整する位置に調整しますWM_NCCALCSIZE)。

正しい方法

あなたがしなければならないことは、Raymond Chen に従い、代わりに処理WM_WINDOWPOSCHANGINGすることです。これは、これらの他のメッセージの前に発生するため、互いに干渉することはありません!

于 2008-11-04T02:09:20.743 に答える
0

wParam は常に TRUE (1) のようで、lParam は NCCALCSIZE_PARAMS です ...

ウィンドウ全体を強制的に「クライアント」にしてから、Vista DWM APIを使用してフレームをクライアント領域に拡張します。なんでこんなに左に振れるのかわからない…

HandleNCCalcSize メソッドをトレースまたはブレークポイントすると、ウィンドウのサイズを変更すると (端にあるためスナップが起動する)、NCCalcSize が 2 回呼び出されます。上。

于 2008-10-10T22:48:47.567 に答える