0

ダイアログのみを表示する Win7-Aero にダイアログ ベースの Win32 アプリがあります。ダイアログにはタイトル バーが必要です。ユーザーが画面上でダイアログを移動できるようにしたくありません。

私は今のところ運が悪い... 取り扱いWM_NCHITTESTWM_SYSCOMMAND... 設定SWP_NOMOVE

達成するための最良の方法は何NoMoveですか? DWM は Win7 で何かを変更すると思います。

4

1 に答える 1

1

ハンドリングによってこれを行うことができWM_WINDOWPOSCHANGING、移動の試みが見られたら、座標を本来あるべき場所に戻します。例えば

switch (uMsg)
{
    case WM_WINDOWPOSCHANGING:
        if (!(reinterpret_cast<LPWINDOWPOS>(lParam)->flags & SWP_NOMOVE))
        {
            reinterpret_cast<LPWINDOWPOS>(lParam)->x = g_iMyXCoord;
            reinterpret_cast<LPWINDOWPOS>(lParam)->y = g_iMyYCoord;
        }
        return 0;
}

ユーザーが試みた移動と、独自のプログラムが行った移動 (または、必要に応じてシステムが行った移動 - たとえば、モニターが消えた場合など) を区別するために、おそらくこれにある程度のインテリジェンスを追加する必要があります。

うまくいかないと言っても、返されたときはいつでもトラップWM_NCHITTESTして返すことでこれを行うこともできると思いました-ただし、ウィンドウではなくウィンドウをサブクラス化することでこれを行う必要があります(最初にデフォルトのハンドラーを呼び出してから、戻り値を処理/変更する必要があります)。(システムメニューを介してユーザーが試みた動きをキャッチするため)についても同じです。HTBORDERHTCAPTIONDialogProcWM_SYSCOMMAND

于 2013-04-23T19:41:34.603 に答える