windows api fica windows apironaldvalenzuel/ucsc/clase03.pdf · windows api ronald valenzuela fica...

25
Windows API Ronald Valenzuela Fica Gesti´onde Mensajes GDI: Graphics Device Context Windows API Ronald Valenzuela Fica UCSC, Concepci´ on, Chile 24 de Agosto de 2009

Upload: others

Post on 12-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Windows API

Ronald Valenzuela Fica

UCSC, Concepcion, Chile

24 de Agosto de 2009

Page 2: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Clase Anterior

APIDefinicionEjemplos

Windows APIHello WorldUnicodeNotacion HungaraCiclo de una Aplicacion

Page 3: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Hoy

1 Gestion de Mensajes

2 GDI: Graphics Device Context

Page 4: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Volvamos al Bucle de Mensajes

El programa ya esta frente al usuario, ahora este envıa mensajes al OS a traves de la aplicacion.

while (GetMessage (&msg , NULL , 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

Una estructura MSG tiene el sgte. prototipo:

typedef struct tagMSG

{

HWND hwnd ;

UINT message ;

WPARAM wParam ;

LPARAM lParam ;

DWORD time ;

POINT pt ;

}

MSG , * PMSG ;

Page 5: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Volvamos al Bucle de Mensajes

El programa ya esta frente al usuario, ahora este envıa mensajes al OS a traves de la aplicacion.

while (GetMessage (&msg , NULL , 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

La funcion GetMessage() recolecta un mensaje desde la cola de mensajes que mantiene el sistemaoperativo.

La funcion TranslateMessage() entrega el mensaje al sistema operativo para que este traduzca enmensajes de caracteres los mensajes virtuales de teclado.

La funcion TranslateMessage() envıa finalmente el mensaje a la funcion de procedimiento(CALLBACK) asociada con la ventana que produjo el mensaje.

Page 6: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Volvamos al Bucle de Mensajes

El programa ya esta frente al usuario, ahora este envıa mensajes al OS a traves de la aplicacion.

while (GetMessage (&msg , NULL , 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

La funcion GetMessage() recolecta un mensaje desde la cola de mensajes que mantiene el sistemaoperativo.

La funcion TranslateMessage() entrega el mensaje al sistema operativo para que este traduzca enmensajes de caracteres los mensajes virtuales de teclado.

La funcion TranslateMessage() envıa finalmente el mensaje a la funcion de procedimiento(CALLBACK) asociada con la ventana que produjo el mensaje.

Page 7: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Volvamos al Bucle de Mensajes

El programa ya esta frente al usuario, ahora este envıa mensajes al OS a traves de la aplicacion.

while (GetMessage (&msg , NULL , 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

La funcion GetMessage() recolecta un mensaje desde la cola de mensajes que mantiene el sistemaoperativo.

La funcion TranslateMessage() entrega el mensaje al sistema operativo para que este traduzca enmensajes de caracteres los mensajes virtuales de teclado.

La funcion TranslateMessage() envıa finalmente el mensaje a la funcion de procedimiento(CALLBACK) asociada con la ventana que produjo el mensaje.

Page 8: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Volvamos al Bucle de Mensajes

El programa ya esta frente al usuario, ahora este envıa mensajes al OS a traves de la aplicacion.

while (GetMessage (&msg , NULL , 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

GetMessage() retornara 0 solo cuando el mensaje sea WM QUIT (o bien 0x0012). Es importante senalar quela funcion puede retornar -1 en caso de error. Por lo que el codigo anterior puede llevar a un problema, quepuede solucionarse de la siguiente forma:

while (1)

{

if(GetMessage (&msg , NULL , 0, 0)<=0)

break;

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

Page 9: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Funcion de Callback en Ventanas

Recordemos: Hemos registrado una clase de ventanas que utilizaremos paranuestra aplicacion. A esta clase hemos asociado una funcion deprocedimiento, que gestionara nuestros mensajes.

LRESULT CALLBACK WndProc (HWND hwnd , UINT message ,

WPARAM wParam , LPARAM lParam)

{

(...)

switch (message)

{

case WM_CREATE:

return 0 ;

case WM_PAINT:

hdc = BeginPaint (hwnd , &ps) ;

(...)

EndPaint (hwnd , &ps) ;

return 0 ;

case WM_DESTROY:

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd , message , wParam , lParam) ;

}

Page 10: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Mensajes

Los mensajes estan definidos en winuser.h.

(...)

#define WM_TIMER 275

#define WM_UNDO 772

#define WM_USER 1024

#define WM_USERCHANGED 84

#define WM_VKEYTOITEM 46

#define WM_VSCROLL 277

#define WM_VSCROLLCLIPBOARD 778

#define WM_WINDOWPOSCHANGED 71

#define WM_WINDOWPOSCHANGING 70

#define WM_WININICHANGE 26

#define WM_KEYFIRST 256

(...)

Ademas podemos definir mensajes propios dando el offset WM USER +

ID.

Page 11: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Mensajes

Algunos mensajes importantes:

WM CREATE:

Se envıa cuando la ventana es creada, justo antes de desplegarse.

lParam apunta a una estructura que contiene todos los valores decreacion.

WM COMMAND:

Cuando un control (edit, boton, lista, menu) ejecuta alguna accion.

lParam handle del control.

La parte alta de wParam indica si este proviene de un mensaje odesde el menu. La parte baja contiene el id del control.

Page 12: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Mensajes

WM MOUSEMOVE:

wParam Contiene indicadores sobre si algunas teclas (modificadores)estan presionadas. MK CONTROL, MK LBUTTON,MK MBUTTON, MK RBUTTON, MK SHIFT o bien unacombinacion de estas.

lParam indica la posicion del cursor, el eje x en la parte baja y en laalta el eje y. Para separarlos se puede utilizar las macros HIWORD()y LOWORD().

Page 13: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Mensajes

WM PAINT:

Es enviado por una aplicacion cuando se requiere pintar una porcionde una ventana. Es enviado al llamar a la funcion UpdateWindow,RedrawWindow.

Cuando una porcion de la ventana necesita redibujarse, se dice queesta se ha vuelto invalida. Por ejemplo, al inicio toda la ventana estainvalida. Una ventana con estilos CS HREDRAW o CS VREDRAW seinvalida completamente cuando esta es redimensionada. Tambiencuando una ventana oculta a otra, esa zona se vuelve invalida.

Una ventana al invalidarse ejecuta el codigo indicado en el callbackpara este mensaje.

Page 14: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Mensajes

Finalmente, es posible enviar mensajes a traves de las funciones:

LRESULT SendMessage(

HWND hWnd , // handle of destination window

UINT Msg , // message to send

WPARAM wParam , // first message parameter

LPARAM lParam // second message parameter

);

LONG SendDlgItemMessage(

HWND hDlg , // handle of dialog box

int nIDDlgItem , // identifier of control

UINT Msg , // message to send

WPARAM wParam , // first message parameter

LPARAM lParam // second message parameter

);

Page 15: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

GDI: Graphics Device Context

Es un framework que nos permite la abstraccion de lacapa fısica necesarıa para dibujar sobre algun dispositivo.

Es provisto por Windows a traves de la biblioteca deenlace dinamico gdi32.dll.

Este modulo se conecta directamente con los drivers deldispositivo sobre el cual se imprime un grafico (ya sea unaimpresora, tarjeta de video, etc).

Page 16: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

GDI: Graphics Device Context

Un Device Context es una estructura que provee abstracciondel medio. Para dibujar sobre este se requieren los siguientespasos:

Obtener el DC para el objeto determinado (ventana,impresora, memoria, etc).

Establecer atributos de dibujo (color, plumas, etc).

Utilizar la API de Windows para dibujar sobre el DC.

Liberar el DC una vez que se termine de dibujar.

Por ejemplo:

case WM_PAINT:

hdc = BeginPaint (hwnd , &ps) ;

hPen = CreatePen( PS_DASH ,1,RGB (255 ,0 ,0));

SelectObject (hdc , hPen2) ;

Ellipse (hdc , 50, 50, 50, 50) ;

EndPaint (hwnd , &ps) ;

return 0 ;

Page 17: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

GDI: Graphics Device Context

Un Device Context es una estructura que provee abstracciondel medio. Para dibujar sobre este se requieren los siguientespasos:

Obtener el DC para el objeto determinado (ventana,impresora, memoria, etc).

Establecer atributos de dibujo (color, plumas, etc).

Utilizar la API de Windows para dibujar sobre el DC.

Liberar el DC una vez que se termine de dibujar.

Por ejemplo:

case WM_PAINT:

hdc = BeginPaint (hwnd , &ps) ;

hPen = CreatePen( PS_DASH ,1,RGB (255 ,0 ,0));

SelectObject (hdc , hPen2) ;

Ellipse (hdc , 50, 50, 50, 50) ;

EndPaint (hwnd , &ps) ;

return 0 ;

Page 18: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

GDI: Graphics Device Context

Un Device Context es una estructura que provee abstracciondel medio. Para dibujar sobre este se requieren los siguientespasos:

Obtener el DC para el objeto determinado (ventana,impresora, memoria, etc).

Establecer atributos de dibujo (color, plumas, etc).

Utilizar la API de Windows para dibujar sobre el DC.

Liberar el DC una vez que se termine de dibujar.

Por ejemplo:

case WM_PAINT:

hdc = BeginPaint (hwnd , &ps) ;

hPen = CreatePen( PS_DASH ,1,RGB (255 ,0 ,0));

SelectObject (hdc , hPen2) ;

Ellipse (hdc , 50, 50, 50, 50) ;

EndPaint (hwnd , &ps) ;

return 0 ;

Page 19: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

GDI: Graphics Device Context

Un Device Context es una estructura que provee abstracciondel medio. Para dibujar sobre este se requieren los siguientespasos:

Obtener el DC para el objeto determinado (ventana,impresora, memoria, etc).

Establecer atributos de dibujo (color, plumas, etc).

Utilizar la API de Windows para dibujar sobre el DC.

Liberar el DC una vez que se termine de dibujar.

Por ejemplo:

case WM_PAINT:

hdc = BeginPaint (hwnd , &ps) ;

hPen = CreatePen( PS_DASH ,1,RGB (255 ,0 ,0));

SelectObject (hdc , hPen2) ;

Ellipse (hdc , 50, 50, 50, 50) ;

EndPaint (hwnd , &ps) ;

return 0 ;

Page 20: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Tipos de Dispositivos de Context

Dentro de los DC que podemos manejar con GDI, encontramos 3 tipos:

DC de Pantalla.

DC de Impresora.

DC de Memoria.

DC de Informacion.

Una aplicacion obtiene un DC de pantalla llamando a las funciones BeginPaint oGetDC, identificando la ventana que recibira la salida.

Frecuentemente se obtienen solo cuando se desea redibujar una porcion de laventana. Se liberan con EndPaint o ReleaseDC respectivamente.

Page 21: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Tipos de Dispositivos de Context

Dentro de los DC que podemos manejar con GDI, encontramos 3 tipos:

DC de Pantalla.

DC de Impresora.

DC de Memoria.

DC de Informacion.

Un DC de impresora puede ser utilizada para cualquier tipo de impresora (matrizde punto, inyeccion de tinta, laser, plotter...).

Son creados con la funcion CreateDC, y reciben de argumentos el nombre deldriver de impresion y el nombre de la impresora.

Este tipo de DC deben ser eliminados cuando se finaliza su uso con DeleteDC.

Page 22: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Tipos de Dispositivos de Context

Dentro de los DC que podemos manejar con GDI, encontramos 3 tipos:

DC de Pantalla.

DC de Impresora.

DC de Memoria.

DC de Informacion.

Los DC de memoria son utilizados para almacenar imagenes en forma de mapasde bits.

Son creados por CreateCompatibleDC entregando un DC del cual obtendra suspropiedades (formatos de color).

Para comenzar a dibujar sobre este DC se debe usar SelectObject para cargar unaimagen sobre el.

Deben eliminarse con DeleteDC.

Page 23: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Tipos de Dispositivos de Context

Dentro de los DC que podemos manejar con GDI, encontramos 3 tipos:

DC de Pantalla.

DC de Impresora.

DC de Memoria.

DC de Informacion.

Se utilizan para obtener informacion sobre un dispositivo sin crear la informacionde dibujo, lo que la hace mas rapida y liviana.

Se crean mediante la funcion CreateIC y puede obtenerse informacion a traves deGetCurrentObject y GetObject (Por ejemplo: el lapiz y color que utiliza).

Debe ser eliminada con la funcion DeleteDC.

Page 24: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Bibliografıa

Biblioteca en lınea MSDN.

C. Petzold, ”Programming Windows”, 5ta. Ed., MicrosoftPress, 1998.

J. Pascual Sancho, F. Charte Ojeda, M. Segarra Martnez,”Programacion Avanzada en Windows 2000”, OsborneMcGraw-Hill, 2000.

Mark E. Russinovich, David A. Solomon, ”WindowsInternals”, Microsoft Press, 2005.

Page 25: Windows API Fica Windows APIronaldvalenzuel/ucsc/Clase03.pdf · Windows API Ronald Valenzuela Fica Gesti on de Mensajes GDI: Graphics Device Context Funci on de Callback en Ventanas

Windows API

RonaldValenzuela

Fica

Gestion deMensajes

GDI: GraphicsDeviceContext

Proxima Clase

Laboratorio:

Terminaremos nuestro laboratorio.

Clase Lunes 31 :

Bibliotecas de enlace dinamico (DLL).