2010-04-04 14 views
20

Est-ce que quelqu'un sait comment je peux redimensionner un winform quand il n'a pas de bordure. Je ne veux pas la bordure par défaut que Windows a, donc j'ai changé la propriété "FormBorderStyle" à "None". Cela a supprimé la bordure, bien que maintenant il ne peut pas être redimensionné. J'ai compris comment déplacer le formulaire, j'ai juste besoin de savoir comment le redimensionner.Comment déplacer et redimensionner un formulaire sans bordure?

Répondre

42

Quelques exemples de code qui permettent de déplacer et de redimensionner la forme:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     this.FormBorderStyle = FormBorderStyle.None; 
     this.DoubleBuffered = true; 
     this.SetStyle(ControlStyles.ResizeRedraw, true); 
    } 
    private const int cGrip = 16;  // Grip size 
    private const int cCaption = 32; // Caption bar height; 

    protected override void OnPaint(PaintEventArgs e) { 
     Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip); 
     ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc); 
     rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption); 
     e.Graphics.FillRectangle(Brushes.DarkBlue, rc); 
    } 

    protected override void WndProc(ref Message m) { 
     if (m.Msg == 0x84) { // Trap WM_NCHITTEST 
     Point pos = new Point(m.LParam.ToInt32()); 
     pos = this.PointToClient(pos); 
     if (pos.Y < cCaption) { 
      m.Result = (IntPtr)2; // HTCAPTION 
      return; 
     } 
     if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip) { 
      m.Result = (IntPtr)17; // HTBOTTOMRIGHT 
      return; 
     } 
     } 
     base.WndProc(ref m); 
    } 
    } 
+0

Comme cela, je reçois un bar laid bleu en haut. – C4u

+5

Peut-être que vous aimez les pinceaux.Chartreuse mieux. Le style est bien entendu entièrement à vous, plutôt que d'écrire du code comme celui-ci. Si vous ne voulez pas en prendre soin, ne vous embêtez pas avec les fenêtres sans bordure. Ou embaucher un designer. –

+3

Pas besoin d'être impoli. Havnt vu il y a un pinceau inséré avec cette couleur. Vous pourriez avoir ajouté cette information à votre question au lieu de simplement copier-coller. Merci quand même. Je l'ai fixé avec la couleur de la brosse. – C4u

-1

Si vous supprimez la bordure, vous supprimez également la fonctionnalité intégrée pour redimensionner le cadre. Il existe des moyens de contourner ce problème, mais vous devrez créer votre propre fonctionnalité pour faire glisser et redimensionner la bordure.

1

(préciser: en commentaire 2)

Redimensionner « Formulaire "De Tout lieu et déplacez-le >>> Code complet < < < < <

// Tout d'abord u plus pour ajouter cette classe

class ReSize 
    { 

     private bool Above, Right, Under, Left, Right_above, Right_under, Left_under, Left_above; 


     int Thickness=6; //Thickness of border u can cheang it 
     int Area = 8;  //Thickness of Angle border 


     /// <summary> 
     /// Constructor 
     /// </summary> 
     /// <param name="thickness">set thickness of form border</param> 
     public ReSize(int thickness) 
     { 
      Thickness = thickness; 
     } 

     /// <summary> 
     /// Constructor set thickness of form border=1 
     /// </summary> 
     public ReSize() 
     { 
      Thickness = 10; 
     } 

     //Get Mouse Position 
     public string getMosuePosition(Point mouse, Form form) 
     { 
      bool above_underArea = mouse.X > Area && mouse.X < form.ClientRectangle.Width - Area; /* |\AngleArea(Left_Above)\(=======above_underArea========)/AngleArea(Right_Above)/| */ //Area===>(==) 
      bool right_left_Area = mouse.Y > Area && mouse.Y < form.ClientRectangle.Height - Area; 

      bool _Above=mouse.Y <= Thickness; //Mouse in Above All Area 
      bool _Right= mouse.X >= form.ClientRectangle.Width - Thickness; 
      bool _Under=mouse.Y >= form.ClientRectangle.Height - Thickness; 
      bool _Left=mouse.X <= Thickness; 

      Above = _Above && (above_underArea); if (Above) return "a"; /*Mouse in Above All Area WithOut Angle Area */ 
      Right = _Right && (right_left_Area); if (Right) return "r"; 
      Under = _Under && (above_underArea); if (Under) return "u"; 
      Left = _Left && (right_left_Area); if (Left) return "l"; 


      Right_above =/*Right*/ (_Right && (!right_left_Area)) && /*Above*/ (_Above && (!above_underArea)); if (Right_above) return "ra";  /*if Mouse Right_above */ 
      Right_under =/* Right*/((_Right) && (!right_left_Area)) && /*Under*/(_Under && (!above_underArea)); if (Right_under) return "ru";  //if Mouse Right_under 
      Left_under = /*Left*/((_Left) && (!right_left_Area)) && /*Under*/ (_Under && (!above_underArea)); if (Left_under) return "lu";  //if Mouse Left_under 
      Left_above = /*Left*/((_Left) && (!right_left_Area)) && /*Above*/(_Above && (!above_underArea));  if (Left_above) return "la";  //if Mouse Left_above 

      return ""; 

     } 


    } 

