USAR CURSORES CON VISUAL BASIC

 

Fecha: 18/Sep/97
Autor: Jordi Garcia Busquets



- Como utilizar un cursor diferente al predeterminado en VB3

Para poder usar en un programa hecho en VB3 un cursor que no sea el de por defecto hay
que usar la funcion de la API "LoadCursor", la cual carga el cursor a partir de un modulo que
est� en memoria. Con m�dulo nos referimos tanto a un ejecutable como una DLL, ambos conteniendo
recursos como cursores o iconos, que puedan ser capturados a partir de las funciones de la API.
En el siguiente ejemplo os muestro el metodo que yo segu� para crearme una DLL
conteniendo un cursor, y luego poder usar el cursor dentro de mi programa.
Empezemos primero con los pasos para crear la libreria:

1-Me cre� un fichero de recursos con el Resource Workshop que viene con el Turbo Pascal
1.5 for Windows. Con el editor de cursores he dibujado el cursor y definido el punto caliente.
2-Al cursor le he dado un nombre interno (en mi caso "HOLA") y he salvado el fichero
de recursos (en mi caso "CURSOR.RES")
3-Me creo un fichero CURSOR.PAS con el contenido siguiente:

library CURSOR;

{$R CURSOR.RES}

begin
end.

4-Lo compilo, sea con Turbo Pascal for W, Borland Pascal o Delphi.
Resultado: CURSOR.DLL.

-------------

Una vez hecho todo esto y para sacar el cursor en nuestro programa deberemos realizar
varias tareas:

1-Al cargar el programa, cargar la libreria en memoria. (LoadLibrary)
2-Cargar el cursor que contiene la libreria. (LoadCursor)
3-Obtener el cursor por defecto del Windows (GetClassWord)
4-Cambiar el cursor por el nuestro (SetclassWord)
5-Al acabar el programa, descargar la libreria de la memoria (FreeLibrary)
y descargar el cursor de la memoria. (DestroyCursor)


Pongamos a probar todo esto. Cread un proyecto nuevo. Cread un modulo y poned las
siguientes declaraciones:

'---Declaraciones

Declare Function DestroyCursor Lib "User" (ByVal hCursor As Integer) As Integer
Declare Function LoadLibrary Lib "kernel" (ByVal LibName as string) as integer
Declare Function LoadCursor Lib "User" (ByVal hInstance As Integer, ByVal lpCursorName As Any) As Integer
Declare Function SetClassWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal wNewWord As Integer) As Integer
Declare Function GetClassWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
Declare Sub FreeLibrary Lib "Kernel" (ByVal hLIbMod As Integer)
Global Const GCW_HCURSOR = (-12)

Global DLLInstance As Long
Global CursorPorDefecto
Global MiCursor

'---Fin de declaraciones

En el form_load del formulario en blanco creado por defecto, poned el siguiente codigo:

Sub Form_Load ()
Dim lastcursor as integer

'Cargamos la DLL en memoria y obtenemos un handle
'Supongamos que la tenemos a c:\windows\temp
DLLInstance = LoadLibrary("c:\windows\temp\cursor.dll")

'Cargamos el cursor de la libreria y obtenemos un handle
MiCursor = LoadCursor(DLLInstance, "HOLA")

'Obtenemos el handle del cursor por defecto del Windows
CursorPorDefecto = GetClassWord(me.hWnd, GCW_HCURSOR)

'Cambiamos el cursor por el nuestro
lastcursor = SetClassWord(me.hWnd, GCW_HCURSOR, MiCursor)

End Sub

Cuando el formulario se descarga, eliminamos la libreria de la memoria.


Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)
Dim lastcursor As Integer
Dim ret as integer

'Restauramos el cursor al cursor por defecto del Windows
lastcursor = SetClassWord(Me.hWnd, GCW_HCURSOR, CursorPorDefecto)

'Descargamos el cursor y liberamos todos los recursos que ocupaba
ret = DestroyCursor(MiCursor)

'Descargamos la libreria de la memoria
FreeLibrary (DLLInstance)

End Sub


- Como utilizar un cursor diferente al predeterminado en VB4-16 bits

En VB4 est� claro que todo este tinglado de crear una libreria, cargarla, etc no es
necesario, ya que esta opcion est� implementada en el entorno del Visual Basic. Por ejemplo,
para hacer que en un bot�n de una pantalla aparezca un cursor diferente personalizado lo
�nico que tenemos que hacer es crear previamente el cursor y guardar-lo en un fichero de
cursor (.cur), ir a la propiedad mouseicon del bot�n, asignar-le el cursor, y finalmente
poner la propiedad mousepointer a 99-Custom. Y todo resuelto.
Est� claro que, si en algun momento, nos interesa cargar un cursor de una libreria
que ya est� en memoria lo podremos seguir haciendo como en el ejemplo anterior, pues las
declaraciones de las funciones y su funcionamiento no var�an.


