Resource file to accept Animated Cursor

Other General Resources like icon sets, sound files etc.,

Moderator: Rathinagiri

Carlos Britos
Posts: 245
Joined: Sat Aug 02, 2008 5:03 pm

Re: Resource file to acept Animated Cursor

Post by Carlos Britos »

Pablo César wrote:Gracias, por tu interés, cualquier información es bien venida. :)
Hola
Estuve haciendo unas pruebas y lo que saqué en limpio es que:
La compilacion del Ani en el rc y la carga del mismo en el exe son correctas.

En el RC

Code: Select all

12345     21       "..\\res\\sample.ani"
12345 = es el id del recurso
21 = es el tipo de recurso

En el exe para con esta funcion se obtiene el handle del Ani correctamente. :)

Code: Select all

HB_FUNC( IMAGEANIMATE )
{
   HWND h = (HWND) hb_parnl(1);
   HRSRC   hResourceData;

   HGLOBAL hGlobalAlloc, hGlobalResource;
   LPVOID  lpGlobalAlloc, lpGlobalResource;
   DWORD   nFileSize;

   hResourceData = FindResource( NULL, (LPCWSTR) hb_parni(2), (LPCWSTR) 21 );
   hGlobalResource = (HGLOBAL) LoadResource( GetModuleHandle(0), hResourceData );
   lpGlobalResource = LockResource( hGlobalResource );
   nFileSize = SizeofResource( NULL, (HRSRC) hResourceData );
   hGlobalAlloc = GlobalAlloc( GHND, nFileSize );
   if( hGlobalAlloc == NULL )
   {
      FreeResource( hGlobalResource );
      return ;
   }

   lpGlobalAlloc = GlobalLock( hGlobalAlloc );
   memcpy( lpGlobalAlloc, lpGlobalResource, nFileSize );
   GlobalUnlock( hGlobalAlloc );

   FreeResource( hGlobalResource );

   SendMessage( h, (UINT) STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hGlobalAlloc );
   hb_retnl( (LONG) hGlobalAlloc ) ;
}
El problema lo tengo con:

Code: Select all

SendMessage( h, (UINT) STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hGlobalAlloc );
Una vez obtenido el handle no puedo asignarlo al contenedor :cry:
Hay que jugar con los style ( SS_ICON, SS_BITMAP, ...) del control y de sendMessage() (IMAGE_ICON, IMAGE_BITMAP, ... ) . Esa parte te la dejo a ti. :D


( mi_conocimiento_de_C == NULL ) ;
Regards/Saludos, Carlos (bcd12a)
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Resource file to acept Animated Cursor

Post by Pablo César »

Daniel, muchas gracias por las indicaciones de enlaces, bastante material. Pude leerlo con atencion, casi todo, pero sigo sin encontrar una solución.

Carlos Britos wrote:lo que saqué en limpio es que:
La compilacion del Ani en el rc y la carga del mismo en el exe son correctas

En el RC

Code: Select all

12345     21       "..\\res\\sample.ani"
12345 = es el id del recurso
21 = es el tipo de recurso
Hé leído sobre esa denominacion del resource_type en algun lugar (creo que en Delphi), pero a mi no me há dado cierto. Con tantas tentativas que hice pude ver que el windres.exe acepta otra denominaciones de resource_type pero no las genera en el objeto para ser asamblado. Ya el Borland Resource Compiler (que la Minigui Extended utiliza), puede utilizar "HMGPICTURE" y que es tratado diferencialmente en la hora de cargarlo en ejecucion sea para uso display como para imprimir desde el RC. Pero ambos verifican el formato del archivo y creo que justamente está allí nuestro problema. Porque no es BITMAP ni ICON y en ambos compiladores de recursos (windres y brc32) deberian aceptarlo como CURSOR (según instrucciones de MSDN) y en cambio dan como error al evaluarlo como archivo de imagen, por lo que condena la generacion del objeto de resource a ser anexado al ejecutable.

Otra cosa que me gustaria aclarar, que por experiencia de usuário en otro forum, relató que ID del resource deberia evitar caracter numérico en el primer caracter para la IDE del source y creo que tambien sirve para el nombre del archivo jpg (por ejemplo). Porque no funciona, al menos eso en Minigui Extended (ver relato).
Carlos Britos wrote:En el exe para con esta funcion se obtiene el handle del Ani correctamente. :)

Code: Select all

