Windows API Ronald Fica Windows API - UdeCronaldvalenzuel/ucsc/Clase02.pdf17 de Agosto de 2009...
Transcript of Windows API Ronald Fica Windows API - UdeCronaldvalenzuel/ucsc/Clase02.pdf17 de Agosto de 2009...
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Windows API
Ronald Valenzuela Fica
UCSC, Concepcion, Chile
17 de Agosto de 2009
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Clase Anterior
Etapas de la CompilacionPreprocesamientoCompilacionEnsamblajeEnlace
Herramientas para CompilarMakefile
Herramientas para DesarrolloIDE (Entornos graficos para administrar proyectos)
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hoy
1 API’sEjemplos
2 Windows APIHello WorldUnicodeNotacion HungaraCiclo de Aplicacion
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
API’s
API: Application programming interface.
Conjunto de funciones y procedimientos ofrecida por una bibliotecapara ser utilizada por otro software como una capa de abstraccion.
Proporcionan funciones de uso general, como por ejemplo paragenerar ventanas, iconos en pantalla, manejar dispositivos, obtenerinformacion de un sistema, etc.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ejemplos de API
OpenGL (Open Graphics Library)
Desarollada por Silicon Graphics.Estandar para aplicaciones graficas.Diferentes tarjetas graficas, mismos procedimientos paralos programadores.
GLUT, otra API que facilita la programacion con OpenGL.Manejo de ventanas, y dispositivos de entrada (mouse,teclado, etc.).
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
The Windows API
Windows API: Es la interfaz de programacion de aplicaciones de Microsoft. Proporciona los serviciosutilizados por todas las aplicaciones basadas en Windows. Permite acceder a la interfaz grafica, recursos desistema, audio, red, etc.
Las funciones de Win32 API se pueden agrupar en:
Gestion de ventanas
Controles de ventanas
Manejo de la consola
Interfaz de dispositivos graficos (GDI)
Servicios del sistema
Internacionalizacion
Servicios de red
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Subsistemas
El corazon de Windows esta implementado en 3 DLLs, las que contienen los 3 subsistemas fundamentales delSO.
Kernel (kernel32.dll): encargada de la administracion de la memoria, la gestion de procesos yfunciones de E/S de datos
User (user32.dll): implementa la interfaz de usuario y la logica de manejo de las ventanas
GDI (gdi32.dll): Graphics Device Interface, permite el despliegue de texto y graficos en monitores eimpresoras.
Estas 3 bibliotecas estan siempre presentes en memoria RAM.
Para utilizar las funciones contenidas en estas bibliotecas necesitamos conocer sus ubicaciones en la memoria,
esta se resuelve a traves de las bibliotecas que son importadas al compilar el proyecto (al enlazar).
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hello World
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR szCmdLine , int iCmdShow)
{
MessageBox (NULL , TEXT ("Hello , INF4201 en Windows!"),
TEXT ("HelloMsg"), 0) ;
return 0 ;
}
WINDOWS.H es un archivo maestro que incluye otras cabeceras, algunos de los mas importantes son:
WINDEF.H Definiciones basicas.
WINNT.H Definiciones para el soporte Unicode.
WINBASE.H Funciones del Kernel.
WINUSER.H Funciones de interfaz de usuario.
WINGDI.H Funciones de interfaz de dispositivos graficos.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hello World
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR szCmdLine , int iCmdShow)
{
MessageBox (NULL , TEXT ("Hello , INF4201 en Windows!"),
TEXT ("HelloMsg"), 0) ;
return 0 ;
}
El punto de entrada esta declarado en winbase.h como sigue:
int // return type
WINAPI // #define WINAPI __stdcall (Convencion usada al compilar)
WinMain(
HINSTANCE hInstance , // Un numero que identifica al programa
HINSTANCE hPrevInstance , // Este parametro siempre es NULL
// Se utilizaba antes para identificar otras instancias del programa ..
LPSTR lpCmdLine , // Un puntero a los argumentos de la linea de comandos
int nShowCmd // Estado en que se inicia (SW_HIDE ,SW_MAXIMIZE , etc ...).
);
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hello World
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR szCmdLine , int iCmdShow)
{
MessageBox (NULL , TEXT ("Hello , INF4201 en Windows!"),
TEXT ("HelloMsg"), 0) ;
return 0 ;
}
La funcion MessageBox crea un cuadro de dialogo con un mensaje arbitrario:
int MessageBox(
HWND hWnd , // handle of owner window
LPCTSTR lpText , // address of text in message box
LPCTSTR lpCaption , // address of title of message box
UINT uType // style of message box
);
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hello World
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR szCmdLine , int iCmdShow)
{
MessageBox (NULL , TEXT ("Hello , INF4201 en Windows!"),
TEXT ("HelloMsg"), 0) ;
return 0 ;
}
La funcion MessageBox crea un cuadro de dialogo con un mensaje arbitrario:
int MessageBox(
HWND hWnd , // handle of owner window
LPCTSTR lpText , // address of text in message box
LPCTSTR lpCaption , // address of title of message box
UINT uType // style of message box
);
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
UNICODE: Cuando no basta con ASCII
Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex Dec Hex
0 00 NUL 16 10 DLE 32 20 48 30 0 64 40 @ 80 50 P 96 60 ‘ 112 70 p
1 01 SOH 17 11 DC1 33 21 ! 49 31 1 65 41 A 81 51 Q 97 61 a 113 71 q
2 02 STX 18 12 DC2 34 22 " 50 32 2 66 42 B 82 52 R 98 62 b 114 72 r
3 03 ETX 19 13 DC3 35 23 # 51 33 3 67 43 C 83 53 S 99 63 c 115 73 s
4 04 EOT 20 14 DC4 36 24 $ 52 34 4 68 44 D 84 54 T 100 64 d 116 74 t
5 05 ENQ 21 15 NAK 37 25 % 53 35 5 69 45 E 85 55 U 101 65 e 117 75 u
6 06 ACK 22 16 SYN 38 26 & 54 36 6 70 46 F 86 56 V 102 66 f 118 76 v
7 07 BEL 23 17 ETB 39 27 ’ 55 37 7 71 47 G 87 57 W 103 67 g 119 77 w
8 08 BS 24 18 CAN 40 28 ( 56 38 8 72 48 H 88 58 X 104 68 h 120 78 x
9 09 HT 25 19 EM 41 29 ) 57 39 9 73 49 I 89 59 Y 105 69 i 121 79 y
10 0A LF 26 1A SUB 42 2A * 58 3A : 74 4A J 90 5A Z 106 6A j 122 7A z
11 0B VT 27 1B ESC 43 2B + 59 3B ; 75 4B K 91 5B [ 107 6B k 123 7B {
12 0C FF 28 1C FS 44 2C , 60 3C < 76 4C L 92 5C \ 108 6C l 124 7C |
13 0D CR 29 1D GS 45 2D - 61 3D = 77 4D M 93 5D ] 109 6D m 125 7D }
14 0E SO 30 1E RS 46 2E . 62 3E > 78 4E N 94 5E ^ 110 6E n 126 7E ~
15 0F SI 31 1F US 47 2F / 63 3F ? 79 4F O 95 5F _ 111 6F o 127 7F DEL
$
Solo se necesitaba 7 bits para almacenar la informacion sobrecaracteres y aun sobran 128 numeros!!.
El problema es que todos los lenguajes del mundo,simplemente no pueden ser representados por 256 codigosde 8 bits.Desde Windows NT se introduce soporte UNICODE.Unicode es un sistema uniforme de 16 bits que permite larepresentacion de 65.536 caracteres.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
UNICODE: Cuando no basta con ASCII
El problema es que todos los lenguajes del mundo,simplemente no pueden ser representados por 256 codigosde 8 bits.
Desde Windows NT se introduce soporte UNICODE.
Unicode es un sistema uniforme de 16 bits que permite larepresentacion de 65.536 caracteres.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
UNICODE: Cuando no basta con ASCII
El problema es que todos los lenguajes del mundo,simplemente no pueden ser representados por 256 codigosde 8 bits.
Desde Windows NT se introduce soporte UNICODE.
Unicode es un sistema uniforme de 16 bits que permite larepresentacion de 65.536 caracteres.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
UNICODE: Cuando no basta con ASCII
El problema es que todos los lenguajes del mundo,simplemente no pueden ser representados por 256 codigosde 8 bits.
Desde Windows NT se introduce soporte UNICODE.
Unicode es un sistema uniforme de 16 bits que permite larepresentacion de 65.536 caracteres.
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Wide Characters and C
La idea de usar caracteres de 16 bits para programar ya habıa sidodesarrollada en ANSI C.Este define el set de caracteres conocido como Wide-Characters:
typedef unsigned short wchar_t;
wchar_t * pw = L"Hello!" ;
iWrongLength = strlen (pw) ;
iRightLength = wcslen (pw) ;
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Wide Characters and C
La idea de usar caracteres de 16 bits para programar ya habıa sidodesarrollada en ANSI C.Este define el set de caracteres conocido como Wide-Characters:
typedef unsigned short wchar_t;
wchar_t * pw = L"Hello!" ;
iWrongLength = strlen (pw) ;
iRightLength = wcslen (pw) ;
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Como mantener compatibilidad?
Gracias a TCHAR:
// Algunas de las cosas que hace tchar.h
#ifdef UNICODE
typedef wchar_t TCHAR ;
#define _tcslen wcslen;
#define __T(x) L##x
#else
typedef char TCHAR ;
#define _tcslen strlen;
#define __T(x) x;
#endif
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Como mantener compatibilidad?
Ademas con Windows:#ifdef UNICODE
typedef WCHAR TCHAR , * PTCHAR ;
typedef LPWSTR LPTCH , PTCH , PTSTR , LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else
typedef char TCHAR , * PTCHAR ;
typedef LPSTR LPTCH , PTCH , PTSTR , LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
WINUSERAPI int WINAPI MessageBoxA (HWND hWnd , LPCSTR lpText ,
LPCSTR lpCaption , UINT uType) ;
WINUSERAPI int WINAPI MessageBoxW (HWND hWnd , LPCWSTR lpText ,
LPCWSTR lpCaption , UINT uType) ;
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Hello Again
Basta con utilizar TCHAR! y la macro TEXT(x)
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR szCmdLine , int iCmdShow)
{
MessageBox (NULL , TEXT ("Hello , INF4201 en Windows!"),
TEXT ("HelloMsg"), 0) ;
return 0 ;
}
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Notacion Hungara
En la programacion en Windows, los nombres de variables siguen un formato llamado notacionhungara.
Se antepone a cada variable un prefijo en minusculas que indica su tipo.
Prefix Data Typec char or WCHAR or TCHAR
by BYTE (unsigned char)n shorti int
x, y int used as x-coordinate or y-coordinatecx, cy int used as x or y length; c stands for count”b or f BOOL (int); f stands for ”flag”
w WORD (unsigned short)l LONG (long)
dw DWORD (unsigned long)fn functions stringsz string te rminated by 0 characterh handlep pointer
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
Registrando la ventana:La estructura WNDCLASS.typedef struct
{
UINT style ;
WNDPROC lpfnWndProc ;
int cbClsExtra ;
int cbWndExtra ;
HINSTANCE hInstance ;
HICON hIcon ;
HCURSOR hCursor ;
HBRUSH hbrBackground ;
LPCTSTR lpszMenuName ;
LPCTSTR lpszClassName ;
}
WNDCLASS , * PWNDCLASS ;
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
Registrando la ventana:
static TCHAR szAppName [] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (! RegisterClass (& wndclass ))
{
MessageBox (NULL , TEXT ("This program requires Windows NT!"),
szAppName , MB_ICONERROR) ;
return 0 ;
}
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
Creando la ventana:hwnd = CreateWindow (szAppName , // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW , // window style
CW_USEDEFAULT , // initial x position
CW_USEDEFAULT , // initial y position
CW_USEDEFAULT , // initial x size
CW_USEDEFAULT , // initial y size
NULL , // parent window handle
NULL , // window menu handle
hInstance , // program instance handle
NULL) ; // creation parameters
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
Creando la ventana:hwnd = CreateWindow (szAppName , // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW , // window style
CW_USEDEFAULT , // initial x position
CW_USEDEFAULT , // initial y position
CW_USEDEFAULT , // initial x size
CW_USEDEFAULT , // initial y size
NULL , // parent window handle
NULL , // window menu handle
hInstance , // program instance handle
NULL) ; // creation parameters
// Crea la ventana en el modo especificado al arrancar
// el programa (SW_SHOWNORMAL , SW_SHOWMAXIMIZED ,SW_SHOWMINNOACTIVE)
ShowWindow (hwnd , iCmdShow) ;
// Hace que se pinte la pantalla , de otra forma solo se pintara el
// color de fondo
UpdateWindow (hwnd) ;
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
El bucle de mensajes:
while (GetMessage (&msg , NULL , 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
La funcion de CALLBACK:RESULT CALLBACK WndProc (HWND hwnd , UINT message ,
WPARAM wParam , LPARAM lParam)
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Ciclo de una Aplicacion
LRESULT CALLBACK WndProc (HWND hwnd , UINT message ,
WPARAM wParam , LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL , SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd , &ps) ;
GetClientRect (hwnd , &rect) ;
DrawText (hdc , TEXT ("Hello , Windows 98!"), -1, &rect ,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd , &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd , message , wParam , lParam) ;
}
Windows API
RonaldValenzuela
Fica
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
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
API’s
Ejemplos
Windows API
Hello World
Unicode
NotacionHungara
Ciclo deAplicacion
Proxima Clase
Laboratorio:
Nuestra primera aplicacion de windows.
Clase Lunes 24 :
Mas sobre ventanas...