質問

境界線がない窓を移動するにはどうすればよいですか。アプリケーションには空のスペースはありません。利用可能なのは、ウェブブラウザーとメニュストリッポだけです。メニューストリップをドラッグして、ユーザーにウィンドウを移動できるようにしたいと思います。これをコーディングするにはどうすればよいですか?オンラインで見つけたコードブロックをいくつか試しましたが、どれも機能しませんでした。

役に立ちましたか?

解決

これ コードプロジェクトの記事は、これを達成するのに役立つはずです。私はこれを問題なく自分で使用しました。これはそれのjistです:

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, System.Windows.Forms.MouseEventArgs e)
{     
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

これは基本的に、ウィンドウマネージャーを「トリック」して、ウィンフォームのタイトルバーをつかんでいると考えています。

それをプロジェクトに適用するには、メノーストリップのMousedownイベントを使用してください。

他のヒント

これが.NETの方法です

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

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

    private void Form1_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 Form1_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }

それでおしまい。

たとえば、代わりにラベル付きのパネルを使用するなど、メニュストリップを偽造できます。次に、これを手動で処理できます。ユーザーがラベルをクリックすると、ポップアップメニューが開き、ユーザーがラベルをドラッグすると、ウィンドウが移動します。しかし、私はそのような回避策に対してアドバイスします。なぜなら、それは標準的なGUIの動作ではなく、ユーザーを混乱させる可能性があるからです。

私はそれを試していませんが、メニューバーの「OnMousedown」および「OnMouseUp」イベントを処理できれば:

  • マウスの下に - マウスの動きに応じて窓を移動します
  • マウス上のマウスの動きを追跡するのをやめるか、マウスを出します

パネルを使用している場合は、これを追加する必要があります

yourform.designer.cs

this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);

そして、これは

yourform.cs

 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 panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }

Mbithi Kiokoは正しい軌道に乗っていますが、私はこのようにそれをします。

    bool dragging = false;
    int xOffset = 0;
    int yOffset = 0;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        dragging = true;

        xOffset = Cursor.Position.X - this.Location.X;
        yOffset = Cursor.Position.Y - this.Location.Y;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragging)
        {
            this.Location = new Point(Cursor.Position.X - xOffset, Cursor.Position.Y - yOffset);
            this.Update();
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }

私は使わなければなりませんでした System.Runtime.InteropServices.DllImportAttribute - 私がコメントし、あなたにすべてを知らせると思っただけです。

開始点をこのような2D配列に入れるだけです。

public partial class mainForm : Form
{
    //Global variables for Moving a Borderless Form
    private bool dragging = false;
    private Point startPoint = new Point(0, 0); 


    public mainForm()
    {
        InitializeComponent();
    }

    private void mainForm_MouseDown(object sender, MouseEventArgs e)
    {
        dragging = true;
        startPoint = new Point(e.X, e.Y);

    }

    private void mainForm_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }

    private void mainForm_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragging)
        {
            Point p = PointToScreen(e.Location);
            Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y);

        }

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top