HB_FUNC( IMAGEANIMATE )
{
   HWND h = (HWND) hb_parnl(1);
   HRSRC   hResourceData;

   HGLOBAL hGlobalAlloc, hGlobalResource;
   LPVOID  lpGlobalAlloc, lpGlobalResource;
   DWORD   nFileSize;

   hResourceData = FindResource( NULL, (LPCWSTR) hb_parni(2), (LPCWSTR) 21 );
   hGlobalResource = (HGLOBAL) LoadResource( GetModuleHandle(0), hResourceData );
   lpGlobalResource = LockResource( hGlobalResource );
   nFileSize = SizeofResource( NULL, (HRSRC) hResourceData );
   hGlobalAlloc = GlobalAlloc( GHND, nFileSize );
   if( hGlobalAlloc == NULL )
   {
      FreeResource( hGlobalResource );
      return ;
   }

   lpGlobalAlloc = GlobalLock( hGlobalAlloc );
   memcpy( lpGlobalAlloc, lpGlobalResource, nFileSize );
   GlobalUnlock( hGlobalAlloc );

   FreeResource( hGlobalResource );

   SendMessage( h, (UINT) STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hGlobalAlloc );
   hb_retnl( (LONG) hGlobalAlloc ) ;
}
Este código es similar a la que Claudio Soto disponibilizó en las funciones en C de Bostaurus y que tambien está en duplicidad en C:\hmg.3.1.5\hfcl\Source\HMG_HPDF.Prg (lo que me parece erroneo), habiendo disponibilidad en la lib Bostaurus. Pena que Claudio, no disponibilizó algun ejemplo en HMG utilizando esa misma funcion _bt_LoadFileFromResources. Asi que no tenemos comparativo para saber si funciona. Aunque este seria otro tema paralelo al este tópico, claro que tambien es importante atribuir un valor al contenedor (componente). Pero no tengo seguridad que pueda cargar un archivo .ANI, porque por lo que hé visto de Bostaurs.ch, trata de los siguientes archivos de imagenes: BMP, JPG, GIF, TIF y PNG (no menciona .ANI).

Mis conclusiones actuales son: Impedimiento al reconocer un nuevo formato del archivo ".ANI" tanto para ambos compiladores de recursos (windres y brc32) que son utilizados en HMG y MiniguiExtended respectivamente. Si pudieramos hechar manos de los códigos fuentes de tales compiladores de recursos, podríamos intentar hacer algo.
Sobre cargar archivo con otros formatos desde el RC para ser exibidos en pantalla o para impresion, está para ser mejorado...
Carlos Britos wrote:( mi_conocimiento_de_C == NULL ) ;
jaja Yo tambien ! jaja quien sabe Claudio Soto disponga un tiempito para leer todo esto... y pueda darnos una luz.
Last edited by Pablo César on Mon Jan 09, 2017 10:08 am, edited 1 time in total.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
Carlos Britos
Posts: 245
Joined: Sat Aug 02, 2008 5:03 pm

Re: Resource file to acept Animated Cursor

Post by Carlos Britos »

Pablo César wrote:

Code: Select all

12345     21       "..\\res\\sample.ani"
Hé leído sobre esa denominacion del resource_type en algun lugar (creo que en Delphi), pero a mi no me há dado cierto. Con tantas tentativas que hice pude ver que el windres.exe acepta otra denominaciones de resource_type pero no las genera en el objeto para ser asamblado. Ya el Borland Resource Compiler (que la Minigui Extended utiliza), puede utilizar "HMGPICTURE" y que es tratado diferencialmente en la hora de cargarlo en ejecucion sea para uso display como para imprimir desde el RC. Pero ambos verifican el formato del archivo y creo que justamente está allí nuestro problema. Porque no es BITMAP ni ICON y en ambos compiladores de recursos (windres y brc32) deberian aceptarlo como CURSOR (según instrucciones de MSDN) y en cambio dan como error al evaluarlo como archivo de imagen, por lo que condena la generacion del objeto de resource a ser anexado al ejecutable.
Este código es similar a la que Claudio Soto disponibilizó en las funciones en C de Bostaurus y que tambien está en duplicidad en C:\hmg.3.1.5\hfcl\Source\HMG_HPDF.Prg (lo que me parece erroneo), habiendo disponibilidad en la lib Bostaurus. Pena que Claudio, no disponibilizó algun ejemplo en HMG utilizando esa misma funcion
Si si, lo tome prestado, pero juro que se lo devuelvo. :D
Mis conclusiones actuales son: Impedimiento al reconocer un nuevo formato del archivo ".ANI" tanto para ambos compiladores de recursos (windres y brc32) que son utilizados en HMG y MiniguiExtended respectivamente. Si pudieramos hechar manos de los códigos fuentes de tales compiladores de recursos, podríamos intentar hacer algo.
Sobre cargar archivo con otros formatos desde el RC para ser exibidos en pantalla o para impresion, está para ser mejorado...
Esta es mas o menos la misma funcion con un control de cada paso para ver los resultados, ahí vas a ver que si reconoce el recurso (prueba cambiando el valor 21 por otro) y que retorna el HGLOBAL. Lo que no sé es como pasar ese HGLOBAL a sendMessage(). Tal vez con loadolepicture()...

