[C con Clase] Como tener el password char al estilo de XP

Steven Davidson steven en conclase.net
Lun Mayo 28 07:01:36 CEST 2007


Hola Kenji,

El pasado 2007-05-24 02:15:22, Kenji escribió:

K> Buenas amigos de C con Clase, he querido hacer un control EditBox que sirva
K> para introducir contraseñas, para lo cual quiero que el caracter que salga
K> sea el circulo negro, el default en xp (0x25CF), sin embargo hacer esto en
K> C++Builder no esta muy facil.
K> He averiguado que se puede usar esta función:
K>   SendMessageW(Edit2->Handle, EM_SETPASSWORDCHAR, 0x25cf, 0);
K> Sin embargo, esto requiere que el texto (u otra cosa que no se) este en
K> Unicode, y no en Ansi (algo así leí)
K> Agradesco de antemano la ayuda que me puedan dar. Gracias

Si el problema está en que el cuadro de edición no se asemeja a lo esperado bajo MS-Windows XP, entonces te presento la solución.

Como dice la documentación, necesitas usar el control implementado en la versión 6 de "comctl32.dll" en lugar de la implementación en "user32.dll", la cual presenta el comportamiento estándar de un control de edición. Para esto, deberás cargar esta DLL a través de la función 'InitCommonControlsEx()'. Por ejemplo,

#include <commctrl.h>

int WINAPI WinMain( ... )
{
  INITCOMMONCONTROLSEX icc = { sizeof(INITCOMMONCONTROLSEX), ICC_WIN95_CLASSES };
  if( !InitCommonControlsEx(&icc) )  return -1;  // Problema al carga la DLL
  ...
}

Recuerda que debes enlazar con la biblioteca "comctl32.lib".


Además, debes incluir un recurso especial de tipo 24 que se trata de un manifiesto ("manifest", en inglés). El contenido de tal recurso, debe ser algo parecido a lo siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly 
   xmlns="urn:schemas-microsoft-com:asm.v1" 
   manifestVersion="1.0">
 <assemblyIdentity 
    processorArchitecture="x86" 
    version="5.1.0.0"
    type="win32"
    name="MiAplicacion.exe"/>
 <description>Mi Aplicación</description>
 <dependency>
  <dependentAssembly>
    <assemblyIdentity
         type="win32"
         name="Microsoft.Windows.Common-Controls"
         version="6.0.0.0"
         publicKeyToken="6595b64144ccf1df"
         language="*"
         processorArchitecture="x86"/>
  </dependentAssembly>
 </dependency>
</assembly>

Puedes cambiar los nombres del ejecutable "MiAplicacion.exe" y la descripción: Mi Aplicación. Estas propiedades no afectan al resultado ni comportamiento de tu aplicación.

Cambia el número de identificación de este recurso a 1.

No estoy seguro si Builder tiene algo parecido a esto. Si lo anterior no te funciona, entonces puedes crear un fichero de texto aparte con el mismo nombre completo de tu fichero ejecutable pero agregando ".manifest". Por ejemplo, en la misma carpeta tenemos dos ficheros,

+ miprog.exe
+ miprog.exe.manifest

Bajo este nuevo fichero, agrega el código XML que presenté previamente. MS-Windows XP usará este fichero, mientras que cualesquier otras versiones de MS-Windows lo ignorarán.


Si lo anterior tampoco funciona, entonces te toca establecer el estilo visual explícitamente usando el API UxTheme; necesitarás incluir el fichero <uxtheme.h> y la biblioteca "uxtheme.dll". Para más información acerca de todo esto, puedes consultar la página de MSDN yendo directamente a: http://msdn2.microsoft.com/en-us/library/ms997646.aspx


Espero haber aclarado el asunto.

Steven


Más información sobre la lista de distribución Cconclase