- Como utilizar un cursor diferente al predeterminado en VB4-32 bits y VB5.

En VB4-32 bits y VB5, adem�s de disponer de todas las opciones anteriores, se nos ofrece
una nueva: la posibilidad de cargar mediante las API un cursor directamente de un fichero.
La funci�n API que hace esto es la "LoadCursorFromFile".
Su declaraci�n es:

'----Declaraci�n
Declare LoadCursorFromFile& Lib "user32" Alias "LoadCursorFromFileA" (Byval lpFileName as String)


Un ejemplo similar al primero hecho con VB3, usando ahora esta funci�n:


Sub Form_Load ()
Dim lastcursor as long

'Cargamos el cursor del fichero y obtenemos un handle
MiCursor = LoadCursorFromFile("C:\windows\temp\resource.cur")

'Obtenemos el handle del cursor por defecto del Windows
CursorPorDefecto = GetClassWord(me.hWnd, GCW_HCURSOR)

'Cambiamos el cursor por el nuestro
lastcursor = SetClassWord(me.hWnd, GCW_HCURSOR, MiCursor)

End Sub


- Nota para todas las versiones

Fijaos en que el segundo parametro en la declaraci�n de la funci�n "LoadCursor" es de
tipo "Any", pero nosotros le pasamos una cadena con el nombre de la libreria. Esto es as�
porque esta funci�n puede usarse para mostrar tambi�n los cursores por defecto del Windows
(la flecha, la flecha vertical, el I-Beam, etc). Para hacer esto debemos establecer el primer
parametro a 0 y el segundo ser� un valor integer o long, dependiendo de si trabajamos en 16 o
32 bits, que identifique al cursor que queremos mostrar.
He aqu� las declaraciones de los cursores t�picos del Windows:

Public Const IDC_ARROW = 32512&
Public Const IDC_IBEAM = 32513&
Public Const IDC_WAIT = 32514&
Public Const IDC_CROSS = 32515&
Public Const IDC_UPARROW = 32516&
Public Const IDC_SIZE = 32640&
Public Const IDC_ICON = 32641&
Public Const IDC_SIZENWSE = 32642&
Public Const IDC_SIZENESW = 32643&
Public Const IDC_SIZEWE = 32644&
Public Const IDC_SIZENS = 32645&

Por ejemplo, para hacer aparecer el I-Beam, escribid:

MiCursor = LoadCursor(0,IDC_IBEAM)

Lo unico que hay que tener en cuenta aqu� es no usar la API "DestroyCursor" cuando
cargemos este tipo de cursores.


- Consejos

Cuando se trata de trabajar con este tipo de funciones que cargan librerias en memoria,
de vez en cuando haciendo pruebas el programa se aborta, por la raz�n que sea, y el resultado
es que la libreria queda cargada en memoria. Para poder descargarla yo uso un programa muy
�til que se encuentra escondido en el directorio c:\vb\cdk del Visual Basic 3.0, y que se llama
wps.exe. Con el podr�is ver los ejecutables y las librer�as que estan en memoria, y
descargarlas a vuestro antojo.
Los que no tengais VB3.0 no os apureis, que tambien lo podreis encontrar en Internet.
Simplemente id a Altavista, escribid "WPS.EXE", y listos.


- Demostraci�n

Podreis encontrar un ejemplo de uso de un cursor en VB3 en el programa que os adjunto.
Es una implementaci�n de un tablero de ajedrez, donde se validan a medida que avanzan los
movimientos las jugadas validas de una partida de ajedrez. Por ahora, que yo sepa, solo tiene
estos detalles por solucionar:

+ Al invertir el tablero, el programa no deja mover los peones.
+ El enroque corto, largo, jaque, jaque mate y matar el pe�n al paso no estan
contemplados.

Espero que os guste y os sea util, si es que ten�ais pensado hacer algun programa
de demostracion de ajedrez.


******************************************
Jordi Garcia Busquets
Estudiante de 3� de informatica
Universidad de Girona. Catalunya. Espanya.
[email protected]
******************************************


ir al índice

 Para bajar los listados, pulsa en el link (cursorJG.zip 18.7 KB)