Code: Select all

ImageAnimate( oImg:handle, 1016, 21 )


HB_FUNC( IMAGEANIMATE )
{
   HWND h = (HWND) hb_parnl(1);
   HRSRC   hResourceData;
   LPVOID lpMsgBuf;

   HGLOBAL hGlobalAlloc, hGlobalResource;
   LPVOID  lpGlobalAlloc, lpGlobalResource;
   DWORD   nFileSize;
//   IStream * iStream;
//   HRESULT hr;

   hResourceData = FindResource( NULL, (LPCWSTR) hb_parni(2), (LPCWSTR) hb_parni(3) );
   if (hResourceData == NULL)
   {
    FormatMessage(
                   FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                   NULL,
                   GetLastError(),
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   (LPTSTR) &lpMsgBuf,
                   0,
                   NULL
                 );
      MessageBox( 0, lpMsgBuf, TEXT("FindResource") , 0 );
      LocalFree( lpMsgBuf );
   }


   hGlobalResource = (HGLOBAL) LoadResource( GetModuleHandle(0), hResourceData );
   if (hGlobalResource == NULL)
   {
    FormatMessage(
                   FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                   NULL,
                   GetLastError(),
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   (LPTSTR) &lpMsgBuf,
                   0,
                   NULL
                 );
      MessageBox( 0, lpMsgBuf, TEXT("LoadResource") , 0 );
      LocalFree( lpMsgBuf );
   }

   lpGlobalResource = LockResource( hGlobalResource );
   if (lpGlobalResource == NULL)
   {
    FormatMessage(
                   FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                   NULL,
                   GetLastError(),
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   (LPTSTR) &lpMsgBuf,
                   0,
                   NULL
                 );
       MessageBox( 0, lpMsgBuf, TEXT("LockResource") , 0 );
     LocalFree( lpMsgBuf );
   }

   nFileSize = SizeofResource( NULL, (HRSRC) hResourceData );
   if (nFileSize == 0)
   {
    FormatMessage(
                   FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                   NULL,
                   GetLastError(),
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   (LPTSTR) &lpMsgBuf,
                   0,
                   NULL
                 );
     MessageBox( 0, lpMsgBuf, TEXT("SizeofResource") , 0 );
     LocalFree( lpMsgBuf );
   }
   hGlobalAlloc = GlobalAlloc( GHND, nFileSize );
   if( hGlobalAlloc == NULL )
   {
      FreeResource( hGlobalResource );
      hb_retni( 0 ) ;
      return ;
   }

   lpGlobalAlloc = GlobalLock( hGlobalAlloc );
   memcpy( lpGlobalAlloc, lpGlobalResource, nFileSize );
   GlobalUnlock( hGlobalAlloc );

//      hr = CreateStreamOnHGlobal( hGlobalResource, TRUE, &iStream );

   FreeResource( hGlobalResource );

  SendMessage( h, (UINT) STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hGlobalAlloc );
  hb_retnl( (LONG) hGlobalAlloc ) ;
}
Si claudio tiene tiempo seguramente lo incorporará el uso de ANI a bostaurus.
Un deseo... Seria bueno que la lib bostaurus sea incorporada en el core de hmg. Pero claro lo digo por es mas facil que hacerlo. :)
Regards/Saludos, Carlos (bcd12a)
User avatar
bpd2000
Posts: 1207
Joined: Sat Sep 10, 2011 4:07 am
Location: India

Re: Resource file to acept Animated Cursor

Post by bpd2000 »

Working example, please
BPD
Convert Dream into Reality through HMG
User avatar
danielmaximiliano
Posts: 2612
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Resource file to acept Animated Cursor

Post by danielmaximiliano »

Pablo César wrote: Si pudieramos hechar manos de los códigos fuentes de tales compiladores de recursos, podríamos intentar hacer algo.
Sobre cargar archivo con otros formatos desde el RC para ser exibidos en pantalla o para impresion, está para ser mejorado...
Hola Pablo: no habia leido bien este comentario... Windres es parte de GNU Binutils como todo GNU es libre y su actual respositorio esta en GITHUB : https://github.com/svp-dev/binutils" onclick="window.open(this.href);return false;
puede usted descargarlo en formato .Zip o clonar el repositorio mediante GIT Clone dentro de GITHUB Shell...
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Re: Resource file to acept Animated Cursor

Post by Pablo César »

bpd2000 wrote:Working example, please
Hiv Dave, as I said in in this message, making download of example attached in this one or make download directly in http://hmgforum.com/download/file.php?id=3632, run this you will see mouse animated cursor by pressing left mouse button (you will see Maggy SimpSons), this is assignable by C function (see source code) reading a different kind of file (with extension ANI). The problem, I wish to incorporated to Resource File and then at executable just to avoid to passa a .ANI file together with EXE one.