Formez ensuite cs

public partial class FormGDI : Form 
    { 

     ReSize resize = new ReSize();  // ReSize Class "/\" To Help Resize Form <None Style> 


     public FormGDI() 
     { 
      InitializeComponent(); 
      this.SetStyle(ControlStyles.ResizeRedraw, true); 

     } 


     private const int cGrip = 16;  // Grip size 
     private const int cCaption = 32; // Caption bar height; 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      //this if you want to draw (if) 

      Color theColor = Color.FromArgb(10, 20, 20, 20); 
      theColor = Color.DarkBlue; 
      int BORDER_SIZE = 4; 
      ControlPaint.DrawBorder(e.Graphics, ClientRectangle, 
             theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, 
             theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, 
             theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, 
             theColor, BORDER_SIZE, ButtonBorderStyle.Dashed); 


      Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip); 
      ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc); 
      rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption); 
      e.Graphics.FillRectangle(Brushes.DarkBlue, rc); 



      base.OnPaint(e); 
     } 


     //set MinimumSize to Form 
     public override Size MinimumSize 
     { 
      get 
      { 
       return base.MinimumSize; 
      } 
      set 
      { 
       base.MinimumSize = new Size(179, 51); 
      } 
     } 

     // 
     //override WndProc 
     // 
     protected override void WndProc(ref Message m) 
     { 
      //**************************************************************************** 

      int x = (int)(m.LParam.ToInt64() & 0xFFFF);    //get x mouse position 
      int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); //get y mouse position you can gave (x,y) it from "MouseEventArgs" too 
      Point pt = PointToClient(new Point(x, y)); 

      if (m.Msg == 0x84) 
      { 
       switch (resize.getMosuePosition(pt, this)) 
       { 
        case "l": m.Result = (IntPtr)10; return; // the Mouse on Left Form 
        case "r": m.Result = (IntPtr)11; return; // the Mouse on Right Form 
        case "a": m.Result = (IntPtr)12; return; 
        case "la": m.Result = (IntPtr)13; return; 
        case "ra": m.Result = (IntPtr)14; return; 
        case "u": m.Result = (IntPtr)15; return; 
        case "lu": m.Result = (IntPtr)16; return; 
        case "ru": m.Result = (IntPtr)17; return; // the Mouse on Right_Under Form 
        case "": m.Result = pt.Y < 32 /*mouse on title Bar*/ ? (IntPtr)2 : (IntPtr)1; return; 

       } 
      } 

       base.WndProc(ref m); 

     } 

    } 
+0

Pouvez-vous élaborer sur la façon dont cela répond à la question? Merci! – DanM7

+0

