2009-08-06 8 views
14

Korzystanie z C#.
Próbuję przenieść Form bez paska tytułu.
Znalazłem artykuł o tym na: http://www.codeproject.com/KB/cs/csharpmovewindow.aspxJak przenieść formularz systemu Windows, gdy jego właściwość FormBorderStyle jest ustawiona na Brak?

To działa tak długo, jak nie zostanie ustawiona FormBorderStyle jak None.

Czy istnieje sposób, aby zadziałał z tym zestawem właściwości jako None?

+0

Działa dla mnie z FormBorderStyle ustawionym na Brak. To jest na serwerze 2008, VS2008 z .NET 3.5. Co to jest .NET wersja i system operacyjny? –

+0

@ Michael McCloskey - Używam Windows 7 rc, vs2008 z .net 3.5. – Moon

+0

@Michael McClosKey - nevermind! Teraz działa. Nie wiem co się stało. – Moon

Odpowiedz

36

Wiem, że to pytanie ma ponad rok, ale szukałem, próbując sobie przypomnieć, jak to zrobiłem w przeszłości. Tak więc dla każdego innego odniesienia, najszybszy i mniej skomplikowany sposób, powyższy link ma zastąpić funkcję 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); 
} 

Umożliwi to przeniesienie dowolnego formularza poprzez kliknięcie i przeciągnięcie w obszarze roboczym.

+0

Czy możesz to wyjaśnić nieco? – masfenix

+0

Dodano trochę szczegółów na temat tego, co robi – LizB

+0

dlaczego nie mogę przeciągnąć formularza, gdy zdarzenie mousedown jest w menuStrip? – CMA

35

Oto najlepszy sposób, jaki znalazłem. Jest to ".NET way", bez użycia WndProc. Musisz tylko obsługiwać zdarzenia MouseDown, MouseMove i MouseUp powierzchni, które chcesz przeciągać.

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

Najpierw będziemy musieli korzystać z usług międzyoperacyjne używając nazw jako

using System.Runtime.InteropServices; 

Następną rzeczą byłoby zdefiniowanie wiadomości, które zadba o przeniesienie formularza. Będziemy musieli je jako zmienne składowe klasy

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

i wreszcie będziemy pisać kod, aby wysłać wiadomość, gdy użytkownik naciśnie przycisk myszy. Formularz zostanie przestawiony zgodnie z ruchem myszy, jeśli użytkownik przytrzyma naciśnięty przycisk myszy.

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    ReleaseCapture(); 
    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
} 

sprawdź ten link Dragable form

kredytów rahul-rajat-singh

1

Miałem to samo pytanie jakiś czas temu i podczas poszukiwania odpowiedzi znalazłem poniższy kod (nie pamiętam stronie internetowej) i Oto, co robię:

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; 
    } 
Powiązane problemy