19

C# を使用します。タイトル バーなしで
を移動しようとしています。 それに関する記事を見つけました: http://www.codeproject.com/KB/cs/csharpmovewindow.aspxForm

FormBorderStyleに設定しない限り動作しNoneます。

このプロパティを次のように設定して動作させる方法はありNoneますか?

4

5 に答える 5

46

この質問は1年以上前のものですが、過去にどのように行ったかを思い出そうと検索していました. したがって、他の人の参考のために、上記のリンクよりも簡単で簡単な方法は、WndProc 関数をオーバーライドすることです。

/*
Constants in Windows API
0x84 = WM_NCHITTEST - Mouse Capture Test
0x1 = HTCLIENT - Application Client Area
0x2 = HTCAPTION - Application Title Bar

This function intercepts all the commands sent to the application. 
It checks to see of the message is a mouse click in the application. 
It passes the action to the base action by default. It reassigns 
the action to the title bar if it occured in the client area
to allow the drag and move behavior.
*/

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case 0x84:
            base.WndProc(ref m);
            if ((int)m.Result == 0x1)
                m.Result = (IntPtr)0x2;
            return;
    }

    base.WndProc(ref m);
}

これにより、クライアント領域内でクリックしてドラッグすることで、任意のフォームを移動できます。

于 2010-08-04T21:13:17.203 に答える
40

これが私が見つけた最良の方法です。これは、WndProc を使用しない「.NET 方式」です。ドラッグ可能にしたいサーフェスの MouseDown、MouseMove、および MouseUp イベントを処理するだけです。

private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;

private void FormMain_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    dragCursorPoint = Cursor.Position;
    dragFormPoint = this.Location;
}

private void FormMain_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
        this.Location = Point.Add(dragFormPoint, new Size(dif));
    }
}

private void FormMain_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}
于 2010-08-26T22:03:05.143 に答える
0

最初に、名前空間を次のように使用して相互運用サービスを使用する必要があります。

using System.Runtime.InteropServices;

次に、フォームの移動を処理するメッセージを定義します。これらをクラスメンバー変数として使用します

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

最後に、ユーザーがマウス ボタンを押すたびにメッセージを送信するコードを記述します。ユーザーがマウスボタンを押し続けると、フォームはマウスの動きに従って再配置されます。

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
}

このリンクを参照してくださいドラッグ可能なフォーム

rahul-rajat-singh のクレジット

于 2015-11-02T12:41:48.027 に答える