2010-08-29 24 views
23

En Windows 7, las ventanas del mezclador de volumen tienen un estilo específico, con un borde grueso y transparente, pero sin una barra de título. ¿Cómo recrearé ese estilo de ventana en una ventana de winforms?Cómo crear un formulario con un borde, pero sin barra de título? (como el control de volumen en Windows 7)

volume mixer

me trataron establece el texto en String.Empty y ControlBox en false, lo que elimina la barra de título, pero luego la frontera también desaparece:

border disappears

Respuesta

32
form.Text = string.Empty; 
form.ControlBox = false; 
form.FormBorderStyle = FormBorderStyle.SizableToolWindow; 

Para un fijo ventana de tamaño, aún debe usar FormBorderStyle.SizableToolWindow, pero puede anular el formulario WndProc para ignorar las pruebas de respuesta que no son del cliente (que se usan para cambiar los cursores de tamaño):

protected override void WndProc(ref Message message) 
{ 
    const int WM_NCHITTEST = 0x0084; 

    if (message.Msg == WM_NCHITTEST) 
     return; 

    base.WndProc(ref message); 
} 

Si desea aplicar realmente el tamaño, también se puede configurar MinimumSize igual a MaximumSize en el formulario.

+0

No, esto elimina por completo la frontera –

+0

@ oɔɯǝɹ: form.FormBorderStyle = FormBorderStyle.SizableToolWindow parece funcionar correctamente para mí. –

+0

@ oɔɯǝɹ: 'FixedToolWindow' elimina el borde 3D. Vea mi respuesta actualizada para obtener un comportamiento de tamaño fijo con el borde 3D intacto. –

0

form.FormBorderStyle = FormBorderStyle.Fixed3D;

+0

Aunque este código puede ayudar a resolver el problema, proporcionar un contexto adicional sobre por qué y/o cómo responde la pregunta mejoraría significativamente su valor a largo plazo. Por favor edite su respuesta para agregar alguna explicación. –

1

Dado que "Esta edición fue pensada para dirigirse al autor de la publicación y no tiene sentido como una edición. Debería haberse escrito como un comentario o una respuesta". Presento una edición de la respuesta de Chris como una nueva respuesta.

El código de su respuesta funciona como se describe, excepto que también evita que ocurra un evento de mouse de área de cliente. Debe devolver 1 (como en HTCLIENT) para solucionarlo.

protected override void WndProc(ref Message message) 
{ 
    const int WM_NCHITTEST = 0x0084; 
    const int HTCLIENT = 0x01; 

    if (message.Msg == WM_NCHITTEST) 
    { 
     message.Result = new IntPtr(HTCLIENT); 
     return; 
    } 

    base.WndProc(ref message); 
} 
Cuestiones relacionadas