Sección de tutoriales y manuales vb

Tutorial Api - parte 2

Parte 1 - Parte 2 - Parte 3



 

 

Ahora vamos a realizar un programa un poco mas complicado que el anterior:

Nota importante: cuando hice este ejemplo, lo realicé en windows 98, por lo tanto habría que hacerle algunas modificaciones para que funcione en Windows NT, en la sección Api hay un ejemplo de como Establecer el papel tapiz para estas versiones de windows

El ejemplo consistirá en una aplicación que cambie el papel tapiz del escritorio cada cierto intervalo de tiempo. Para ello utilizaremos 2 funciones Api:

La que se encargará de cambiar el papel tapiz se llama SystemParametersInfo y la que controlará el intervalo de tiempo se llama GetTickCount

 

La imagen del ejemplo:

Programa de ejemplo utilizando la función

 

Pasos a seguir:

1 - Abre el vb y en el formulario principal (Form1) agregá los siguientes controles:

2 - Ahora copia y pega este código en el Form1:

'Variable para almacenar el path del archivo
Dim pathArchivo As String

Private Sub Command1_Click()
'Agrega el path al ListBox
List1.AddItem pathArchivo
End Sub

Private Sub Command2_Click()

On Error GoTo mensaje

'Elimina un path del Listbox
If List1.ListIndex <> -1 Then
List1.RemoveItem List1.ListIndex
End If


'Rutina de error
Exit Sub
mensaje:
MsgBox "Para eliminar una imágen primero debes seleccionarla de la lista", vbInformation + vbOKOnly, "Error al eliminar"

End Sub

Private Sub Command3_Click()

'Abre el Form2 para configurar el tiempo
Form2.Show 1

End Sub

Private Sub Dir1_Change()
'Mostramos los archivos cuando cambiamos de directorio en el Dir1
File1 = Dir1
End Sub

Private Sub Drive1_Change()
Dir1 = Drive1
End Sub

