Frage

Wie bewege ich ein Fenster, das keinen Rand hat? Es gibt keinen leeren Speicherplatz in der Anwendung, alles was verfügbar ist, ist ein Webbrowser und ein MenuSrip. Ich möchte, dass die Benutzer das Fenster verschieben können, indem sie den Menüstreifen ziehen. Wie codiere ich das? Ich habe ein paar Codeblöcke ausprobiert, die ich online gefunden habe, aber keiner von ihnen hat funktioniert.

War es hilfreich?

Lösung

Dies Der Code -Projektartikel sollte Ihnen helfen, dies zu erreichen. Ich habe das selbst ohne Probleme benutzt. Dies ist der Jist davon:

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

Dies wird den Fenstermanager im Grunde genommen "dazu bringen" zu glauben, dass er die Titelleiste der Winform greift.

Um es auf Ihr Projekt anzuwenden, verwenden Sie einfach das MouseDown -Event vom MenuSrip.

Andere Tipps

Hier ist der .NET -Weg

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

das ist es.

Sie können Ihre MenuSrip vortäuschen, beispielsweise mit einem Panel mit einem Etikett mit einem Etikett. Und dann können Sie dies manuell verarbeiten: Wenn der Benutzer auf das Etikett klickt, wird ein Popup -Menü geöffnet, und wenn der Benutzer das Etikett zieht, verschiebt sich das Fenster. Aber ich würde von solchen Problemumgehungen raten, weil es kein Standard -GUI -Verhalten ist und Sie Ihre Benutzer möglicherweise verwirren.

Ich habe es nicht ausprobiert, aber wenn Sie die "OnmouseDown "- und" OnmouseUp "-Vereignisse in der Menüleiste bewältigen können:

  • Auf der Maus nach unten - bewegen Sie das Fenster gemäß der Mausbewegung
  • Hören Sie auf, die Mausbewegung auf der Maus zu verfolgen, oder die Maus auszugehen

Wenn Sie ein Panel verwenden, müssen Sie dies in die hinzufügen

YourForm.designer.cs

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

und das in der

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

Mbithi Kioko ist auf dem richtigen Weg, aber ich würde es so machen.

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

Ich musste benutzen System.Runtime.InteropServices.DllImportAttribute - Ich dachte nur, ich würde kommentieren und dich alle wissen lassen.

Setzen Sie einfach den Startpunkt in ein 2D -Array wie folgt ein:

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

        }

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top