FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour IsAppThemed()
Posts: 14
Joined: Fri Oct 21, 2005 10:05 AM
IsAppThemed()
Posted: Wed Sep 15, 2010 09:52 AM

Hola Antonio,

Estoy probando FWH 10.08 y observo que IsAppThemed() sigue devolviendo .T. a煤n sin temas activos.

驴 Recuerdas nuestra 煤ltima conversaci贸n ?

驴 C贸mo quedar谩 finalmente ?

Gracias y saludos
Juan

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: IsAppThemed()
Posted: Wed Sep 15, 2010 10:13 AM
Juan,

Este es el c贸digo fuente de la funci贸n IsAppThemed() de FWH. Si encontramos la manera de mejorarla, bienvenida sea :-)
Code (fw): Select all Collapse
BOOL _IsAppThemed( void )
{
聽 聽static BOOL bInit = FALSE;
聽 聽static BOOL bIsThemed = FALSE;

聽 聽InitThemes();

聽 聽if( pIsAppThemed && ! bInit )
聽 聽{
聽 聽聽 聽WIN32_FIND_DATA fd;
聽 聽聽
聽 聽 聽 bInit = TRUE;
聽 聽 聽 bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 MAKEINTRESOURCE( 24 ) ) ) ||
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( ( BOOL ) FindResource( GetInstance(), MAKEINTRESOURCE( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() );
聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 if( ! bIsThemed )
聽 聽 聽 {
聽 聽 聽 聽 聽char AppName[ 256 ];
聽 聽 聽 聽 聽HANDLE hFind;
聽 聽 聽 聽 
聽 聽 聽 聽 聽GetModuleFileName( NULL, AppName, 255 );
聽 聽 聽 聽 聽lstrcat( AppName, ".Manifest" );
聽 聽 聽 聽 聽
聽 聽 聽 聽 聽if( ( hFind = FindFirstFile( AppName, &fd ) ) != INVALID_HANDLE_VALUE )
聽 聽 聽 聽 聽{
聽 聽 聽 聽 聽 聽 bIsThemed = TRUE;
聽 聽 聽 聽 聽 聽 FindClose( hFind );
聽 聽 聽 聽 聽}
聽 聽 聽 } 聽 聽 聽
聽 聽}

聽 聽if( pIsAppThemed != NULL )
聽 聽 聽 return bIsThemed;
聽 聽else
聽 聽 聽 return FALSE;
}

la funci贸n InitThemes() se encarga de cargar la DLL y de inicializar el valor de pIsAppThemed, que es un puntero a funci贸n.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: IsAppThemed()
Posted: Wed Sep 15, 2010 10:16 AM
Code (fw): Select all Collapse
typedef BOOL ( __stdcall * PFNISAPPTHEMED ) ( void );

static PFNISAPPTHEMED pIsAppThemed = NULL;
static HMODULE hDLL = NULL;