Private Sub File1_Click()
On Error GoTo salir
'Cargamos la imagen
Image1 = LoadPicture(Dir1.Path + "\" + File1.FileName)
pathArchivo = Dir1.Path + "\" + File1.FileName
salir:
Exit Sub
End Sub

Private Sub Form_Load()
Command1.Caption = "Agegar imagen"
Command2.Caption = "Eliminar imagen"
Command3.Caption = "Configurar el intervalo"
End Sub

 

Este código permitirá en el Form1, navegar por el disco en busca de imágenes. El Command1 será el que agregue las rutas de las imágenes al List1, pasándole como parámetro al método Additem, la variable patharchivo que contiene la ruta de la imagen

3 - Añade otro formulario al proyecto. Este Form tendrá la función de definir el intervalo de tiempo entre cada imagen. Ahora ingresá los siguientes controles al form2:

 

Formulario para configurar el intervalo que cambiará el papel tapiz

 

El código del Form2

 

'Función Api SystemParametersInfo para establecer el papel Tapiz
Private Declare Function SystemParametersInfo Lib "user32" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As _
Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long _

'Función Api GetTickCount para establecer el retardo
Private Declare Function GetTickCount Lib "Kernel32" () As Long

Private Sub Command1_Click()
Dim tiempo As Long
Dim comienzoWin As Long
Dim retorno As Long

tiempo = (Combo1 * 60 * 60) + (Combo2 * 60) * 1000

For i = 0 To Form1.List1.ListCount - 1
comienzoWin = GetTickCount
While GetTickCount <= comienzoWin + tiempo
DoEvents
Wend
'ejecutamos SystemParametersInfo pasandole la ruta
retorno = SystemParametersInfo(20, 0, Form1.List1.List(i), 0)
Next

End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Form_Load()
Dim i As Integer

'Cargamos el Combo1 con las horas
For i = 0 To 23
Combo1.AddItem i
Next
'Cargamos el Combo2 con los minutos
For i = 0 To 59
Combo2.AddItem i
Next


Combo1 = Combo1.List(0)
Combo2 = Combo2.List(0)


Command1.Caption = "Comenzar"
Command2.Caption = "Salir"
End Sub

 

Comentario del ejemplo anterior:


La función Api SystemParametersInfo será la encargada de establecer el papel tapiz. Ya habrás visto que esta función parece un choclo indescifrable, pero vas a ver que es no es tan así.

Esta función tiene varios parámetros, en este caso a nosotros nos interesa solo uno y es el tercero "lpvParam". (mas simple imposible)

Este parámetro lleva la ruta o path del archivo de imagen que queremos cambiar.

La otra función Api GetTickCount, lo que hace es lo siguiente: La función devuelve un número de tipo Long Este número representa la cantidad de milisegundos desde que inició windows.

Nosotros lo que haremos es almacenar entre cada intervalo de cada imagen la cantidad de milisegundos en una variable llamada inicioWin antes de entrar en un bucle While.
Luego al bucle le pasamos como condición que compare el valor de GetTickCount actual con otro valor que es la suma de la variable inicioWin + la variable tiempo, que es la que almacena el valor seleccionado de los ComboBox

Si este valor es menor o igual se termina el bucle.

La sentencia DoEvents dentro del bucle While se utiliza para que el programa no se apodere de todos los recursos del sistema.

Por último queda explicar que el bucle For, en la condición, tendrá como índice menor el 0 y como mayor la cantidad de imágenes que haya en el list1, o mejor dicho la cantidad de índices o elementos que tenga el control.

Justo cuando termina el bucle While llamamos a la función api SystemParametersInfo y le pasamos como parámetro la ruta guardada en el control ListBox, o mejor dicho comenzamos desde el elemento 0 hasta el último elemento que lo determina la variable "i" del bucle For y se la pasamos al método List del control de lista, y que obviamente tendrá la cadena o ruta del elemento actual del mismo.

Nota: este programa es solo para que veas el mecanismo de estas 2 funciones Api, con lo cual el programa está a modo de ejemplo y puede ser mejorado. Por ejemplo puedes cambiar la interfaz gráfica, esconder u ocultar el formulario en la barra Tray cuando se ejecuta, agregarle por ejemplo la opción de cambiar el papel tapiz cuando inicia Windows y algunas cosas mas.


 

Ejemplo2 - Posicionar una ventana siempre visible por encima de todas - Ventanas AlwaysOnTop

 

Vamos a utilizar una función que nos permite dejar un formulario siempre visible o también llamado "Allways On Top" en inglés.

Esta función es muy útil cuando queremos que un programa o ventana de nuestra aplicación, siempre se encuentre visible por mas de que cambiemos a cualquier otra ventana de windows o de otra aplicación.

Para ello usaremos una función Api muy sencilla llamada SetWindowPos.

La declaración completa de la función Api SetWindowPos:

 

Private Declare Function SetWindowPos Lib "User32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

 

Descripción de la función:

 

Esta función que tiene 7 parámetros, nosotros utilizaremos solo 3 de ellos.

En el primero, Hwnd de tipo Long, debemos especificar cual es el formulario o ventana que queremos dejar siempre visible.

En el segundo parámetro le pasaremos 2 constantes. Si queremos dejar la ventana siempre visible enviaremos aquí la constante HWND_TOPMOST, que tiene el valor -1. Si queremos dejar la ventana en estado normal enviamos la constante HWND_NOTOPMOST, que tiene el valor -2.

El último parámetro, wFlags, se utiliza para que el formulario no cambie de tamaño ni de posición en la pantalla. para esto utilizamos la unión de 2 constantes SWP_NOMOVE con el valor 2 (para que no cambie de posición), y SWP_NOSIZE con el valor 1 (para que el formulario no cambie de tamaño, si no por defecto windows redimencionará el formulario).

 

Pasos a seguir:


1 - Abre el visual basic con nuevo proyecto. En la zona de declaraciones copia y pega la función api con sus las constantes mencionadas:

'Constantes para usar en la función

Const HWND_TOPMOST = -1 'Situa el form encima de todos
Const HWND_NOTOPMOST = -2 'Vuelve al estado normal
Const SWP_NOSIZE = &H1 'SWP_NOSIZE y SWP_NOMOVE se usan juntas en la constante SWP_FLAGS para que el form no cambie de tamaño ni de lugar
Const SWP_NOMOVE = &H2
Const SWP_FLAGS = SWP_NOMOVE Or SWP_NOSIZE 'Para que no cambie el tamaño ni la posición

 

2 - Ahora crearemos un procedimiento o función de ajuste para hacer mas entendible el uso de esta función Api. Copia y pega el siguiente código:

'A esta función le enviamos la ventana o formulario con un valor boolean
'indicando si queremos o no dejar siempre visible la ventana

Private Sub MiFuncionDeAjuste(Formulario As Form, Estado As Boolean)

'Variable de retorno de la función
Dim retorno As Long

If Estado = True Then
'Siempre Visible - always On Top
retorno = SetWindowPos(Formulario.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_FLAGS)
Else
'Ventana normal
retorno = SetWindowPos(Formulario.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_FLAGS)
End If

End Sub

 

Como podés ver la función tiene 2 parámetros. el primero recibirá el formulario que queremos mandar a la función Api, que es de tipo Form. El segundo , de tipo boolean, recibirá el parámetro true cuando queramos la ventana "Always On Top". Si queremos el estado de ventana normal, le pasamos al parámetro el valor False

3 - Ahora podemos colocar en el formulario dos Command, uno que diga "siempre visible" y el otro "ventana normal".

El código para llamar a nuestra función de ajuste sería así:

'Este Command pone la ventana AlwaysOnTop
Private Sub Command1_Click()

MiFuncionDeAjuste Me, True

End Sub

'Este Command pone la ventana normal
Private Sub Command2_Click()

MiFuncionDeAjuste Me, False

End Sub

 


Ejemplo 3 - Saber el tipo de una unidad

 

Windows posee una función Api llamada GetDriveType en la cual nosotros le enviamos en un parámetro de tipo String una letra de unidad cualquiera, como por ejemplo la c:\, y esta nos retorna el tipo de unidad que se trata, como por ejemplo una unidad de disco removible, disco duro o fija, disco remoto o de red, disco de cd-rom, o una unidad de disco virtual.

En realidad la función no nos devuelve un valor de tipo String, si no un número. para saber, por medio de este número que devuelve que tipo de unidad es, esta función utiliza una serie de constantes.

Esta es la declaración de la Api GetDriveType y las constantes con sus respectivos valores.

'Declaración de la función Api GetDriveType
Private Declare Function GetDriveType Lib "Kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

' Valores de retorno de GetDriveType

Const NO_EXITE = 1
Const DRIVE_REMOVABLE = 2
Const DRIVE_FIXED = 3
Const DRIVE_REMOTE = 4
Const DRIVE_CDROM = 5
Const DRIVE_RAMDISK = 6

 

Esta función es de lo mas fácil de utilizar, y como vemos tiene un solo parámetro "nDrive" de tipo String, donde debemos enviarle la unidad a la que queremos que nos retorne información sobre la misma.

En el parámetro "nDrive" debemos enviarle la letra de unidad con los 2 puntos y la barra (a:\), de lo contrario la función retornará el valor 1, y este valor indíca que la unidad no existe.

Los demás valores los puedes ver en las constantes, el valor de retorno 2 significa "disco removible", el 3 "disco duro", el 4 "disco remoto", el 5 "disco de cd rom", el 6 "disco virtual".

 

Ejemplo:


En el formulario principal, luego de declarar la función api con las constantes mencionadas mas arriba, agrega un command1, un control combo1, que tenga el valor de las unidades donde seleccionar (a:\,c:\, etc...).

El código completo:

 

Private Sub Command1_Click()

unidad = Combo1.Text

'Llamamos a la función GetDriveType pasandole la unidad
retorno = GetDriveType(unidad)

Select Case retorno

Case NO_EXITE
MsgBox "La unidad seleccionada no existe en su sistema", vbInformation + vbOKOnly, "Api GetDriveType"

Case DRIVE_REMOVABLE
MsgBox "La unidad seleccionada es una unidad de disco removible", vbInformation + vbOKOnly, "Api GetDriveType"

Case DRIVE_FIXED
MsgBox "La unidad seleccionada es una unidad de Disco fijo o Disco Duro", vbInformation + vbOKOnly, "Api GetDriveType"

Case DRIVE_REMOTE
MsgBox "La unidad seleccionada es una unidad de disco remota o de red", vbInformation + vbOKOnly, "Api GetDriveType"

Case DRIVE_CDROM
MsgBox "La unidad seleccionada es una unidad de CD-ROM", vbInformation + vbOKOnly, "Api GetDriveType"

Case DRIVE_RAMDISK
MsgBox "La unidad seleccionada es una unidad de disco Virtual", vbInformation + vbOKOnly, "Api GetDriveType"

End Select

End Sub


Api parte 1 - Api parte 2 - Api parte 3

 

 


Buscar en Recursos vb