Cómo usar los temas de Windows XP en Visual Basic clásico

para que todos los controles se vean correctamente

Publicado: 30/Oct/2002
Actualizado: 21/Ago/2003


He creado esta nueva página sobre cómo usar los temas de Windows XP desde Visual Basic clásico, porque creo que vale la pena que conozcas los "problemillas" con los que te puedes encontrar y, lo mejor, cómo solventarlos.
No quiero con esto quitar méritos a la colaboración de Víctor Sánchez, pero creo que es conveniente "ahondar" un poco más.

 

Sigue este link si quieres saber cómo usar los temas de Windows XP desde los lenguajes de .NET Framework (Visual Basic .NET, C#, etc.).

21/Ago/2003:
Si quieres "automatizar" tus formularios de VB para usar los temas de Windows XP, sigue este link.

 

A continuación te relato algunos puntos que debes tener en cuenta, para evitar problemas:

  1. Como sabrás, (si has leído la colaboración de Víctor Sánchez o lo que comenté sobre este tema en la página de .NET Framework), para poder usar desde Visual Basic los temas de Windows XP, hay que hacer una llamada a InitCommonControls.
  2. Esa llamada al API de Windows hay que hacerla antes de que se haya mostrado ningún formulario de la aplicación, por tanto, si utilizas como punto de inicio de la aplicación el procedimiento Main, (el cual debe estar declarado en un módulo de tipo BAS), puedes hacerla dentro de ese procedimiento, pero antes de mostrar ningún formulario.
  3. Si no tienes un procedimiento Main y quieres usarla desde un formulario, sólo es necesario hacer esa llamada desde el formulario principal (el que se inicia con la aplicación), pero, (esto es muy importante), se debe hacer desde el evento Form_Initialize, es decir antes de que el formulario se muestre, si no lo hicieras así, la aplicación no se cargaría y con toda seguridad te daría un error.
  4. Sólo es necesario hacer la llamada a la función del API en un formulario, el resto de formularios no deberían llamar a esa función, además de que tampoco es necesario, por la sencilla razón de que los temas se aplicarán a todos los formularios de la aplicación.
  5. Los OptionButtons (Options o RadioButtons) que se incluyan dentro de un Frame, se verán negros... por lo tanto no podrá leerse el texto, sin embargo si esos Options están fuera del Frame se verán bien.
    Para solventar este inconveniente, los Options deberían estar contenidos en un PictureBox.
  6. Los botones (CommandButton) contenidos en un Frame se verán con un borde negro... por tanto, al igual que con los OptionButtons, lo recomendable es que estén contenidos dentro de un PictureBox, el cual a su vez estará contenido en el Frame.
  7. Los Frames que estén dentro de otro Frame, tendrán un problema si muestran un texto en el caption: ese texto se verá en un tamaño más grande del que hayamos usado en el diseño, además de que no ocupará todo el frame, sino que seguirá usando el mismo espacio, con lo cual el texto se verá cortado.
    Al igual que en los dos puntos anteriores, la forma de solucionarlo es "metiendo" esos frames dentro de un PictureBox.
  8. Los botones que contengan imágenes, no se mostrarán con el estilo que esté usando Windows XP.
    Da igual que esas imágenes sean iconos o bitmaps.
  9. El fichero .manifest que se use para que Windows XP sepa que tiene que usar los temas en la aplicación no debe contener caracteres acentuados ni eñes... si no tienes esto en cuenta, la aplicación no se cargará, además de que dará error.
  10. La declaración de la función del API es:
    Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
  11. En Visual Basic podemos usar dos librerías de controles comunes de Windows: Windows Common Controls 6.0 basados en mscomctl.ocx y Windows Common Controls 5.0 basados en Comctl32.ocx, pues bien, los basados en mscomctl.ocx no "adoptarán" el look de los temas de XP, para que así sea, habrá que usar los basados en Comctl32.ocx.

 

Aquí tienes un par de capturas para que veas lo que ocurre al usar los Options, Commands y Frames dentro de un Frame:
(y cómo quedaría si esos controles estuviesen contenidos en un picture)


Usando los controles directamente en el Frame

Metiendo los controles en un picture

 

Si te fijas en la imagen de la izquierda, comprobarás que los dos Options están negros y que el Command2 tiene un borde, además de que el texto del Frame2 tiene un tamaño más grande y no se muestra completo.
Por otro lado, en la imagen de la derecha, esos controles se ven bien, gracias a que están contenidos en un control picture, para que veas que no es un "cuento", te muestro ese segundo formulario en tiempo de diseño.


El segundo formulario en tiempo de diseño

 

¿No sabes qué es eso del fichero .manifest?
En el mismo path que el ejecutable debe existir un fichero que tendrá el mismo nombre que el ejecutable, incluyendo la extensión .exe y que acabará con la extensión .manifest.
Por ejemplo, si el ejecutable se llama PruebaXP.exe, el fichero .manifest debe llamarse: PruebaXP.exe.manifest
El contenido de ese fichero .manifest será el siguiente:
(en negrita te resalto los datos que puedes rellenar, pero recuerda, ¡sin usar acentos ni eñes!)


<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    name="TemasXP2.exe"
    processorArchitecture="x86"
    version="1.0.0.1000"
    type="win32"
/>
<description>Descripcion del programa, sin usar acentos, etc. ©Guillermo 'guille' Som, 2002</description> 
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

 

Como detalle, si creas un fichero .manifest para Visual Basic 6.0 (vb6.exe.manifest), y lo copias en el directorio del VB6, podrás ver cómo quedarían los controles en tiempo de diseño, así te resultará más fácil saber cuando debes incluir esos controles problemáticos dentro de un picture.
Las siguientes imágenes está capturadas en tiempo de diseño:


Usando los controles directamente en el Frame
(en tiempo de diseño)

Metiendo los controles en un picture
(en tiempo de diseño)

 

Recuerda que si esas aplicaciones se usan en otro sistema operativo distinto de Windows XP, no les afectará en nada y se verán de la forma clásica, por tanto no está de más que dejes tus ejecutables "preparados" para quién prefiera usar los temas, ya que sólo tendrán que añadir el fichero .manifest al path del ejecutable.

Espero que con todos estos consejillos, no tengas problemas para añadir los temas de Windows XP a tus aplicaciones.

Nos vemos.
Guillermo


Aquí tienes el zip con el código del ejecutable con los dos formularios de ejemplo, así como el .manifest correspondiente, tanto al del ejecutable como al del Visual Basic 6.0: temasXPvb.zip 12.3 KB


ir al índice