static void InitThemes( void )
{
聽 聽static BOOL bInit = FALSE;

聽 聽if( bInit )
聽 聽 聽 return;
聽 聽else
聽 聽 聽 bInit = TRUE;

聽 聽if( hDLL == NULL )
聽 聽{
聽 聽 聽 if( hDLL = LoadLibrary( "UXTHEME.DLL" ) )
聽 聽 聽 {
聽 聽 聽 聽 聽pIsAppThemed = ( PFNISAPPTHEMED ) GetProcAddress( hDLL, "IsAppThemed" );
聽 聽 聽 }
聽 聽}
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: IsAppThemed()
Posted: Sat Sep 25, 2010 07:45 AM

Juan,

Has modificado la funci贸n ?

Le has encontrado alg煤n fallo ?

gracias,

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: IsAppThemed()
Posted: Tue Oct 19, 2010 04:58 AM
Antonio, una consulta, viendo el codigo puesto por ti,

static PFNISAPPTHEMED pIsAppThemed = NULL;

lo defines como una variable estatica, pero luego mas adelante lo usas como una funcion, es correcto, esto? o es una funcion realmente y no puedes postear el codigo?

bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
( ( BOOL ) FindResource( GetInstance(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() ) /*funcion o var?*/



otra cosa, pudieras postear el codigo de estas funciones para "poder compilar y hacer pruebas", please, no sueltas como lo has hecho.
se que son func restringidas, pero talvez ayude alguien a encontrar la solucion.
por ejemplo si es posible un archivo theme_test.c conteniendo lo necesario para compilar y probar.

salu2
carlos vargas

Code (fw): Select all Collapse
BOOL _IsAppThemed( void )
{
   static BOOL bInit = FALSE;
   static BOOL bIsThemed = FALSE;

   InitThemes();

   if( pIsAppThemed && ! bInit )
   {
      WIN32_FIND_DATA fd;
    
      bInit     = TRUE;
      bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
                    ( ( BOOL ) FindResource( GetInstance(),  MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() )         /*ACA pIsAppThemed es funcion o var, creo que deberia ser una var*/

    ....



salu2
carlos vargas
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: IsAppThemed()
Posted: Tue Oct 19, 2010 07:04 AM

Carlos,

Esa variable contendr谩 un puntero cargado desde uxtheme.dll al que se puede llamar como si fuese una funci贸n :-)

En 茅l c贸digo que he publicado esta todo. Solo tienes que compilarlo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: IsAppThemed()
Posted: Wed Oct 27, 2010 03:30 PM
Estimados

he colocado esta funcion en mi sistema

Code (fw): Select all Collapse
function IsAppThemed()
return( .f. )


puede producir algun problema posterior

lo comento porque con esta funcion elimino el problema de presionar la tecla ALT y desaparezcan la informacion en pantalla
aunque tenga en el recurso MANIFIEST

Code (fw): Select all Collapse
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
聽 聽 type="win32"
聽 聽 name="MyOrganization.MyDivision.MyApp"
聽 聽 version="1.0.0.0"
聽 聽 processorArchitecture="X86"
聽 聽 />
聽 聽 <description>Verbal description of MyApp.</description>
聽 聽 <dependency>
聽 聽 <dependentAssembly>
聽 聽 <assemblyIdentity
聽 聽 聽 聽 type="win32"
聽 聽 聽 聽 name="Microsoft.Windows.Common-Controls"
聽 聽 聽 聽 version="6.0.0.0"
聽 聽 聽 聽 processorArchitecture="X86"
聽 聽 聽 聽 publicKeyToken="6595b64144ccf1df"
聽 聽 聽 聽 language="*"
聽 聽 />
聽 聽 </dependentAssembly>
聽 聽 </dependency>
</assembly>
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: IsAppThemed()
Posted: Mon Nov 08, 2010 09:21 PM
Pues he probado con winxp/win7 y las respuestas de la funciones isappthemed y istheme active son correctas con thema y sin thema,
con el manifest en el exe incrustado o como archivo externo, por lo que no hallo falla. :-)
aunque aprendi algunas consillas en c como los punteros a funciones. :-)
aca dejo los ficheros de prueba por si algien les mete mano.

theme.prg
Code (fw): Select all Collapse
#include "fivewin.ch"

procedure main()
聽 聽
聽 聽?"Hola Mundo"
聽 聽?"IsAppThemed:",IsAppThemed()   //original de fwh
聽 聽?"IsActive:",IsThemeActive()         //original de fwh
聽 聽
聽 聽?"IsAppThemed:",IsAppThemed2()  //las aca incluidas
聽 聽?"IsActive:",IsThemeActive2()        //las aca incluidas

聽 聽CloseTheme()
聽 聽
return

#pragma BEGINDUMP


/*----------------------------------------------------------------------------*/

#include "hbapi.h"
#include "windows.h"
#include "uxtheme.h"

/*----------------------------------------------------------------------------*/

typedef BOOL ( __stdcall * PFNISAPPTHEMED ) ( void );
typedef BOOL ( __stdcall * PFNISTHEMEACTIVE ) ( void );

static HMODULE 聽 聽 聽 聽hDLL 聽 聽 聽 聽 = NULL;
static PFNISAPPTHEMED pIsAppThemed = NULL;

static void InitThemes( void );
BOOL _IsAppThemed( void );
BOOL _IsThemeActive( void );
BOOL _CloseTheme(void);

/*----------------------------------------------------------------------------*/

HB_FUNC( ISAPPTHEMED2 )
{
聽 聽hb_retl( _IsAppThemed() );
}

HB_FUNC( ISTHEMEACTIVE2 )
{
聽 聽hb_retl( _IsThemeActive() );
}

HB_FUNC( CLOSETHEME )
{
聽 聽hb_retl( _CloseTheme() );
}

/*----------------------------------------------------------------------------*/

static void InitThemes( void )
{
聽 聽/*inicializa variable estatica*/
聽 聽static BOOL bInit = FALSE;

聽 聽/*valida con variable estatica que la funcion se ejecute solo una vez*/
聽 聽if( bInit )
聽 聽{
聽 聽 聽 return;
聽 聽}
聽 聽else
聽 聽{
聽 聽 聽 bInit = TRUE;
聽 聽}


聽 聽if( hDLL == NULL )
聽 聽{

聽 聽 聽 /*carga dll que manipula los temas*/
聽 聽 聽 if( hDLL = LoadLibrary( "UXTHEME.DLL" ) )
聽 聽 聽 {

聽 聽 聽 聽 聽/*obtiene puntero a funcion IsAppThemed contenida en la dll cargada previamente*/
聽 聽 聽 聽 聽pIsAppThemed = ( PFNISAPPTHEMED ) GetProcAddress( hDLL, "IsAppThemed" );

聽 聽 聽 }

聽 聽}

}

/*----------------------------------------------------------------------------*/

BOOL _IsAppThemed( void )
{
聽 聽/*inicializa variables estaticas*/
聽 聽static BOOL bInit 聽 聽 = FALSE;
聽 聽static BOOL bIsThemed = FALSE;

聽 聽/*obtiene puntero de la funcion IsAppThemed*/
聽 聽InitThemes();

聽 聽if( pIsAppThemed && ! bInit )
聽 聽{

聽 聽 聽 WIN32_FIND_DATA fd;

聽 聽 聽 bInit 聽 聽 = TRUE;
聽 聽 聽 bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( 聽 ( BOOL ) FindResource( GetInstance(), 聽MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() );

聽 聽 聽 if( ! bIsThemed )
聽 聽 聽 {
聽 聽 聽 聽 聽char AppName[ 256 ];
聽 聽 聽 聽 聽HANDLE hFind;

聽 聽 聽 聽 聽GetModuleFileName( NULL, AppName, 255 );
聽 聽 聽 聽 聽lstrcat( AppName, ".Manifest" );

聽 聽 聽 聽 聽if( ( hFind = FindFirstFile( AppName, &fd ) ) != INVALID_HANDLE_VALUE )
聽 聽 聽 聽 聽{
聽 聽 聽 聽 聽 聽 bIsThemed = TRUE;
聽 聽 聽 聽 聽 聽 FindClose( hFind );
聽 聽 聽 聽 聽}

聽 聽 聽 }

聽 聽}

聽 聽if( pIsAppThemed != NULL )
聽 聽{
聽 聽 聽 return bIsThemed;
聽 聽}
聽 聽else
聽 聽{
聽 聽 聽 return FALSE;
聽 聽}

}

/*----------------------------------------------------------------------------*/

BOOL _IsThemeActive( void )
{
聽 聽PFNISTHEMEACTIVE pIsThemeActive = NULL; 聽 

聽 聽if( hDLL != 0 )
聽 聽{
聽 聽 聽 /*puntero a funcion IsThemeActive*/
聽 聽 聽 pIsThemeActive = ( PFNISTHEMEACTIVE ) GetProcAddress( hDLL, "IsThemeActive" );
聽 聽
聽 聽 聽 /*ejecuta funcion*/
聽 聽 聽 if( pIsThemeActive() )
聽 聽 聽 {
聽 聽 聽 聽 聽return TRUE;
聽 聽 聽 }
聽 聽
聽 聽}
聽 聽return FALSE;

}

/*----------------------------------------------------------------------------*/

BOOL _CloseTheme( void )
{
聽 聽BOOL bClose = FALSE;

聽 聽if( hDLL != 0 )
聽 聽{
聽 聽 聽 bClose = FreeLibrary( hDLL ); 聽 
聽 聽}

聽 聽return bClose;
}

#pragma ENDDUMP


/* codigo tomado de internet como ejemplo.
bool bReturn = false;
HMODULE hDll = ::LoadLibrary(_T("UxTheme.dll"));
if( hDll )
{
typedef BOOL(*THEMEACTIVE)(VOID);

THEMEACTIVE pIsThemeActive = (THEMEACTIVE)GetProcAddress(hDll, "IsThemeActive");
if( pIsThemeActive )
bReturn = pIsThemeActive();
::FreeLibrary( hDll );
}
return bReturn; 

*/


theme.rc
Code (fw): Select all Collapse
// Generated by ResEdit 1.5.4
// Copyright (C) 2006-2010
// <!-- m --><a class="postlink" href="http://www.resedit.net">http://www.resedit.net</a><!-- m -->

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Manifest resources
//
1 聽 聽 聽 聽 聽 聽 聽 聽 聽RT_MANIFEST 聽 聽".\\manifest.xml"


y el archivo manifest.xml
Code (fw): Select all Collapse
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
聽 <dependency>
聽 聽 <dependentAssembly>
聽 聽 聽 <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
聽 聽 </dependentAssembly>
聽 </dependency>
聽 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
聽 聽 <security>
聽 聽 聽 <requestedPrivileges>
聽 聽 聽 聽 <requestedExecutionLevel
聽 聽 聽 聽 聽 level="asInvoker"
聽 聽 聽 聽 聽 uiAccess="false"/>
聽 聽 聽 </requestedPrivileges>
聽 聽 </security>
聽 </trustInfo>
</assembly>
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion