Sección de códigos , trucos y ejemplos para visual basic


391 - Cómo tomar la apariencia visual de Windows XP sin un archivo Manifest

<Volver> - Anterior - Siguiente



 

¿Cómo tomar la apariencia visual de Windows XP?

 

Artículo publicado por : Olimpo Bonilla Ramirez

 

El presente articulo presenta la manera de simplificar el proceso de generación de una aplicación hecha en Visual Basic 6.0 que tome la apariencia de los estilos visuales de Windows XP sin consumir recursos de la memoria, ni mucho menos creando los famosos archivos MANIFEST. En algunos otros sitios todavía se maneja este truco pero pocos desconocen este nuevo procedimiento por lo que se recomienda seguir cuidadosamente los pasos que a continuación se van a exponer.

 

Contenido

 


Para empezar...

Para empezar, debemos de tener las siguientes herramientas para iniciar nuestro trabajo:

  1. El componente Microsoft Resource Compiler 4.0. Este componente lo podemos encontrar en el disco de instalación de Visual Basic 6.0 o bien en el disco de Microsoft Visual Studio 6.0. Si no dispone de este recurso, puede descargarlo aquí.
  2. Un compilador de C++. Puede ser Microsoft Visual C++ 6.0 o superior.
  3. Un proyecto nuevo hecho en Visual Basic del tipo EXE Estandar

Una vez teniendo a la mano estos componentes, entonces vamos a empezar con este trabajo

 

Generación de los archivos de recursos

Ya sabemos sobre la estructura de un archivo MANIFEST, que muy comunmente se ha expuesto en otros sitios Web dedicados a Visual Basic, por lo que no vamos a exponer su estructura, ya que por lo general no lo vamos a usar, asi que vamos a crear un archivo de recursos llamado ResXpStylesTester.rc (puede ser cualquier nombre de archivo distinto). Ahora bien, la estructura del archivo de recursos se muestra a continuación:

 

 // Archivo de recursos: ResXpStylesTester.rc
// Autor: Olimpo Bonilla Ramirez 

// Llamado de las librerías de cabecera y definición de macros.
#include "resrc1.h"
#define APSTUDIO_READONLY_SYMBOLS
#include "resource.h"
#include "afxres.h"
#undef APSTUDIO_READONLY_SYMBOLS

// Definición de los recursos en el idioma English (U.S.)
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

// Icono de la aplicación que al momento de compilarse en Visual Basic
// se toma como icono del archivo ejecutable
IDR_MAINFRAME           ICON    DISCARDABLE     "Exe.ico"

// 24 - Contenido del archivo MANIFEST para la apariencia de Windows XP.
1 24 MOVEABLE PURE
BEGIN
    0x2020, 0x3c20, 0x783f, 0x6c6d, 0x7620, 0x7265, 0x6973, 0x6e6f, 0x223d,
    0x2e31, 0x2230, 0x6520, 0x636e, 0x646f, 0x6e69, 0x3d67, 0x5522, 0x4654,
    0x382d, 0x2022, 0x7473, 0x6e61, 0x6164, 0x6f6c, 0x656e, 0x223d, 0x6579,
    0x2273, 0x3e3f, 0x613c, 0x7373, 0x6d65, 0x6c62, 0x2079, 0x6d78, 0x6e6c,
    0x3d73, 0x7522, 0x6e72, 0x733a, 0x6863, 0x6d65, 0x7361, 0x6d2d, 0x6369,
    0x6f72, 0x6f73, 0x7466, 0x632d, 0x6d6f, 0x613a, 0x6d73, 0x762e, 0x2231,
    0x6d20, 0x6e61, 0x6669, 0x7365, 0x5674, 0x7265, 0x6973, 0x6e6f, 0x223d,
    0x2e31, 0x2230, 0x3c3e, 0x7361, 0x6573, 0x626d, 0x796c, 0x6449, 0x6e65,
    0x6974, 0x7974, 0x7620, 0x7265, 0x6973, 0x6e6f, 0x223d, 0x2e31, 0x2e30,
    0x2e30, 0x2230, 0x7020, 0x6f72, 0x6563, 0x7373, 0x726f, 0x7241, 0x6863,
    0x7469, 0x6365, 0x7574, 0x6572, 0x223d, 0x3858, 0x2236, 0x6e20, 0x6d61,
    0x3d65, 0x5422, 0x7365, 0x4474, 0x4c4c, 0x652e, 0x6578, 0x2022, 0x7974,
    0x6570, 0x223d, 0x6977, 0x336e, 0x2232, 0x3e2f, 0x643c, 0x7365, 0x7263,
    0x7069, 0x6974, 0x6e6f, 0x413e, 0x6c70, 0x6369, 0x6361, 0x6f69, 0x206e,
    0x6564, 0x6520, 0x656a, 0x706d, 0x6f6c, 0x2e2e, 0x3c2e, 0x642f, 0x7365,
    0x7263, 0x7069, 0x6974, 0x6e6f, 0x3c3e, 0x6564, 0x6570, 0x646e, 0x6e65,
    0x7963, 0x3c3e, 0x6564, 0x6570, 0x646e, 0x6e65, 0x4174, 0x7373, 0x6d65,
    0x6c62, 0x3e79, 0x613c, 0x7373, 0x6d65, 0x6c62, 0x4979, 0x6564, 0x746e,
    0x7469, 0x2079, 0x7974, 0x6570, 0x223d, 0x6977, 0x336e, 0x2232, 0x6e20,
    0x6d61, 0x3d65, 0x4d22, 0x6369, 0x6f72, 0x6f73, 0x7466, 0x572e, 0x6e69,
    0x6f64, 0x7377, 0x432e, 0x6d6f, 0x6f6d, 0x2d6e, 0x6f43, 0x746e, 0x6f72,
    0x736c, 0x2022, 0x6576, 0x7372, 0x6f69, 0x3d6e, 0x3622, 0x302e, 0x302e,
    0x302e, 0x2022, 0x7270, 0x636f, 0x7365, 0x6f73, 0x4172, 0x6372, 0x6968,
    0x6574, 0x7463, 0x7275, 0x3d65, 0x5822, 0x3638, 0x2022, 0x7570, 0x6c62,
    0x6369, 0x654b, 0x5479, 0x6b6f, 0x6e65, 0x223d, 0x3536, 0x3539, 0x3662,
    0x3134, 0x3434, 0x6363, 0x3166, 0x6664, 0x2022, 0x616c, 0x676e, 0x6175,
    0x6567, 0x223d, 0x222a, 0x3e2f, 0x2f3c, 0x6564, 0x6570, 0x646e, 0x6e65,
    0x4174, 0x7373, 0x6d65, 0x6c62, 0x3e79, 0x2f3c, 0x6564, 0x6570, 0x646e,
    0x6e65, 0x7963, 0x3c3e, 0x612f, 0x7373, 0x6d65, 0x6c62, 0x3e79
END

#endif
// Fin de los recursos del idioma English (U.S.)

// Llamada de macros de seguridad
#ifndef APSTUDIO_INVOKED
#endif

STRINGTABLE DISCARDABLE
BEGIN
  // A partir de aqui se pueden escribir cadenas de recursos...
  1   "Mensaje de recurso"
End

// Fin de la libreria de recursos...

 

A continuación vamos a crear otro archivo de recursos. Nos referemos a dos librerias de cabecera de C++. La librería resource.h debe contener las siguientes lineas de código:

 

// Archivo de cabecera: resource.h
// Archivo de cabecera generado por Microsoft Developer Studio
// Usado por el archivo de recursos ResXpStylesTester.rc
// Autor: Olimpo Bonilla Ramirez 

// Valores predeterminados para las macros
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

// Fin de la libreria de recursos...
 

 

Por último vamos a crear otra librería de cabecera llamada resrc1.h . La estructura de esta librería debe contener las siguientes lineas de código:

 

// Archivo de cabecera: resrc1.h
// Archivo de cabecera generado por Microsoft Developer Studio
// Usado por el archivo de recursos ResXpStylesTester.rc
// Autor: Olimpo Bonilla Ramirez 

// Valores predeterminados para las macros
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC                     1
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1000
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

// Fin de la libreria de recursos...
 

 

A continuación vamos a crear un archivo de proceso de lotes llamado AppRegistro.bat . La estructura de este archivo es la siguiente:

 

@Echo off
if exist ResXpStylesTester.res Del ResXpStylesTester.res
Rc.exe ResXpStylesTester.rc 

 

Finalmente solo falta de disponer el compilador de recursos de Microsoft. Los archivos que conforman este compilador son RC.EXE y RCDLL.DLL . Estos archivos deben de estar en la misma carpeta en donde hemos creado los archivos de cabecera y el archivo de recursos. En fin es todo lo que necesitamos. Si se va a incluir un icono para el archivo ejecutable, entonces es necesario que el archivo de icono deba estar en la misma ubicación en donde se encuentren los demas archivos antes mencionados, ya que sin el archivo, RC.EXE mandaría un mensaje de error de compilación. Entonces nuestra carpeta donde se encuentran los archivos es la siguiente:

 

 

