2009-08-06 6 views
14

Использование C#.
Я пытаюсь переместить Form без заголовка.
я нашел статью об этом на: http://www.codeproject.com/KB/cs/csharpmovewindow.aspxКак переместить форму Windows, если для свойства FormBorderStyle установлено значение None?

Он работает до тех пор, пока я не установить FormBorderStyle в None.

Есть способ, с помощью которого это можно сделать, так как None?

+0

Это работает для меня с FormBorderStyle, установленным в None. Это на сервере 2008, VS2008 с .NET 3.5. Какая версия .NET и ОС вы используете? –

+0

@Michael McCloskey - я использую Windows 7 rc, vs2008 с .net 3.5. – Moon

+0

@Michael McClosKey - неважно! он работает сейчас. Я не знаю, что произошло. – Moon

ответ

36

Я знаю, что этот вопрос старше года, но я искал попытку вспомнить, как я это делал в прошлом. Таким образом, для любой другой ссылки, самый быстрый и менее сложный способ, то вышеупомянутая ссылка должна переопределить функцию 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); 
} 

Это позволит перемещать любую форму, щелкая и перетаскивая область клиента.

+0

вы можете это объяснить немного – masfenix

+0

Добавлена ​​какая-то информация о том, что она делает – LizB

+0

Почему я не могу перетащить форму, когда событие mousedown на menuStrip? – CMA

35

Здесь это лучший способ, который я нашел. Это «способ .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; 
} 
0

Во-первых, мы должны будем использовать Interop услуг с использованием пространства имен, как

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); 
} 

См эту ссылку Dragable form

Кредиты для rahul-rajat-singh

1

У меня был тот же вопрос некоторое время назад, и в поисках ответа, я нашел следующий код (не помню сайт) и Вот что я делаю:

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; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^