Ventana sin bordes que usa 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, broche, 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 todas estas características y no tienen bordes. Estoy utilizando específicamente QT y C ++, pero si ha resuelto esto para otra biblioteca de ventanas, me gustaría escuchar sus soluciones también. ya sea. Y por areo shadow no me refiero a la sombra paralela en dos lados, me refiero a la sombra shiny en todos los lados de todas las aplicaciones de windows nativas activas.

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 de 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 por defecto MARGINS windowed = {0,0,0,0}; . Tal vez arrojar 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 asegurarse 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 permitir la minimización de la animación.

El estilo de ventana más sencillo con el que WS_POPUP | WS_THICKFRAME la sombra fue WS_POPUP | WS_THICKFRAME WS_POPUP | WS_THICKFRAME , para obtener también snap aerodynamic, maximizar, minimizar y minimizar la animación, utilicé WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION WS_POPUP | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION .

No parece necesario cambiar DWMWA_NCRENDERING_POLICY o DWMWA_ALLOW_NCPAINT través de DwmSetWindowAttribute ; la configuración predeterminada parece funcionar.

Una palabra de advertencia: DwmExtendFrameIntoClientArea hace exactamente lo que sugiere su nombre, 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 muestra en el área del cliente

Por lo tanto, es posible que deba colocar un widget no transparente, un pincel o algo detrás del elemento transparente.

Si todo va bien, debería verse así:

enter image description here

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

Gracias a melak47 por tu respuesta.

Para las personas que buscan un ejemplo de C ++ / Qt, este profect de GitHub funciona como un encanto (gracias a deimos1877) basado en el código melak47. https://github.com/deimos1877/BorderlessWindow

Asegúrese de usar el comstackdor de Visual Studio (> = 2010) para obtener la DLL necesaria y debería funcionar. Este ejemplo incluye soporte aerosnap, ventana sin bordes, efecto de minimizar, sombras aerodinámicas.

He creado uno que responde como photoshop.

BorderlessWindowQt-Modern-Gui

Imagen True Window sin bordes