elaborate: premier id faire classe redimensionner il a une méthode cette méthode pour déterminer la position de la forme de la souris calculer ('point mouse') et (Form Form') pour obtenir la largeur et la hauteur de forme puis le plus important WndProc' Override Méthode cette méthode a 'ref Message m' param quand' m.msg = 0x84'value vous pouvez définir m.result = 10 cela signifie que vous appelez 'form' pour redimensionner de gauche et' m.Result = 11' appel 'form' de Droite et .... à 17 mais quand 'm.Result = 2 vous appelez pour déplacer la' forme' et quand 'm.Result = 1'that signifie appel' ne faites rien ' – NourAldienArabian

+0

ça aide, mais il ne gère pas le défilement, il crée de nouvelles 'lignes' de bordure à travers le formulaire lors du défilement – CularBytes

4

Voici un exemple complet d'une forme personnalisée avec les 8 points de redimensionnement:

public partial class Form1 : Form { 
public Form1() { 
    InitializeComponent(); 
    this.FormBorderStyle = FormBorderStyle.None; // no borders 
    this.DoubleBuffered = true; 
    this.SetStyle(ControlStyles.ResizeRedraw, true); // this is to avoid visual artifacts 
} 

protected override void OnPaint(PaintEventArgs e) // you can safely omit this method if you want 
{ 
    e.Graphics.FillRectangle(Brushes.Green, Top); 
    e.Graphics.FillRectangle(Brushes.Green, Left); 
    e.Graphics.FillRectangle(Brushes.Green, Right); 
    e.Graphics.FillRectangle(Brushes.Green, Bottom); 
} 

private const int 
    HTLEFT = 10, 
    HTRIGHT = 11, 
    HTTOP = 12, 
    HTTOPLEFT = 13, 
    HTTOPRIGHT = 14, 
    HTBOTTOM = 15, 
    HTBOTTOMLEFT = 16, 
    HTBOTTOMRIGHT = 17; 

const int _ = 10; // you can rename this variable if you like 

Rectangle Top { get { return new Rectangle(0, 0, this.ClientSize.Width, _); } } 
Rectangle Left { get { return new Rectangle(0, 0, _, this.ClientSize.Height); } } 
Rectangle Bottom { get { return new Rectangle(0, this.ClientSize.Height - _, this.ClientSize.Width, _); } } 
Rectangle Right { get { return new Rectangle(this.ClientSize.Width - _, 0, _, this.ClientSize.Height); } } 

Rectangle TopLeft { get { return new Rectangle(0, 0, _, _); } } 
Rectangle TopRight { get { return new Rectangle(this.ClientSize.Width - _, 0, _, _); } } 
Rectangle BottomLeft { get { return new Rectangle(0, this.ClientSize.Height - _, _, _); } } 
Rectangle BottomRight { get { return new Rectangle(this.ClientSize.Width - _, this.ClientSize.Height - _, _, _); } } 


protected override void WndProc(ref Message message) 
{ 
    base.WndProc(ref message); 

    if (message.Msg == 0x84) // WM_NCHITTEST 
    { 
     var cursor = this.PointToClient(Cursor.Position); 

     if (TopLeft.Contains(cursor)) message.Result = (IntPtr)HTTOPLEFT; 
    else if (TopRight.Contains(cursor)) message.Result = (IntPtr)HTTOPRIGHT; 
    else if (BottomLeft.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMLEFT; 
    else if (BottomRight.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMRIGHT; 

    else if (Top.Contains(cursor)) message.Result = (IntPtr)HTTOP; 
    else if (Left.Contains(cursor)) message.Result = (IntPtr)HTLEFT; 
    else if (Right.Contains(cursor)) message.Result = (IntPtr)HTRIGHT; 
    else if (Bottom.Contains(cursor)) message.Result = (IntPtr)HTBOTTOM; 
    } 
}} 
1

« Sizer » est le panneau bleu clair dans le coin inférieur droit enter image description here

int Mx; 
    int My; 
    int Sw; 
    int Sh; 

    bool mov; 

    void SizerMouseDown(object sender, MouseEventArgs e) 
    { 
     mov = true; 
     My = MousePosition.Y; 
     Mx = MousePosition.X; 
     Sw = Width; 
     Sh = Height; 
    } 

    void SizerMouseMove(object sender, MouseEventArgs e) 
    { 
     if (mov == true) { 
      Width = MousePosition.X - Mx + Sw; 
      Height = MousePosition.Y - My + Sh; 
     } 
    } 

    void SizerMouseUp(object sender, MouseEventArgs e) 
    { 
     mov = false; 
    }