Lo último que nos queda es simplemente ejecutar AppRegistro.bat. Hacemos clic sobre el archivo antes mencionado y si no hay errores de compilación se genera el archivo RESXPSTYLESTESTER.RES. En este momento, ya tenemos lo necesario para crear una aplicación en Visual Basic 6.0 que tome la apariencia visual de Windows XP.

 

Creación de la aplicación en Visual Basic

Una vez ya definido nuestro, abramos entonces Visual Basic 6.0 y creamos un proyecto EXE Estandar. Por lo general vamos a crear una aplicación de prueba con algunos controles. Es necesario que en nuestro proyecto incluyamos el archivo RESXPSTYLESTESTER.RES. La estructura de nuestro proyecto de ejemplo seria la siguiente:

 

 

A continuación expongo el código fuente del módulo ModPrincipal.bas:

 

' Modulo: ModPrincipal.bas
' Modulo principal de la aplicación en general
' Fecha: ???????
Option Explicit
Global i&, j&, k&
Global Msg$, MsgErr$, NumErr&
Global Cont%, Opc%

' Función principal de la aplicación
Public Sub Main()

  If (App.PrevInstance) Then
    MsgBox LoadResString(19), vbCritical, LoadResString(1)
    End
  End If

  Call InitCommonControlsVB
  frmMain.Show

  Exit Sub

Falla:
  MsgBox LastError$, vbCritical, LoadResString(1)
  End
End Sub

Public Function LastError$()
  LastError$ = "Se ha generado el Código de Error No. " & NumErr& & vbCrLf & vbCrLf & _
               "Motivo: " & MsgErr$
End Function

' Fin de ModPrincipal.bas

 

Luego expongo el código fuente del módulo ModWinXP.bas:

 

' Modulo: ModWinXP.bas
' Modulo que controla la apariencia grafica de Windows XP, en caso de
' que la aplicación sea instalada en Windows XP o superior
' Fecha: ???????
Option Explicit

' Declaración del tipo de dato para el manejo de la apariencia de Windows XP
Private Type tagInitCommonControlsEx
  lngSize As Long
  lngICC As Long
End Type

' Declaración de las API's de Windows para el manejo y control de la apariencia de Windows XP
Public Declare Function InitCommonControlsEx Lib "comctl32.dll" _
   (iccex As tagInitCommonControlsEx) As Boolean
Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" ( _
    ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32" ( _
   ByVal hLibModule As Long) As Long
Public Declare Function SetErrorMode Lib "kernel32" ( _
   ByVal wMode As Long) As Long
Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
  ByVal wParam As Long, lParam As Any) As Long

' Variables globales
Global Const ICC_USEREX_CLASSES = &H200
Global Const SEM_NOGPFAULTERRORBOX = &H2&
Global m_bInIDE As Boolean

' Funciones principales...
Public Sub UnloadApp()
  If Not InIDE() Then SetErrorMode SEM_NOGPFAULTERRORBOX
End Sub

Public Function InIDE() As Boolean
  Debug.Assert (IsInIDE())
  InIDE = m_bInIDE
End Function

Private Function IsInIDE() As Boolean
  m_bInIDE = True
  IsInIDE = m_bInIDE
End Function

Public Function InitCommonControlsVB() As Boolean
  On Error Resume Next
  Dim iccex As tagInitCommonControlsEx
  With iccex
    .lngSize = LenB(iccex)
    .lngICC = ICC_USEREX_CLASSES
  End With

  InitCommonControlsEx iccex
  InitCommonControlsVB = (Err.Number = 0)
  On Error GoTo 0
End Function

' Fin de ModWinXP.bas

 

A continuación escribimos solamente el codigo fuente del formulario de inicio frmMain.frm:

 


' Formulario: frmMain.bas
' Formulario de inicio de aplicación
' Fecha: ???????
Option Explicit

' Declaración de las API's de Windows para el manejo y control de la apariencia de Windows XP
Private Declare Function LoadLibrary Lib "kernel32" Alias _
  "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" ( _
  ByVal hLibModule As Long) As Long
Private Declare Function SetErrorMode Lib "kernel32" ( _
  ByVal wMode As Long) As Long
Private Declare Function GetUserName Lib "advapi32.dll" _
  Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Private Const SEM_FAILCRITICALERRORS = &H1
