2010-01-26 12 views
30

Tengo una situación en la que sería beneficioso para mí permitir que el usuario modifique el tamaño de mi formulario de Windows, pero solo verticalmente. Después de algunas búsquedas, parece que no hay mucho sobre este tema en particular. ¿Es posible?Ventanas de tamaño variable verticalmente (solo) en C#

+10

@Will: Eso depende de lo que se muestre el formulario. Hay (algunos) casos donde esta es una buena idea. – SLaks

+7

@slaks nunca lo ha visto. He visto muchas aplicaciones que creen que saben lo grande que debe ser una forma. Visual Studio todavía tiene algunos de ellos. Estas formas tienen una cosa en común: las personas que las crearon estaban equivocadas sobre el tamaño "correcto". En todos los casos, deje que el usuario decida cuál es el tamaño del formulario o arriesgarse a la condena. (Divulgación completa, me arriesgo a la condena. Estoy avergonzado.) – Will

+4

@Will: ¿Qué hay de Virtual PC 2007? – SLaks

Respuesta

66

Debe establecer las propiedades MinimumSize y MaximumSize del formulario en dos tamaños con diferentes alturas pero con el mismo ancho.

Si no desea que el cursor de cambio de tamaño horizontal a aparecer en absoluto, que necesita para manejar el mensaje WM_NCHITTEST, así:

protected override void WndProc(ref Message m) { 
    base.WndProc(ref m); 
    switch (m.Msg) { 
     case 0x84: //WM_NCHITTEST 
      var result = (HitTest)m.Result.ToInt32(); 
      if (result == HitTest.Left || result == HitTest.Right) 
       m.Result = new IntPtr((int)HitTest.Caption); 
      if (result == HitTest.TopLeft || result == HitTest.TopRight) 
       m.Result = new IntPtr((int)HitTest.Top); 
      if (result == HitTest.BottomLeft || result == HitTest.BottomRight) 
       m.Result = new IntPtr((int)HitTest.Bottom); 

      break; 
    } 
} 
enum HitTest { 
    Caption = 2, 
    Transparent = -1, 
    Nowhere = 0, 
    Client = 1, 
    Left = 10, 
    Right = 11, 
    Top = 12, 
    TopLeft = 13, 
    TopRight = 14, 
    Bottom = 15, 
    BottomLeft = 16, 
    BottomRight = 17, 
    Border = 18 
} 
+2

el minsize/maxsize es mucho más limpio que mi solución, +1 de mí ... –

+5

No puedo creer que no haya pensado en esto ... ¡Muy bien! ¡Y gracias por los detalles de WndProc de ocultar ese cursor de tamaño! – Ben

+0

Solo un comentario ... ¿no debería hacer que HitTest.Left y .Right devuelvan None y not Caption? Usar Caption hace que la ventana se pueda arrastrar en esos lugares, ¿no? – MarqueIV

7

Establecer el tamaño máximo & min para el ancho de la forma solo

+0

mucho más limpio que mi solución, +1 de mí ... –

+1

Asegúrese de hacerlo en el evento Load, no en el constructor. O la escala automática recortará el contenido del formulario. –

+1

Si deja el componente de altura de las propiedades MinimumSize y MaximumSize en 0 pero establece un ancho, limitará la ventana a su altura mínima. Las restricciones MinimumSize y MaximumSize solo se ignoran cuando ambos componentes son cero; si el conjunto de uno y el otro se dejan en cero, aplicará ambos componentes literalmente. – Dathan

12

sólo una idea ...

public partial class Form1 : Form { 
    int _width; 

    public Form1() { 
     _width = this.Width; 
     InitializeComponent(); 
    } 

    protected override void OnResize(EventArgs e) { 
     this.Width = _width; 
     base.OnResize(e); 
    } 
} 

EDITAR: Tenga en cuenta que las soluciones min/max tamaño funcionan mucho mejor que este truco :)

+0

Pásame a ello. +1 Para otras soluciones, no estoy seguro de que sea posible tener un ancho máximo/mínimo sin establecer también una altura máxima/mínima. Esta solución te permitirá cambiar el tamaño del formulario, pero volverá a su ancho original. –

+0

@George: puede establecer un mínimo pequeño y un máximo muy grande. – SLaks

+0

trabajado para mí +1 – cihata87

1

Sí, es posible. Simplemente configure su forma.MinimumSize.Width = form.MaximumSize.Width = 100 (o el ancho que desee).

+0

No puede asignar el ancho directamente como form.MinimunSize o form.MaximumSize devuelve un tipo de valor, no una referencia. –

+1

No fue una muestra de código de trabajo, solo una idea de lo que debería configurarse. –

+0

No entiendo cómo las personas olvidan usar la lógica cuando intentan entender una declaración simple. +1 –

1

Deje que el FormBorderStyle a MaximumSize dimensionable y fijar y MinimumSize = new Tamaño (this.width, 0)

Corrección:

this.MinimumSize = new Size(this.Width, 0); 
this.MaximumSize = new Size(this.Width, Int32.MaxValue); 
+0

Esto no funcionará. – SLaks

+2

Los componentes MinimumSize y MaximumSize solo se interpretan como "sin límite" cuando AMBOS componentes son cero. – Dathan

+0

@SLaks, ¡Tienes razón! la altura debe ajustarse a un valor diferente en los tamaños mínimo y máximo. –

0

para evitar el efecto "caucho de bandas" de @ la solución de orsogufo:

public Form1() 
{ 
    InitializeComponent(); 
    this.MinimumSize = new Size(500, 0); 
    this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height)); 
} 

no va a ajustar correctamente su altura máxima para dar cabida a una pantalla más grande si cambia el tamaño de los s cree límites, pero para los tamaños de pantalla estáticos funciona muy bien.

Cuestiones relacionadas