PROGRAMACIÓN MULTIMEDIA PROGRAMACIÓN EN WINDOWS
Aportaciones de la programación en Windows Compilación de un programa Windows Estructura de un programa Windows Mensajes Ejemplos de mensajes 2
Aportaciones de la programación en Windows Diseño de interfaces Transparencia Multitarea 3
Compilación de un programa Windows - Diferencia los recursos (menús, iconos, diálogos, bitmaps) del código. - Archivos implicados: *.rc, *.ico -> *.res *.c, *.h -> *.obj *.obj, *.res, *.def -> *.exe 4
Compilación de un programa Windows (2) /* generic.h*/ #define IDM_DOIT 1 #define IDM_QUIT 2 int ghinstance; char gszappname[] = generic ; long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG); 5
Compilación de un programa Windows (3) Archivos RC: /*generic.rc */ #include <windows.h> #include generic.h generic ICON generic.ico generic MENU BEGIN END MENUITEM &Do It! MENUITEM &Quit, IDM_DOIT IDM_QUIT 6
Compilación de un programa Windows (y 4) Archivos DEF: NAME GENERIC DESCRIPTION generic windows program EXETYPE WINDOWS STUB WINSTUB.EXE CODE PRELOAD MOVEABLE DATA PRELOAD MOVEABLE MULTIPLE HEAPSIZE 1024 STACKSIZE 5120 EXPORTS WndProc 7
Estructura de un programa Windows La mayoría de los programas en Windows tienen dos funciones comunes: - Winmain() - WndProc() 8
Estructura de un programa Windows (2) WinMain() - Es el punto de entrada y salida del programa. - Se encarga del aspecto de la ventana principal. - Contiene el bucle de mensajes. 9
Estructura de un programa Windows (3) WndProc() - Se la conoce como función de procesado de mensajes. - En ella se escribe el código del programa. 10
Estructura de un programa Windows (4) #include <windows.h> long FAR PASCAL WndFunction (HWND, WORD, WORD, LONG); int PASCAL WinMain (HANDLE hinstance, HANDLE hprevinstance, LPSTR lpcmdline, int ncmdshow) { static char szappname[]= "GENERIC", sztitlebar[]= "Title Bar"; HWND hwnd; WNDCLASS wndclass; MSG msg; 11
Estructura de un programa Windows (5) if (! hprevinstance) { wndclass.style = CS_HREDRAW CS_VREDRAW; wndclass.lpfnwndproc = WndFunction; wndclass.cbclsextra = 0; wndclass.cbwndextra = 0; wndclass.hinstance = hinstance; wndclass.hicon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hcursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrbackground= GetStockObject (WHITE_BRUSH); wndclass.lpszmenuname = NULL; wndclass.lpszclassname= szappname; } RegisterClass (&wndclass); 12
Estructura de un programa Windows (6) hwnd= CreateWindow (szappname, sztitlebar, WS_OVERLAPPEDWINDOW, 0, /* x position for this window */ 0, /* y position for this window */ 320, /* window width is 320 dots */ 240, /* window height is 240 dots */ NULL, NULL, hinstance, NULL); ShowWindow (hwnd, ncmdshow); UpdateWindow (hwnd); 13
Estructura de un programa Windows (7) while (TRUE == GetMessage (&Message,0,0,0)) { } TranslateMessage (&Message); DispatchMessage (&Message); } 14
Estructura de un programa Windows (8) long FAR PASCAL WndFunction (HWND hwnd, WORD wmsg, WORD wparam, LONG lparam) { HDC PAINTSTRUCT RECT hdc; ps; rect; 15
Estructura de un programa Windows (y 9) switch (wmsg) { case WM_PAINT: hdc= BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); DrawText (hdc, "Application Window", -1, &rect, DT_SINGLELINE DT_CENTER EndPaint (hwnd, &ps); return (0); break; DT_VCENTER); case WM_DESTROY: PostQuitMessage (0); return (0); break; } default: return (DefWindowProc (hwnd, wmsg, wparam, lparam)); } 16
Interrupciones Hardware Mensajes Cola de mensajes GetMessage() TranslateMessage() DispatchMessage() Bucle de mensajes Hook() WndProc() Lógica y acciones del programa DefWindowProc() Procesado de mensajes por defecto 17
Hardware Mensajes (2) Cola de mensajes Bucle de mensajes PostMessage() TransMessage Otras aplicaciones. PostMessage() Otras aplicaciones. SendMessage() WndProc() DispatchMessage() SendMessage() 18
/* Estructura mensaje*/ typedef struct tagmsg { HWND hwnd; WORD message; WORD wparam; LONG lparam; DWORD time; POINT pt; } MSG; Mensajes (3) typedef MSG typedef MSG NEAR typedef MSG FAR *PMSG *NPMSG *LPMSG 19
Mensajes (y 4) Funciones para controlar la prioridad de las aplicaciones: - GetMessage() - PeekMessage() - WaitMessage() 20
Ejemplos de Mensajes BM_ : Mensaje de botón. BM_GETCHECK BM_SETCHECK 21
Ejemplos de Mensajes (2) CB_: Mensaje de Combo Box CB_ADDSTRING CB_FINDSTRING CB_FINDSTRINGEXACT CB_GETCURSEL CB_GETLBTEXT CB_GETLBTEXTLENGTH CB_SELECTSTRING 22
Ejemplos de Mensajes (3) EM_: Mensaje de caja de texto EM_LIMITTEXT LB_: Mensaje de List Box LB_ADDSTRING LB_GETCURSEL LB_GETTEXT LB_GETTEXTLEN LB_INSERTSTRING 23
Ejemplos de Mensajes (4) SBM_: Mensaje de Scroll Box SBM_GETPOS SBM_GETRANGE SBM_GETSCROLLINFO SBM_SETPOS SBM_SETRANGE SBM_SETSCROLLINFO 24
Ejemplos de Mensajes (5) WM_: Todos los demás mensajes WM_CHAR WM_KEYDOWN WM_KEYUP WM_CREATE WM_DEADCHAR WM_GETMINMAXINFO WM_GETTEXT WM_GETTEXTLENGTH WM_INITDIALOG WM_DESTROY 25
Ejemplos de Mensajes (6) WM_: Todos los demás mensajes WM_PAINT WM_QUIT WM_HSCROLL WM_VSCROLL WM_SETTEXT WM_TIMER 26
Ejemplos de Mensajes (7) Definición: Mensaje WM_PAINT Una aplicación envia un mensaje WM_PAINT cuando Windows u otra aplicación hace una petición para pintar una porción de la ventana de la aplicación. El mensaje es enviado cuando las funciones UpdateWindow o RedrawWindow son llamadas o por la función DispatchMessage cuando la aplicación obtiene un mensaje WM_PAINT tras el uso de las funciones GetMessage o PeekMessage. 27
Descripción: Ejemplos de Mensajes (8) Este mensaje no tiene parámetros. Valor de retorno: Una aplicación debe retornar con cero si procesa este mensaje. 28
Ejemplos de Mensajes (y 9) Acción por defecto: La función DefWindowProc valida la región a actualizar. La función también enviará un mensaje WM_NCPAINT al procedimiento de ventana si el marco de la ventana ha de ser pintado y envía un mensaje WM_ERASEBKGND si el fondo de la ventana debe ser borrado. 29
PROGRAMACIÓN MULTIMEDIA PROGRAMACIÓN EN WINDOWS