2011-04-14 7 views
28

Estoy programando estrictamente en C y WinAPI, sin C++ o C#. Soy un principiante y solo estoy aprendiendo a dibujar controles, etc. La cosa es que cuando creo Windows u otros controles como los Botones de comando, tienen aspecto nativo de Windows. Echar un vistazo a esto:Programación en C + Win API: cómo obtener Windows 7 ¿Buscar controles?

This is look I am getting!

Pero en Windows 7, los botones de comando tener este aspecto:

enter image description here

Ahora, ¿Cómo llego botones de comando en mi programa para que parezca ese. ¿Es posible? Estoy siguiendo este tutorial, para referencia: http://zetcode.com/gui/winapi/

Gracias.

Respuesta

17

Habilita los estilos visuales para su aplicación al proporcionar un manifiesto XML, ya sea como un archivo separado o como un recurso incrustado. Ver Enabling Visual Styles para más detalles.

+0

Gracias! Ahora, mi aplicación se ve exactamente como quiero. –

22

Así es como los controles miraban atrás en la década de 1990, antes de que se inventaran los temas (estilos visuales). Como habrás notado, los botones modernos ahora están pintados con pantalones de fantasía con degradados y palpitantes y todo eso. Pero por razones de compatibilidad con versiones anteriores, debe solicitar específicamente que sus controles reciban ese tratamiento, o volverán al estilo heredado.

Lo haces especificando un manifiesto. Puede agregar uno en formato de texto sin formato al directorio raíz de su aplicación, o puede hacer que Visual Studio (2005 y posterior) incruste automáticamente uno en su EXE.

La segunda ruta es la que yo iría. Agregue el código siguiente a su archivo stdafx.h para informar al compilador que desea que se agregue el manifiesto de forma automática a la construcción de su proyecto:

#if defined _M_IX86 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") 
#elif defined _M_IA64 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") 
#elif defined _M_X64 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") 
#else 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 
#endif 

This MSDN article tiene más información sobre estilos visuales de lo que podría desear.


Y si realmente desea que su aplicación se vea como nativa, debe cambiar el pincel de fondo utilizado para la ventana principal. De manera predeterminada, está configurado para usar el mismo color que el fondo de un cuadro de texto (blanco).

En su lugar, desea utilizar el color utilizado para pintar controles 3D. Modificar el hbrBackground miembro de su estructura WNDCLASS (o WNDCLASSEX) como se muestra aquí:

wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 

¿Por qué tiene que añadir al menos 1? Por razones de compatibilidad con versiones anteriores, de nuevo. Los detalles son aburridos. :-)

+0

¡Gracias por la respuesta! :) No estoy incluyendo stdafx.h, así que solo fui por manifiesto. ¡Tu consejo sobre los colores fue realmente útil! ¡Solo arregle el color blanco del fondo! –

+2

@Ishan: en realidad puede poner ese código en cualquier lugar que desee, 'stdafx.h' fue solo una sugerencia porque está incluido en las plantillas predeterminadas. Se usa para encabezados precompilados, algo a lo que probablemente querrás acostumbrarte si vas a crear aplicaciones no triviales en el futuro. Y el código simplemente le dice al compilador que cree e inserte automáticamente un manifiesto. Se trata de ese manifiesto. ¡Me alegra que pudieras resolverlo! –

+0

¡No lo sabía! Gracias. –

14

Probablemente recuerde cuando Windows XP llegó con un aspecto nuevo y fresco, y podría volver a la apariencia clásica de Windows 95/2000, o podría cambiar el tema del color. Eso se llamó visual styles, lo que trajo a Windows un mejor soporte de tematización.

Classic, Luna, Aero and Metro

estilos visuales remained as a feature desde entonces. Windows Vista y 7 introdujeron Aero, pero aún así permitieron usar el tema clásico.Windows 8 eliminó Aero y el tema clásico, y agregó el tema de Metro. Los temas de alto contraste ahora forman parte de los estilos visuales y ya no tienen el aspecto clásico.

Por lo tanto, una aplicación temática clásica en Windows 7 cuando se esperaba un estilo Aero, es un problema con el estilo visual de la aplicación. No estoy seguro de por qué, pero Microsoft no dejó el viejo tema clásico como opcional mientras migraba la API al nuevo aspecto.

Entonces, ¿cómo aplico el estilo moderno?

enter image description here

De cualquier manera this MSDN article explica cómo habilitar los estilos visuales para su aplicación. He visto gente diciendo que habilitar Unicode (que define UNICODE) lo haría, pero es no es necesario. Básicamente, solo necesita escribir un archivo de manifiesto que especifique la versión 6 de la DLL de controles comunes como requisito, luego incrustarlo como un recurso o colocarlo en appname.exe.manifest en el directorio del ejecutable. Un manifiesto de la muestra se vería así:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" 
     name="CompanyName.ProductName.YourApplication" type="win32"/> 
    <description>Your application description here.</description> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity name="Microsoft.Windows.Common-Controls" 
       version="6.0.0.0" type="win32" processorArchitecture="*" 
       publicKeyToken="6595b64144ccf1df" language="*"/> 
     </dependentAssembly> 
    </dependency> 
</assembly> 

Si vas por la opción de inserción, no se olvide de tener winuser.h incluidos en el archivo de recursos. También es posible que inicializar los controles DLL común en su WinMain, según this MinGW guide:

que he visto este paso se perdió en algunos ejemplos, y puede causar algunos comportamientos extraños en determinadas versiones del sistema operativo y cierta condiciones, como botones invisibles o diálogos que no se pueden crear. mucho por la rápida respuesta

INITCOMMONCONTROLSEX icc; 
icc.dwSize = sizeof(icc); 
icc.dwICC = ICC_WIN95_CLASSES; 
InitCommonControlsEx(&icc); 
Cuestiones relacionadas