APIs (III) Ejemplo de uso.

      Para este ejemplo de uso vamos a trabajar con la función API SetWindowPos, esta función manipula las ventanas abiertas en el escritorio, usada para mantener un formulario en pantalla sin ser ocultado por otras aplicaciones.

      Algunos de los párametros usados en las APIs, son utilizados para definir el comportamiento de la función e incidir en los datos devueltos.

      Public 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

      Parámetros usados por la función.

Tipo Nombre Uso
HWND hWnd Manipulador asignado a la ventana, define la ventana (Form) sobre el que vamos a actuar.
HWND hWndInsertAfter Valor que queremos asignar en el Z-order* de la ventana con respento al escritorio de Windows.
Integer X Posición horizontal
Integer Y Posición vertical
Integer cx Ancho
Integer cy Alto
UINT** wFlags Modificador de la posición para la ventana, controla el comportamiento de la función.
(*) Coordenada de profundidad para el orden de las ventanas en el escritorio.
(**) UINT Integer de 16-bit sin signo en Windows versions 3.0 y 3.1, en Win32 es un Integer de 32-bit sin signo.

      Se observa por los parámetros usados, que podemos actuar, tanto sobre el eje Z (hWndInsertAfter) para posicionar nuestro formulario en el primer plano, como con su posicionamiento y tamaño con X, Y, cx y cy. La forma en que obtengamos los resultados, viene definida por el parámetro de nombre wFlags. Usando los valores de constantes definidos para este parámetro, podemos actuar sobre el resultado.

      Algunas de estas constantes son:

Nombre Uso
Posición Z-order definidas en hWndInsertAfter
HWND_BOTTOM Situa Z-order al final. si el valor hWnd identifica una ventana que está en primer plano la enviará al final de todas las ventanas.
HWND_NOTOPMOST Coloca la ventana en una posición relativa de orden que no es la primera( pasa a un estado normal de uso donde puede obtener el foco o pasar al siguiente plano. ).
HWND_TOP Posiciona el formulario en primer plano de la lista del Z-order.
HWND_TOPMOST Coloca la ventana delante de todas las ventanas que ocupen un primer plano, fuerza a que sea la ventana primera de todas las demás.
Conportamiento de SetWindowPos según wFlags
SWP_HIDEWINDOW Oculta la ventana.
SWP_NOMOVE Mantiene la ventana en la misma posición, ignorando los parámetros x e y del fomulario.
SWP_NOOWNERZORDER Descarta el cambio de la posición Z-order.
SWP_NOSIZE No modifica el tamaño de la ventana, ignora el parámetro pasado en cx y cy.

      Como se ve en este ejemplo, la función usada para ordenar el Z-order del escritorio en base a las ventanas abiertas, se ve alterado en su uso por el parámetro wFlags.

      Para probar esta función, la tenemos que declarar en un módulo *.bas junto con las constante para su uso.

      Option Explicit

      Public 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

      'primer plano
      Public Const HWND_TOPMOST = -1
     
'normal
      Public Const HWND_NOTOPMOST = -2
     
'estas dos constantes son para que al ejecutar
      'la función no varie su tamaño y posición.
      Public Const SWP_NOSIZE = &H1
      Public Const SWP_NOMOVE = &H2

      Luego añadiremos dos funciones definidas por el usuario para el manejo de la función SetWindowPos.

'Coloca el formulario delante de los demás formularios.
Public Sub FormPrimerPlano(frm As Form)
   Call SetWindowPos(frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

'Libera la función para poder modificar su posición en el orden de ventanas.
Public Sub FormNormal(frm As Form)
   Call SetWindowPos(frm.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Sub

      A continuación pegaremos tres CommandButton y un Label en el Form1 y le asignaremos el siguiente código a los eventos Click de éstos.

      Option Explicit

      Private Sub Command1_Click()
            FormPrimerPlano Me
            Label1 = "El formulario se muestra en primer plano y no será ocultado por otras ventanas"
      End Sub

      Private Sub Command2_Click()
            FormNormal Me
            Label1 = "El formulario se muestra de forma normal"
      End Sub

      Private Sub Command3_Click()
            Unload Me
      End Sub

      Una vez hecho ésto ejecutar la aplicación tomando como formulario inicial Form1.

      Al pulsar Command1 el formulario se mantendrá en primer plano, aún cuando otra ventana o aplicación tenga el foco de ejecución.

      Al pulsar Command2 el formulario se volverá a quedar liberado y se ocultará cuando otra ventana o aplicación obtenga el foco de ejecución.

      Al pulsar Command3 salimos de la ejecución.

      En el apartado Demos tienes el ejemplo para bajarlo



    


Copyright © 2001, SoftAutodid