Переместите безграничную кнопку Winform, удерживая правую кнопку мыши, возможно, с помощью местных методов
-
27-10-2019 - |
Вопрос
У меня есть ситуация, когда я хотел бы переместить форму Windows, удерживая правую кнопку мыши в области клиента; Форма, как я уже говорил.
Я хотел бы переместить его «изначально» (если возможно, иначе другие ответы тоже в порядке). Я имею в виду, как это ведет себя, когда вы держите левую кнопку мыши на папоре титула (с мышью и тому подобным образом, я получаю много странных поведений, но, возможно, это только я).
Я читал много вещей, и этот пост выглядит полезно
Я пробовал различный способ использовать это и просмотрел http://msdn.microsoft.com/en-us/library/ff468877%28v=vs.85%29.aspx Чтобы найти другие полезные вещи, и WM_NCRBUTTONDOWN пришел мне в голову, однако WNDPROC не обнаруживает этого, может быть, потому что он обрабатывается формой?
Любое предложение ценится, спасибо
Франческо
Решение
public partial class DragForm : Form
{
// Offset from upper left of form where mouse grabbed
private Size? _mouseGrabOffset;
public DragForm()
{
InitializeComponent();
}
protected override void OnMouseDown(MouseEventArgs e)
{
if( e.Button == System.Windows.Forms.MouseButtons.Right )
_mouseGrabOffset = new Size(e.Location);
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
_mouseGrabOffset = null;
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (_mouseGrabOffset.HasValue)
{
this.Location = Cursor.Position - _mouseGrabOffset.Value;
}
base.OnMouseMove(e);
}
}
Другие советы
Вам нужно два метода P/вызывают это, чтобы сделать это.
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
[DllImport("user32.dll")]
static extern bool ReleaseCapture();
Пара констант:
const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;
Обрабатывать MouseDown
Событие в вашей форме, затем сделайте это:
private void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ReleaseCapture();
SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
}
}
Это отправит вашу форму то же событие, которое он получает, когда мышь нажимает и удержит область заголовка. Переместите мышь, и окно движется. Когда вы отпускаете кнопку мыши, движение останавливается. Очень просто.