3

ユーザーが自分の Win32 ウィンドウをデスクトップの作業領域内でのみドラッグできるようにしたいと考えています。つまり、ウィンドウのどの部分もモニターの外にはみ出してはならず、ウィンドウがタスクバーに重なってもいけません。

吃音を発生させない方法でそれを行いたいと思います。WM_MOVE メッセージを処理し、MoveWindow() を呼び出して、ウィンドウが消えた場合にウィンドウの位置を変更することはできますが、MoveWindow() によって引き起こされるちらつき効果は好きではありません。

また、移動が実際に行われる前に移動先の四角形を変更することで、MoveWindow() を呼び出す必要がないように WM_MOVING を処理しようとしました。これはちらつきの問題を解決しますが、私が遭遇する別の問題は、ドラッグが発生したときにカーソルがウィンドウから離れて、カーソルがウィンドウ内にないときにユーザーがウィンドウをドラッグできるようになることです。

これらの問題に遭遇せずにウィンドウを制限するにはどうすればよいですか?

4

4 に答える 4

3

ウィンドウは、最終的にSetWindowPos API を介して配置されます。

SetWindowPos は、ウィンドウのサイズ変更または移動にWM_WINDOWPOSCHANGINGメッセージを送信し、次にWM_WINDOWPOSCHANGEDメッセージを送信して、変更されたサイズや位置をウィンドウ プロシージャに通知することにより、パラメーターを検証することから始めます。

DefWindowProcこれらのメッセージの処理は、順番に送信WM_GETMINMAXINFOしてからWM_SIZEメッセージを送信WM_MOVEすることです。

とにかく、WM_WINDOWPOSCHANGINGウィンドウを境界外に配置しようとする試みに基づいて、ユーザーとコードの両方をフィルター処理します。

于 2010-03-09T05:24:10.937 に答える
2

マルチモニター設定を使用しているユーザーは、デスクトップが負の x および y 座標に拡張されているか、長方形ではない可能性があることに注意してください。また、一部のユーザーは、仮想デスクトップを画面外に移動して実装する LiteStep などの代替ウィンドウ マネージャーを使用します。これに対抗しようとすると、これらのユーザーに対してアプリケーションが機能しなくなります。

于 2010-03-10T00:28:25.283 に答える
0

これを行うには、WM_MOVINGメッセージを処理し、lParamが指すRECTを変更します。

lParam:画面座標でのウィンドウの現在の位置を含むRECT構造体へのポインター。ドラッグ長方形の位置を変更するには、アプリケーションでこの構造体のメンバーを変更する必要があります。

WM_ENTERSIZEMOVEを処理して、ウィンドウがいつ動き始めているかを知ることもできます。WM_EXITSIZEMOVE

于 2010-03-09T02:14:12.053 に答える
0

WM_GETMINMAXINFOあなたが探しているようです。

于 2010-03-09T04:37:50.523 に答える