ventanas ventana una restaurar puedo minimizar maximizar los funcionan cerrar botones boton aparecen c++ winapi window titlebar

c++ - restaurar - no puedo maximizar una ventana de excel



WinAPI: crea una ventana de tamaño variable sin barra de título, pero con los botones de minimizar/maximizar/cerrar(como Firefox/Chrome/Opera) (3)

Si miras las ventanas de los navegadores Firefox, Chrome u Opera, verás que sus ventanas

  • tener botones para minimizar / maximizar / cerrar
  • son redimensionables
  • pero no tienen barra de título

Me interesa: ¿cómo puedo crear una ventana así?

Lo que ya he intentado:

Miré alrededor en StackOverflow (y busqué en Google, también), y encontré esto: abriendo una ventana que no tiene barra de título con win32

Desgraciadamente, esto no ayudó por completo:

El primer paso fue extender la solución propuesta al abrir una ventana que no tiene barra de título con win32

hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX); // See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx SetWindowPos(hWnd, 0, 0, 0, 0, 0, // Position + Size SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

Por supuesto, esto no ofrece botones para minimizar / maximizar, pero, por otro lado, si quiero minimizar / maximizar botones, tengo que hacer lo siguiente:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);

¿Por qué esta combinación parece ser necesaria? Primero, probablemente quiera WS_MAXIMIZEBOX | WS_MINIMIZEBOX WS_MAXIMIZEBOX | WS_MINIMIZEBOX ya que quiero estos botones.

Pero http://msdn.microsoft.com/en-us/library/ms632600.aspx dice que si configuro uno de WS_MAXIMIZEBOX y WS_MINIMIZEBOX , también tengo que configurar WS_SYSMENU . Y cuando configuro WS_SYSMENU , también tengo que configurar WS_CAPTION pero esto no es lo que quiero, porque quería evitar la barra de título (de hecho: si WS_CAPTION no está configurado, no se muestran los botones minimizar / maximizar).

Entonces, ¿qué es hacer?


Creo que crean una ventana normal y luego pintan sobre la barra de título con sus widgets / pestañas personalizadas. Esto es evidente en Firefox, ya que cuando se cuelga se puede ver la barra de título normal de Windows aparecer sobre las pestañas.


Los programas eliminan el área no cliente (la barra de título) y tienen un montón de manejo personalizado para reproducir los botones de ventana, iconos, menú del sistema, etc. El beneficio de esto es que pueden dibujar a la nueva "barra de título", que en realidad es parte del área de cliente estándar, agregando pestañas u otros controles personalizados.

Los siguientes dos artículos le mostrarán cómo hacer esto en Vista y más arriba (usando el DWM):

Esto es muy complejo de hacer y hacer las cosas bien, por lo que los dos artículos anteriores son invaluables. ¡El autor debe haber puesto mucho trabajo en ellos! Ambos enlaces tienen un código de ejemplo escrito en Delphi, pero debería ser lo suficientemente fácil traducirlo a C ++: los conceptos son idénticos, es solo sintaxis.

También podría estar interesado en recursos generales sobre vidrio y DWM , ya que todo está estrechamente relacionado. Verás los dos enlaces anteriores incluidos en esa lista :)


Puede crear una ventana con o sin leyenda: lo que sea más apropiado desde el punto de vista de la personalización deseada (es decir, "sin", quiere hacerlo "sin la barra de título" como usted dice), y la verruga importante es esa te ocupas de pintar el área no cliente : esta es la clave.

En este punto, ya no hay nadie para pintar tus botones de mímima / maximizar. Sin embargo, eso no significa que tengas que hacer la pintura desde cero e imitar la interfaz de usuario estándar. Hay DrawFrameControl y amigos API donde puede usar el argumento DFCS_CAPTIONMIN y tener el botón de minimizar pintado para usted. También querrá responder a otros mensajes de área que no sean clientes, por ejemplo, maneje WM_NCHITTEST para indicarle a Windows dónde están sus nuevos botones de ventana.

Es posible que también desee consultar la Referencia de estilos visuales para aprovechar API de dibujo habilitada para temas como DrawThemeBackground .

Un ejemplo simple de esta actividad es poner un botón adicional en el título, tal como se describe en detalle aquí: CCaptionButton (botones para la barra de título) .