境界なしでウィンドウを移動します
-
14-10-2019 - |
質問
境界線がない窓を移動するにはどうすればよいですか。アプリケーションには空のスペースはありません。利用可能なのは、ウェブブラウザーとメニュストリッポだけです。メニューストリップをドラッグして、ユーザーにウィンドウを移動できるようにしたいと思います。これをコーディングするにはどうすればよいですか?オンラインで見つけたコードブロックをいくつか試しましたが、どれも機能しませんでした。
解決
これ コードプロジェクトの記事は、これを達成するのに役立つはずです。私はこれを問題なく自分で使用しました。これはそれの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);
}
}
}