web-dev-qa-db-ja.com

FormBorderStyleプロパティがNoneに設定されているときにWindowsフォームを移動するにはどうすればよいですか?

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

FormBorderStyleNoneとして設定しない限り機能します。

このプロパティをNoneとして設定して機能させる方法はありますか?

18
Moon

この質問は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);
}

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

40
LizB

これが私が見つけた最良の方法です。これは「.NETの方法」であり、WndProcを使用しません。ドラッグ可能にするサーフェスの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;
}
38
cprcrack

私はしばらく前に同じ質問をしました、そして答えを探している間、私は以下のコードを見つけました(ウェブサイトを覚えていません)そしてこれが私がすることです:

    Point mousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }
3
Ryu

ポイントmousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        Form_MouseDown(this, e);
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        Form_MouseUp(this, e);
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        Form_MouseMove(this, e);
    }
0
aya ali rayan

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

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 へのクレジット

0
thejustv