Private Const SEM_NOGPFAULTERRORBOX = &H2
Private Const SEM_NOOPENFILEERRORBOX = &H8000&
Private m_hMod As Long

Private Sub Form_Load()
  ' Inicializamos la aplicacion del estilo visual a la ventana actual
  InitCommonControlsVB
  m_hMod = LoadLibrary("shell32.dll")
End Sub

Private Sub Form_Unload(Cancel As Integer)
  If (MsgBox("¿Desea salir de esta aplicación?", vbQuestion + vbYesNo + vbDefaultButton1, _
    "Aviso") = vbYes) Then
    Cancel = 0: FreeLibrary m_hMod: UnloadApp: End
  Else
    Cancel = 1: Exit Sub
  End If
End Sub

Private Sub Opc1_Click()
  frmSub.Show 1
End Sub

Private Sub OpcSalir_Click()
  Unload Me
End Sub

' Fin de frmMain.frm

 

Y por último el formulario frmSub.frm. En este formulario incluimos algunos controles de Windows por ejemplo algunos botones de comando, y los controles de Microsoft Windows Common Controls 5.0 y 6.0

 

' Formulario: frmSub.bas
' Formulario secundario de la aplicación de prueba.
' NOTA. Contiene una barra de progreso, un control Timer y un Datapicker.
' Fecha: ???????
Option Explicit
Private T&, U&

Private Sub Form_Load()
  Tmr2.Enabled = False

End Sub

Private Sub Tmr1_Timer()
  T& = T& + 1
  If (Tmr2.Enabled = False) Then Tmr2.Enabled = True
End Sub

Private Sub Tmr2_Timer()

  If (U& > 10) Then
    Tmr2.Enabled = False
    U& = 0
    PrgBar.Value = 0
    Exit Sub
  Else
    PrgBar.Value = U&
    U& = U& + 1
  End If
End Sub

' Fin de frmSub.frm

 

Ya tenemos todo lo que necesitamos. Solo falta compilar el proyecto para generar el archivo ejecutable y listo. Si todo ha funcionado correctamente, entonces tendremos algo parecido como esto:

 

 

Notas importantes...

Debemos de tomar en cuenta las siguientes observaciones:

  1. El control Datapicker no soporta la apariencia de Windows XP. Desafortunadamente este control no soporta la apariencia de Windows XP o superior.
  2. El control ActiveX de ActiveSkin 4.0 hace que las ventanas que usen skins de ese componente alenten la aplicacion. Desafortunadamente este control a veces alenta el rendimiento de nuestra aplicación (y en general del sistema) por lo cual no lo recomiendo usarlo, a menos de que el equipo cuente con mas de 256 MB de memoria RAM.
  3. El control ActiveX de OsenKunadi 2003 y superior tambien causan colapsos con la aplicación. Este control que es bueno para la apariencia de Windows XP tiene buenos controles que no causan ningun problema con el rendimiento de la aplicación. Si se dispone de este componente, recomiendo solamente utilizar los componentes ListBox, CommandButton, DataPicker y la Barra de estado con apariencia estandar. No utilizar mucho los componentes de este grupo de componentes ActiveX ya que tambien causaria volcados de memoria al sistema. Usar solamente los mencionados preferentemente.
  4. Los controles ActiveX de vbAccelerator tambien causan colapsos con la aplicación. Los controles que tienen en el sitio web de vbAccelerator son novedosos, sin embargo, en el momento de estarlos probando con la apariencia de Windows XP, han tenido fallos ultimamente debido a que consumen recursos considerables del sistema operativo, por lo que recomiendo tampoco no utilizarlos hasta que el autor de dichos componentes informe que sus componentes funcionen correctamente sin estos inconvenientes. Posiblemente este servidor se hara cargo de rediseñarlos para evitar estos problemas con la aplicación de prueba.

 

Espero que sirva este truco de antemano.

 

Olimpo Bonilla Ramirez
Lic. Matematicas Aplicadas y Computaciín Universidad Nacional Autonoma de México
Ciudad de México, México.
Comentarios y sugerencias al correo electronico: o_bonilla1980[arroba]hotmail.com

 

 

Descargar proyecto de ejemplo

 

Contenido del Zip :

Dos archivos ZIP: uno que contiene el Microsoft Compiler Code 4.0 y otro en donde se tiene el codigo fuente de ejemplo

También se incluye un archivo Html con el mismo contenido de esta página.

 

Descargar

 



Buscar en Recursos vb