2010-04-04 22 views
20

¿Alguien sabe cómo puedo cambiar el tamaño de un winform cuando no tiene borde? No quiero el borde predeterminado que tiene Windows, así que cambié la propiedad "FormBorderStyle" a "None". Esto eliminó el borde, aunque ahora no se puede cambiar el tamaño. He descubierto cómo mover el formulario, solo necesito saber cómo redimensionarlo.Cómo mover y cambiar el tamaño de un formulario sin un borde?

Respuesta

42

algunos ejemplos de código que permiten el movimiento y cambiar el tamaño de la forma:

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

como no recibo una fea barra azul en la parte superior. – C4u

+5

Tal vez te gusten los Brushes.Chartreuse better. El estilo es, por supuesto, totalmente de usted, más bien el punto de escribir código como este. Si no quieres ocuparte de eso, no te preocupes por las ventanas sin bordes. O contrata a un diseñador. –

+3

No hay necesidad de ser grosero. Havnt visto que hay un pincel insertado con ese color. Podría haber agregado esta información a su pregunta en lugar de solo copiar y pegar. Gracias de cualquier manera. Lo tengo arreglado con el color del pincel. – C4u

-1

Si quita el borde, también elimina la funcionalidad incorporada para cambiar el tamaño del marco. Hay formas de evitarlo, pero tendría que crear su propia funcionalidad para arrastrar y cambiar el tamaño del borde.

1

(elaboración: en el comentario 2)

Redimensionar "Formulario "From All place And Move it >>> Código completo < < < < <

// Primero au la mayoría para añadir esta clase

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

     } 


    } 

forman entonces 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

¿Puedes explicar cómo responde esto a la pregunta? ¡Gracias! – DanM7

+0

elabora: primera clase de cambio de tamaño de id tiene un método este método para determinar la posición del formulario de ratón calcular ('punto de mouse') y (' Formulario') para obtener ancho y alto de forma y la más importante 'WndProc' Anular El método de este método tiene 'ref Message m' param cuando' m.msg = 0x84'value puede establecer m.result = 10 que significa que usted llama 'form' para cambiar el tamaño desde la izquierda y' m.Result = 11' call 'form' desde la derecha y .... hasta 17, pero cuando 'm.Result = 2 llamas para mover la 'forma' y cuando' m.Result = 1'que significa llamar 'no hacer nada ' – NourAldienArabian

+0

te ayuda, pero no admite el desplazamiento, crea nuevas "líneas" de borde a través del formulario al desplazarse – CularBytes

4

Aquí hay un ejemplo completo de una forma personalizada con los 8 puntos de cambio de tamaño:

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" es el panel de color azul claro en la esquina inferior derecha 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; 
    } 
Cuestiones relacionadas