Cambiar el tamaño de la ventana sin bordes en la esquina inferior derecha

Me gustaría que el usuario cambie el tamaño de una ventana sin márgenes en la esquina inferior derecha, como puedo cambiar el tamaño de la ventana de autocompletar del control del cuadro combinado.

No puedo encontrar las propiedades para configurar un formulario de esa manera.

Tal vez alguien podría ayudarme con el problema.

Una imagen se puede encontrar aquí:

enter image description here

La forma correcta de lograr esto sería agregar un controlador de proceso de mensajes (anulando Form.WndProc por ejemplo) a su formulario y manejar el mensaje WM_NCHITTEST . (Puede encontrar la definición de C # de ese mensaje en PInvoke.net ). En particular, cuando recibe el mensaje, calcule si la prueba de acierto corresponde a un punto en la región que ha designado para cambiar el tamaño y, si lo está, devuelva HTBOTTOMRIGHT. El proceso de ventana predeterminado hará el rest por usted, ya que supondrá que el usuario ha hecho clic en la esquina inferior derecha del borde de la ventana, aunque su ventana no tenga borde.

Este enfoque requiere un poco de interoperabilidad Win32, pero hará que su tamaño se vea exactamente como cualquier otro tamaño de ventana.

La manera más fácil sería hacer lo que dijo @benPearce y poner un panel en la esquina y ajustar el tamaño del formulario usando Ancho / Alto. Va a funcionar, pero el cambio de tamaño no va a ser fácil, especialmente en Vista y Win7 Basic, donde el redibujado completo está desactivado en movimiento estándar y cambio de tamaño, mientras que se intentará volver a dibujar en cada paso.

Actualización : en ambos enfoques, tendrás que descubrir también cómo pintar la pinza. Puede poner un bitmap de la pinza estándar, por ejemplo. Sin embargo, dado que su formulario no tiene título y borde, por lo que no necesariamente está atascado con los visuales estándar de Windows, puede optar por algo elegante.

Actualización 2 : si tiene un control que cubre toda la ventana, se comerá los mensajes del mouse de formulario. Tienes que recortar de alguna manera el lugar que deseas usar para cambiar el tamaño de ese control. Tienes varias opciones para lidiar con esto:

  1. Cambie el tamaño del control para hacer espacio para el agarre de cambio de tamaño.
  2. Ajuste la región de control (a través de la propiedad Región) para excluir el control de cambio de tamaño.
  3. Cubra el control de ajuste de tamaño de un panel, escuche su mensaje MouseEnter y establezca la propiedad de Capture de forma en true, lo que provocará que todos los demás mensajes de mouse vayan a él. Nota : deberá liberar la captura una vez que el mouse abandone esa región después de que el cambio de tamaño haya finalizado.

Yo recomendaría ir por la opción 1 como la más simple. La opción 3 es la más compleja y requeriría detalles íntimos sobre cómo funciona la entrada del mouse en Windows, así que no lo recomendaría. La opción 2 es una buena alternativa a la opción 1, pero deberá probarla para ver cómo reactjsría el control ListView a la región que se está ajustando.

Aquí está el código correspondiente a las explicaciones de Franci, lo estaba escribiendo, pero respondió mientras tanto, vote su explicación, que es buena si este código satisface sus necesidades.

 protected override void WndProc(ref Message m) { const int wmNcHitTest = 0x84; const int htBottomLeft = 16; const int htBottomRight = 17; if (m.Msg == wmNcHitTest) { int x = (int) (m.LParam.ToInt64() & 0xFFFF); int y = (int) ((m.LParam.ToInt64() & 0xFFFF0000) >> 16); Point pt = PointToClient(new Point(x, y)); Size clientSize = ClientSize; if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { m.Result = (IntPtr) (IsMirrored ? htBottomLeft : htBottomRight); return; } } base.WndProc(ref m); } 

Editar: para escribir la pinza, puede inicializar un new VisualStyleRenderer(VisualStyleElement.Status.Gripper.Normal) y usar su método PaintBackground() .

Muchas gracias por publicar esta gran muestra y explicación. A continuación, agregué algunas adiciones que podrían interesar a los demás. Parte del código proviene de otras publicaciones de stackoverflow, pero para poder verlo en un bloque de código podría ser útil para otros. Quería poder cambiar el tamaño del formulario en TODAS las fronteras, no solo en la esquina inferior derecha. También quería ser capaz de arrastrar el formulario. Por último, quería una sombra paralela.

 //*********************************************************** //This gives us the ability to resize the borderless from any borders instead of just the lower right corner protected override void WndProc(ref Message m) { const int wmNcHitTest = 0x84; const int htLeft = 10; const int htRight = 11; const int htTop = 12; const int htTopLeft = 13; const int htTopRight = 14; const int htBottom = 15; const int htBottomLeft = 16; const int htBottomRight = 17; if (m.Msg == wmNcHitTest) { int x = (int)(m.LParam.ToInt64() & 0xFFFF); int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); Point pt = PointToClient(new Point(x, y)); Size clientSize = ClientSize; ///allow resize on the lower right corner if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(IsMirrored ? htBottomLeft : htBottomRight); return; } ///allow resize on the lower left corner if (pt.X <= 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(IsMirrored ? htBottomRight : htBottomLeft); return; } ///allow resize on the upper right corner if (pt.X <= 16 && pt.Y <= 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(IsMirrored ? htTopRight : htTopLeft); return; } ///allow resize on the upper left corner if (pt.X >= clientSize.Width - 16 && pt.Y <= 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(IsMirrored ? htTopLeft : htTopRight); return; } ///allow resize on the top border if (pt.Y <= 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(htTop); return; } ///allow resize on the bottom border if (pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(htBottom); return; } ///allow resize on the left border if (pt.X <= 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(htLeft); return; } ///allow resize on the right border if (pt.X >= clientSize.Width - 16 && clientSize.Height >= 16) { m.Result = (IntPtr)(htRight); return; } } base.WndProc(ref m); } //*********************************************************** //*********************************************************** //This gives us the ability to drag the borderless form to a new location 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 YOURCONTROL_MouseDown(object sender, MouseEventArgs e) { //ctrl-leftclick anywhere on the control to drag the form to a new location if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control) { ReleaseCapture(); SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); } } //*********************************************************** //*********************************************************** //This gives us the drop shadow behind the borderless form private const int CS_DROPSHADOW = 0x20000; protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ClassStyle |= CS_DROPSHADOW; return cp; } } //*********************************************************** 

Coloque un panel o algún otro control en la esquina, usando los eventos MouseDown y MouseMove del panel, ajuste el tamaño de los formularios de manera apropiada.

En MouseDown, registraría las coordenadas, luego en MouseMove puede calcular la diferencia desde la posición original para ajustar el tamaño de las formas.