Seems be a problem to create/compile RC to object file for linking. Probably the problem is in windres source code.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
bpd2000
Posts: 1207
Joined: Sat Sep 10, 2011 4:07 am
Location: India

Re: Resource file to acept Animated Cursor

Post by bpd2000 »

Thank you Pablo
BPD
Convert Dream into Reality through HMG
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Resource file to acept Animated Cursor

Post by Pablo César »

danielmaximiliano wrote:Windres es parte de GNU Binutils como todo GNU es libre y su actual respositorio esta en GITHUB: https://github.com/svp-dev/binutils puede usted descargarlo en formato .Zip o clonar el repositorio mediante GIT Clone dentro de GITHUB Shell...
Grande Daniel ! Creo que ya tengo como bajarlo (seria este), solo falta tiempo para atender el proyecto HMGWeb que estaré ocupado.

Gracias por tu indicación, yo busqué pero no tenia seguridad, porque el link era otro.

Por favor, podés tuterame, entiendo tu educacion, pero asi me haces más viejo... jiji
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Resource file to acept Animated Cursor

Post by Pablo César »

bpd2000 wrote:Thank you Pablo
I am glad to know that you understand the problem. If you have any tips or experience with this issue of CR, please be free to comment.

Thank you for your interest !
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: Resource file to acept Animated Cursor

Post by srvet_claudio »

Hi Pablo,

This the theory of load animated cursor from resource, but not work!!!
It's very rare error because CreateIconFromResource() return a NULL handle but GetLastError() return 0 (The operation completed successfully).

Best regards,
Claudio.

PS: CreateIconFromResource(): If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Code: Select all

// Resource file (.RC)
// MAGGY   ANICUR   MAGGY.ani

#include "hmg.ch"

#define HTCAPTION          2
#define WM_MOVE            3
#define WM_NCLBUTTONDOWN   161


Function Main

   DEFINE WINDOW Form_1 AT 0,0 WIDTH 400 HEIGHT 200 ;
      TITLE 'Press the Left Mouse Button' ;
      MAIN ;
      ON MOUSECLICK MoveActiveWindow() 
   END WINDOW
   CENTER WINDOW Form_1
   ACTIVATE WINDOW Form_1
Return Nil


Function MoveActiveWindow( hWnd )
   DEFAULT hWnd := GetActiveWindow()
   PostMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 )

// _HMG_SetCursor (HMG_LoadAnimatedCursor("MAGGY.ani"))         // disk      (work)
   _HMG_SetCursor (HMG_LoadAnimatedCursor("MAGGY",  "ANICUR"))  // resource  (not work)

Return Nil



#pragma BEGINDUMP

#include "SET_COMPILE_HMG_UNICODE.ch"
#include "HMG_UNICODE.h"

#include <windows.h>
#include "hbapi.h"


//       HMG_LoadAnimatedCursor (FileName, TypeResource) --> Return hCursor
HB_FUNC (HMG_LOADANIMATEDCURSOR)
{
    TCHAR   *FileName     = (TCHAR *) HMG_parc (1); 
    TCHAR   *TypeResource = (TCHAR *) HMG_parc (2);
    HCURSOR hCursor = NULL;
    
    HRSRC hResource = FindResource(NULL, FileName, TypeResource);
    DWORD dwResourceSize = SizeofResource(NULL, hResource);
        if (dwResourceSize>0)
        {   HGLOBAL hGlobal = LoadResource(NULL, hResource);
            if (hGlobal)
            {   LPBYTE pResource = (LPBYTE)LockResource(hGlobal);
                if (pResource)
                {   hCursor = (HCURSOR) CreateIconFromResource  ((PBYTE)pResource, dwResourceSize, FALSE, 0x00030000);
                 // hCursor = (HCURSOR) CreateIconFromResourceEx((PBYTE)pResource, dwResourceSize, FALSE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE); 
                    if (hCursor == NULL && GetLastError() == ERROR_SUCCESS)
                        MessageBox (NULL,_TEXT("hCursor == NULL bud The operation completed successfully ???"),_TEXT("Error"),0);
                }
                FreeResource(hGlobal);
            }
        }
        else
           hCursor = LoadCursorFromFile (FileName);
    
    hb_retnl ((LONG) hCursor);
}



HB_FUNC (_HMG_SETCURSOR)
{
   HCURSOR hCursorPrevious;
   hCursorPrevious = SetCursor ( (HCURSOR) hb_parnl(1) );
   hb_retnl ((LONG) hCursorPrevious);
}


#pragma ENDDUMP
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
Post Reply