c++ - Ventana sin bordes que usa Areo Snap, Shadow, Minimize Animation y Shake
windows qt (3)
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 aerodinámico, 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:
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í:
Aquí hay un pequeño ejemplo de proyecto , F11 alterna el modo sin bordes / ventana, F12 activa y desactiva la sombra sin bordes.
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 brillante en todos los lados de todas las aplicaciones de windows nativas activas.
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 compilador 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.