Ventana sin bordes Con Areo Snap, Shadow, Minimize Animation y Shake


Estoy haciendo una aplicación con una ventana sin bordes en Windows. Sin embargo, dado que la ventana no tiene bordes, no tengo sombra de areo, snap, animación de minimización o sacudida. He mirado alrededor y no he encontrado ningún sitio que explique cómo implementar esto. Sin embargo, sé que es posible porque Office 2013, Visual Studio 2012 y Steam tienen estas características y no tienen bordes. Estoy usando específicamente QT y C++, pero si ha resuelto esto para otra biblioteca de ventanas, me gustaría escuchar su soluciones también. bien. Y por sombra de areo no me refiero a sombra paralela en dos lados, me refiero a la sombra brillante en todos los lados de todas las aplicaciones nativas activas de areo Windows.

Author: ROMANIA_engineer, 2013-05-27

3 answers

Después de usar Spy++ para inspeccionar la ventana de Steam (sus estilos de ventana, cómo responde a los mensajes de la ventana) e intentar hacer coincidir todo lo que hace, combinado con las llamadas DWMAPI desde este comportamiento de ventana sin bordes de C# , creo que lo descubrí.

Para ocultar el borde de la ventana, maneje el mensaje WM_NCCALCSIZE en su WindowProc:

case WM_NCCALCSIZE: {
    if (window->is_borderless) {
        return 0;
    } else {
        return DefWindowProc(hwnd, msg, wparam, lparam);
    }
}

Para habilitar la sombra, todo lo que necesita hacer es:

MARGINS borderless = {1,1,1,1};
DwmExtendFrameIntoClientArea(hwnd, &borderless);

Para desactivarlo, restaure los márgenes predeterminados MARGINS windowed = {0,0,0,0};. Posiblemente agrega un SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_NOSIZE | SWP_NOMOVE ); también, para asegurarte de que el marco se vuelva a dibujar.

Sin embargo, esto no parece funcionar con todos los estilos de ventana, aparentemente su estilo de ventana no debe contener una barra de título. Las barras de título funcionan bien, y agregar una parece habilitar la animación de minimización.

El estilo de ventana más simple con el que conseguí la sombra para trabajar fue WS_POPUP | WS_THICKFRAME, para obtener también aero snap, maximización, minimización y la animación de minimización suave que usé WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION.

Cambiando DWMWA_NCRENDERING_POLICY o DWMWA_ALLOW_NCPAINT vía DwmSetWindowAttribute no parece ser necesario, la configuración predeterminada parece funcionar.

Una palabra de precaución: DwmExtendFrameIntoClientArea hace exactamente lo que el nombre sugiere, por lo que si está dibujando una imagen con un canal alfa directamente en su área de cliente (por ejemplo, con opengl, direct3d/2d), un pequeño marco será visible a través de él:

ventana sin bordes con sombra y marco que se muestra en el área del cliente

Así que es posible que tenga que poner un widget no transparente, pincel o algo detrás del elemento transparente.

Si todo va bien, entonces debería mirar así:

introduzca la descripción de la imagen aquí

Aquí hay un pequeño ejemplo de proyecto, F11 alterna el modo sin bordes/ventana, F12 alterna la sombra sin bordes.

 34
Author: melak47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 21:13:00

Gracias a melak47 por su respuesta.

Para las personas que están buscando un ejemplo de C++ / Qt, este GitHub profect hace el trabajo como un encanto (gracias a deimos1877) basado en el código melak47! https://github.com/deimos1877/BorderlessWindow

Asegúrese de usar visual studio compiler (>= 2010) para obtener la DLL necesaria y debería funcionar. Este ejemplo incluye soporte de aerosnap, ventana sin bordes, efecto de minimización, sombras aerodinámicas.

 10
Author: Kévin Renella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 12:17:23

He creado uno que responde como photoshop.

BorderlessWindowQt-Modern-Gui

Imagen True Borderless WindowQt

 1
Author: Moussa Ball,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 18:12:20