2015-07-03 7 views
5

Ich fand einige Code online und kopierte es, bis jetzt konnte ich alles richtig machen, bis auf eine Sache, die ich möchte die Form (Fenster) komplett randlos machen.Borderless und Resizable Form (C#)

Ich benutze Visual Studio 2013 und diese Frage ist einfach über den Code, der benötigt wird, um das Formular (Fenster) randlos zu machen. Das Problem ist, dass wenn Sie es randlos machen, es nicht mehr in der Größe veränderbar ist, aber wenn es einen Rahmen hat, kann es in der Größe geändert werden.

Ich weiß, mit etwas Code ist es möglich zu überschreiben und beides zu erreichen. Das habe ich bisher (von einer anderen Website kopiert). Dadurch wird der obere Balken mit dem Programmnamen gelöscht, das Formular wird durch Klicken und Ziehen des Formulars verschoben und die Größe kann geändert werden.

Das einzige Problem ist, dass die Grenze immer noch da ist. Welchen Code kann ich hinzufügen, damit die Grenze weg ist? Ich möchte diesen aktuellen Code beibehalten, da er einige Funktionen unterstützt, die ich bereits benötige.

Übrigens habe ich mir ältere Fragen mit ähnlichen Themen angeschaut, aber nicht den richtigen Code gefunden, den ich brauche.

Für den Mod, der mich zu einem anderen Thread leitete: Ich versuchte den Code dort und es ist nicht genau das, was ich versuche zu erreichen, obwohl es ein ähnliches Problem ist. Als ich diesen Code ausprobierte, konnte ich nirgends auf das Formular (Fenster) klicken, um es zu verschieben. Plus, es hatte eine größenveränderbare Ecke unten rechts, was nicht das ist, wonach ich suche. Ich benötige die Größenänderungsfunktion an allen Ecken und Seiten wie ein normales Fenster.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace BoxHider 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      //Next line doesn't seem to be working 
      this.FormBorderStyle = FormBorderStyle.None; 
     } 
     const int WM_NCHITTEST = 0x0084; 
     const int HTCLIENT = 1; 
     const int HTCAPTION = 2; 
     protected override void WndProc(ref Message m) 
     { 
      base.WndProc(ref m); 
      switch (m.Msg) 
      { 
       case WM_NCHITTEST: 
        if (m.Result == (IntPtr)HTCLIENT) 
        { 
         m.Result = (IntPtr)HTCAPTION; 
        } 
        break; 
      } 
     } 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.Style |= 0x40000; 
       return cp; 
      } 
     }    
    } 
} 

What I need

+1

Wie werden Sie erwarten, dass das Formular ohne Rand, um die Größe zu ziehen ?? Einfach den Rand des Formulars ziehen? –

+1

Der sichtbare Rahmen ist nicht mehr vorhanden, aber wenn Sie die Maus an den Rand des Formulars bewegen, ändert sich der Cursor und Sie können die Größe durch Klicken und Ziehen ändern. –

Antwort

7

Versuchen Sie folgendes:

public Form1() 
{ 
    InitializeComponent(); 
    this.FormBorderStyle = FormBorderStyle.None; 
} 

protected override void WndProc(ref Message m) 
{ 
    const int RESIZE_HANDLE_SIZE = 10; 

    switch (m.Msg) 
    { 
     case 0x0084/*NCHITTEST*/ : 
      base.WndProc(ref m); 

      if ((int)m.Result == 0x01/*HTCLIENT*/) 
      { 
       Point screenPoint = new Point(m.LParam.ToInt32()); 
       Point clientPoint = this.PointToClient(screenPoint);       
       if (clientPoint.Y <= RESIZE_HANDLE_SIZE) 
       { 
        if (clientPoint.X <= RESIZE_HANDLE_SIZE) 
         m.Result = (IntPtr) 13/*HTTOPLEFT*/ ; 
        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE)) 
         m.Result = (IntPtr) 12/*HTTOP*/ ; 
        else 
         m.Result = (IntPtr) 14/*HTTOPRIGHT*/ ; 
       } 
       else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE)) 
       { 
        if (clientPoint.X <= RESIZE_HANDLE_SIZE) 
         m.Result = (IntPtr) 10/*HTLEFT*/ ; 
        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE)) 
         m.Result = (IntPtr) 2/*HTCAPTION*/ ; 
        else 
         m.Result = (IntPtr) 11/*HTRIGHT*/ ; 
       } 
       else 
       { 
        if (clientPoint.X <= RESIZE_HANDLE_SIZE) 
         m.Result = (IntPtr) 16/*HTBOTTOMLEFT*/ ; 
        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE)) 
         m.Result = (IntPtr) 15/*HTBOTTOM*/ ; 
        else 
         m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ; 
       } 
      } 
      return; 
    } 
    base.WndProc(ref m); 
} 

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.Style |= 0x20000; // <--- use 0x20000 
     return cp; 
    } 
} 

Informationsquelle:

+0

Die Grenze wurde entfernt, aber sie ist nicht veränderbar. –

+0

Versuchen Sie es jetzt. Die Standorte werden nun manuell festgelegt und die richtige Aktion wird angewendet. – Sunsetquest

+1

Dies ist professioneller Code. Es funktioniert genau so, wie ich es brauchte. –

0

Sie sollten die Grenze Stil gesetzt, nachdem das Formular geladen:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    this.FormBorderStyle = FormBorderStyle.None; 
} 
+0

hatte ich schon, hatte keine Wirkung. –