2011-01-02 37 views
9

Làm cách nào để di chuyển cửa sổ không có đường viền. Không có không gian trống trên ứng dụng, tất cả những gì có sẵn là một webbrowser và một menustrip. Tôi muốn người dùng có thể di chuyển cửa sổ bằng cách kéo dải menu. Làm cách nào để tôi viết mã này? Tôi đã thử một vài khối mã tôi đã tìm thấy trực tuyến, nhưng không ai trong số họ làm việc.Di chuyển cửa sổ mà không cần biên giới

+5

Có lẽ vì nó không thể cho ứng dụng (hoặc người sử dụng) để phân biệt cho dù một nhấp chuột vào 'MenuStrip' được thiết kế để di chuyển các ứng dụng hoặc mở một menu. Có một lý do khiến cửa sổ có đường viền — suy nghĩ lại thiết kế của bạn. –

Trả lời

14

This Mã dự án sẽ giúp bạn thực hiện việc này. Tôi đã sử dụng bản thân mình mà không có vấn đề gì. Đây là jist của nó:

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

Điều này về cơ bản sẽ "lừa" người quản lý cửa sổ nghĩ rằng đó là lấy thanh tiêu đề của biểu tượng thắng.

Để áp dụng nó cho dự án của bạn, chỉ cần sử dụng sự kiện MouseDown từ MenuStrip.

+1

Điều đó hoạt động thực sự tuyệt vời. Bạn có thể thêm nội dung của phương thức vào bất kỳ sự kiện MouseDown nào, ví dụ như hình ảnh ... – Otiel

+0

Điều đó gần như quá dễ dàng :) Cảm ơn bạn! –

0

Bạn có thể giả mạo huy chương của mình, ví dụ sử dụng bảng điều khiển có nhãn thay thế. Và sau đó bạn có thể xử lý thủ công này: khi người dùng nhấp vào nhãn, menu bật lên sẽ mở và khi người dùng kéo nhãn, cửa sổ sẽ di chuyển. Nhưng tôi sẽ tư vấn cho cách giải quyết như vậy, bởi vì nó không phải là một hành vi GUI tiêu chuẩn, và bạn có thể làm cho người dùng của bạn bối rối.

+1

* Xin vui lòng * không làm điều này. Nó không chỉ là một giao diện người dùng hoàn toàn không chuẩn, nhưng nó vẫn không giải quyết được vấn đề giải thích một cú nhấp chuột. Hãy nhớ rằng "kéo" xảy ra * sau * một lần nhấp xảy ra.Nếu một nhấp chuột mở menu, hoặc nó sẽ được giải thích khi bắt đầu kéo? Máy thời gian chưa được hoàn thiện. –

+0

@Có Một nhấp chuột xảy ra khi bạn nhả nút chuột. Hãy xem cách nó hoạt động trong ngăn Folders của Windows Explorer: nếu bạn bấm vào một thư mục, nó sẽ mở ra trong khung bên phải, nhưng nếu bạn kéo một thư mục, nó không mở, nó sẽ bị kéo. –

+2

Đã hiểu. Nhưng hãy hiểu rằng bạn đang xác định sự kiện "Nhấp" khác với cách điều khiển menu diễn giải nó trong Windows. Ngay sau khi tôi nhấn nút chuột trên bất kỳ menu nào trong bất kỳ ứng dụng nào trong Windows, menu sẽ rơi xuống. Nó không xảy ra khi nút chuột được nhả ra. Tôi nghĩ rằng điều quan trọng là chỉ ra rằng các quyết định thiết kế làm thay đổi đáng kể hành vi mong đợi cần được xem xét đặc biệt cẩn thận. –

0

Tôi đã không thử nó, nhưng nếu bạn có thể xử lý "onmousedown" và "onMouseUp" sự kiện trên thanh menu:

  • On chuột xuống - Di chuyển cửa sổ theo phong trào chuột
  • Dừng theo dõi chuyển động của chuột khi di chuột lên hoặc di chuột ra
0

Nếu bạn đang sử dụng một Panel bạn phải thêm này trong

YourForm.Designer.cs

this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); 

và điều này trong 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); 
      } 
     } 
9

Đây là cách .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; 
    } 

là vậy.

+3

+1 cho giải pháp C# thuần túy. –

0

Mbithi Kioko đang đi đúng hướng nhưng tôi sẽ làm theo cách này.

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

Tôi đã phải sử dụng System.Runtime.InteropServices.DllImportAttribute - chỉ nghĩ rằng tôi sẽ nhận xét và cho bạn biết tất cả.

0

Chỉ cần đặt điểm bắt đầu vào một mảng 2D như thế này:

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

     } 

    } 
} 
Các vấn đề liên quan