1

フォームの任意の部分をクリックしてドラッグすることで移動できる Windows フォームがあります。キャプションをクリックしたとフォームに思わせるために、WndProc をオーバーライドし、NCHITTEST 関数の結果を HTCAPTION に設定する方法を使用しました。これにより、ドラッグが可能になります。

このコードはうまく機能し、以下のとおりです。

protected override void WndProc(ref Message msg)
    {
      if (msg.Msg == (int)WinAPI.NCHITTEST)
            {
                DefWndProc(ref msg);
                if ((int)msg.Result == (int)MousePositionCodes.HTCLIENT)
                {
                   msg.Result = (IntPtr)MousePositionCodes.HTCAPTION;
                   return;
                }
            }
        }
        base.WndProc(ref msg);
    }

この問題は、ToolStripPanel をフォームにドッキングすると発生します (これはドラッグ可能なツールバーとして機能します)。フォーム全体をドラッグ モードにするために必要なメッセージを渡すには、ToolStrip でカバーされていない ToolStripPanel の任意の部分が必要です。

独自の ToolStripContainer クラスを作成して WndProc 関数をオーバーライドし、上記と同じ関数を使用しようとしましたが、ToolStripContainer がフォーム内でドラッグ モードになり、これは目的の機能ではありません。

また、NCHITTEST メッセージを親に渡し、現在のマウス座標で新しいメッセージを作成し、WinAPI と親のウィンドウ ハンドルを使用して親に送信しようとしました。

ここで簡単なものが欠けている必要があります...誰にもアイデアはありますか?

4

1 に答える 1

6

ドラッグを実行する領域のHTTRANSPARENT(-1)を返すWM_NCHITTESTをテストしている、独自のToolStripContainerのWndProcを試してください。これにより、メッセージがチェーンでフォームに移動し、そこで処理してHTCAPTIONが返されるため、ドラッグが発生します。

お役に立てれば。

于 2009-05-29T17:30:38.417 に答える