境界線のないウィンドウを移動するにはどうすればよいですか? アプリケーションに空きスペースはありません。使用できるのは Web ブラウザーとメニューストリップだけです。ユーザーがメニュー ストリップをドラッグしてウィンドウを移動できるようにしたいと考えています。これをどのようにコーディングしますか?オンラインで見つけたいくつかのコード ブロックを試しましたが、どれも機能しませんでした。
8 に答える
このコード プロジェクトの記事は、これを達成するのに役立ちます。私はこれを自分で問題なく使用しました。これはその要旨です:
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);
}
}
これは基本的に、ウィンドウ マネージャーを「だまして」、winform のタイトル バーを取得していると考えさせます。
プロジェクトに適用するには、MenuStrip から MouseDown イベントを使用するだけです。
これが.Net Wayです
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;
}
それでおしまい。
パネルを使用している場合は、これを
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);
}
}
私は使用しなければなりませんでしたSystem.Runtime.InteropServices.DllImportAttribute
-コメントして皆さんにお知らせしたいと思いました。
たとえば、代わりにラベル付きのパネルを使用して、メニューストリップを偽造できます。そして、これを手動で処理できます。ユーザーがラベルをクリックすると、ポップアップ メニューが開き、ユーザーがラベルをドラッグすると、ウィンドウが移動します。しかし、これは標準的な GUI の動作ではなく、ユーザーを混乱させる可能性があるため、このような回避策はお勧めしません。
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;
}
私は試していませんが、メニュー バーの "OnMouseDown" および "onMouseUp" イベントを処理できる場合:
- マウスダウン時 - マウスの動きに合わせてウィンドウを移動
- マウスアップまたはマウスアウトでマウスの動きの追跡を停止する