windows api fica windows apironaldvalenzuel/ucsc/clase03.pdf · windows api ronald valenzuela fica...
TRANSCRIPT
Windows API
RonaldValenzuela
Fica
Gestion deMensajes
GDI: GraphicsDeviceContext
Windows API
Ronald Valenzuela Fica
UCSC, Concepcion, Chile
24 de Agosto de 2009
Windows API
RonaldValenzuela
Fica
Gestion deMensajes
GDI: GraphicsDeviceContext
Clase Anterior
APIDefinicionEjemplos
Windows APIHello WorldUnicodeNotacion HungaraCiclo de una Aplicacion
Windows API
RonaldValenzuela
Fica
Gestion deMensajes
GDI: GraphicsDeviceContext
Hoy
1 Gestion de Mensajes
2 GDI: Graphics Device Context
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 ;
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.
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.
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.
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) ;
}
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) ;
}
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.
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.
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().
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.
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
);
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).
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 ;
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 ;
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 ;
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 ;
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.
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.
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.
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.
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.
Windows API
RonaldValenzuela
Fica
Gestion deMensajes
GDI: GraphicsDeviceContext
Proxima Clase
Laboratorio:
Terminaremos nuestro laboratorio.
Clase Lunes 31 :
Bibliotecas de enlace dinamico (DLL).