34 Detalles espec�ficos de Windows

Un programa para Windows que use Allegro s�lo tiene que inclu�r uno o m�s ficheros del �rbol include/allegro, o allegro.h; no obstante, si tambi�n necesita llamar directamente a funciones no portables del API Win32, deber� inclu�r el fichero de cabecera espec�fico de Windows winalleg.h justo tras allegro.h, y antes de cualquier otro fichero de cabecera del API Win32. Por defecto winalleg.h incluye el fichero de cabecera principal windows.h del API Win32. Si por el contrario desea usar la interfaz C++ del API Win32 (es decir, las Microsoft Foundation Classes), defina el s�mbolo de preprocesador ALLEGRO_AND_MFC antes de inclu�r cualquier fichero de cabecera de Allegro para que afxwin.h sea inclu�do. Tenga en cuenta que en este �ltimo caso, las macros de depuraci�n ASSERT() y TRACE() ser�n renombradas a AL_ASSERT() y AL_TRACE() respectivamente.

Las aplicaciones GUI de Windows empiezan con un punto de entrada WinMain(), en vez del punto de entrada est�ndar main(). Allegro est� configurado para crear aplicaciones GUI por defecto y hacer unos trucos de magia para que la funci�n regular main() funcione sin problemas, pero para esto necesita que escriba END_OF_MAIN() justo tras su funci�n main(). Si no quiere hacer esto, puede inclu�r winalleg.h y escribir una funci�n WinMain(). Note que estos trucos de magia pueden tener conflictos con algunos programas que hagan llamadas directas al API Win32; para estos programas, es imprescindible la funci�n WinMain() y que los trucos de magia sean desactivados definiendo el s�mbolo de preprocesador ALLEGRO_NO_MAGIC_MAIN antes de inclu�r los ficheros de cabecera de Allegro.

Si quiere crear una aplicaci�n de consola con Allegro, debe definir el s�mbolo de preprocesador USE_CONSOLE antes de incluir los ficheros de cabecera de Allegro; esto indicar� a la librer�a que use caracter�sticas del modo consola y que desactive el procesado especial de la funci�n main() descrito arriba.

Cuando crea la ventana principal, Allegro busca en el ejecutable un recurso de icono nombrado "allegro_icon". Si est� presente, Allegro lo cargar� y usar� autom�ticamente como icono de aplicaci�n. En caso contrario, Allegro usar� el icono por defecto IDI_APPLICATION.

DirectX requiere que los bitmaps de v�deo y sistema est�n bloqueados en memoria (locked) antes de que pueda dibujar en ellos. Esto se har� autom�ticamente, pero podr� conseguir habitualmente una ejecuc�on m�s �ptima haci�ndolo usted mismo: mire la funci�n acquire_bitmap() para m�s detalles.

Debido a un gran descuido en el dise�o de DirectX, no hay manera de preservar los contenidos de la memoria de v�deo cuando el usuario cambia a otra ventana desde su programa. Necesita estar preparado para el hecho de que el contenido de su pantalla, y el contenido de cualquier bitmap en memoria de v�deo, puede ser destruido en cualquier momento. Puede usar la funci�n set_display_switch_callback() para arregl�rselas cuando ocurra esto.

En la plataforma Windows, los �nicos valores de retorno de desktop_color_depth() son 8, 16, 24 y 32. Esto significa que no puede diferenciar escritorios de 15 o 16 bits, dado que ambos se muestran como escritorios de 16 bits. Lea abajo las consecuencias que tiene esto para los drivers en ventana y modos overlay.


Drivers: GFX_*/Windows
La biblioteca para Windows soporta los siguientes par�metros de tarjeta para la funci�n set_gfx_mode():

Relacionado con: set_gfx_mode.
Drivers: DIGI_*/Windows
Las funciones de sonido para Windows soportan las siguientes tarjetas de sonido digitales:
      DIGI_AUTODETECT      - Allegro elige un controlador de sonido digital.
      DIGI_NONE            - sin sonido digital.
      DIGI_DIRECTX(n)      - usa el dispositivo DirectSound #n (siendo 'n'
                             mayor o igual que cero) con mezclado directo
      DIGI_DIRECTAMX(n)    - usa el dispositivo DirectSound #n (siendo 'n'
                             mayor o igual que cero) con el mezclador de
                             Allegro
      DIGI_WAVOUTID(n)     - alta (n=0) o baja (n=1) calidad del dispositivo
                             WaveOut
Relacionado con: detect_digi_driver, install_sound, install_sound_input.
Drivers: MIDI_*/Windows
Las funciones de sonido de Windows soportan las siguientes tarjetas de sonido MIDI:
      MIDI_AUTODETECT      - Allegro escoge un controlador de sonido MIDI.
      MIDI_NONE            - sin sonido MIDI
      MIDI_WIN32MAPPER     - usa el mapeador MIDI win32
      MIDI_WIN32(n)        - usa el dispositivo win32 #n (siendo 'n' mayor o
                             igual que cero)
      MIDI_DIGMID          - reproductor wavetable basado en samples

Las siguientes funciones proveen una interfaz espec�fica de la plataforma para integrar Allegro sin problemas con cualquier programa Win32 de prop�sito general. Para usar estas rutinas, debe incluir winalleg.h tras otros ficheros de cabecera de Allegro.

Relacionado con: detect_midi_driver, install_sound, install_sound_input.
HWND win_get_window(void);
Recupera el handle de la ventana usada por Allegro. Note que Allegro usa una ventana incluso si no ha activado ning�n modo gr�fico, a no ser que haya instalado el driver de sistema neutral (SYSTEM_NONE).


void win_set_window(HWND wnd);
Hace que Allegro use una ventana creada por el usuario. Esta funci�n debe ser llamada *antes* de iniciar la librer�a con allegro_init() o instalando el driver de sistema con autodetecci�n (SYSTEM_AUTODETECT). Le permite enganchar Allegro a una ventana ya existente y evita que la librer�a cr�e la suya, dej�ndole el control total de la ventana; en particular, usted ser� responsable de manejar los eventos como siempre (Allegro monitorizar� autom�ticamente algunos de ellos, pero no los filtrar�). Puede usar cualquier componente de la librer�a (rat�n, teclado, sonido, temporizaci�n, etc) excepto el subsistema gr�fico.


void win_set_wnd_create_proc(HWND (*proc)(WNDPROC));
Hace que Allegro use una funci�n definida por el usuario para crear su ventana. Esta funci�n debe ser llamada *antes* de iniciar la librer�a con allegro_init() o instalando el driver de sistema con autodetecci�n (SYSTEM_AUTODETECT). Le permite personalizar la ventana de Allegro pero s�lo en su creaci�n: a diferencia de win_set_window(), no tendr� control sobre la ventana una vez sea creada (en particular, no ser� responsable de procesar los eventos). A la funci�n registrada se le pasar� un procedimiento de ventana (objeto WNDPROC) que debe hacer el procedimiento de la nueva ventana y debe devolver el hadle a la nueva ventana. Puede usar la librer�a sin restricciones de la forma habitual.


HDC win_get_dc(BITMAP *bmp);
Recupera el handle del dispositivo de contexto del v�deo DirectX o un bitmap de sistema.


void win_release_dc(BITMAP *bmp, HDC dc);
Libera el handle del dispositivo de contexto del bitmap que fue previamente recuperado por win_get_dc().


Rutinas GDI

Estas rutinas GDI son algo muy espec�fico de la plataforma, para permitir dibujar mapas de bits en memoria de Allegro sobre un contexto de un dispositivo de Windows. Cuando usted quiera usarlas, necesitar� instalar el driver de sistema neutral (SYSTEM_NONE) si llama a install_allegro() o enganchar Allegro a una ventana externa con win_set_window() si llama a allegro_init().

Existen dos formas de dibujar sus mapas de bits de Allegro sobre la GDI de Windows. Cuando usted est� usando mapas de bits est�ticos (por ejemplo unos pocos dibujos cargados de un archivo de datos), usted puede convertirlos a DDB (bitmaps dependientes del dispositivo) con convert_bitmap_to_hbitmap() y luego usar simplemente el BitBlt() de Win32 para dibujarlos.

Cuando usted usa mapas de bits din�micos (por ejemplo elementos que reaccionan seg�n la entrada del usuario), es mejor usar las funciones set_pallette_to_hdc y blit_to_hdc(), que funcionan con DIB (mapas de bits independientes del dispositivo).

Existen adem�s funciones para hacer blit desde un contexto de dispositivo en un BITMAP de Allegro, as� que usted puede realizar cosas como captura la pantalla.

Todas las funciones de dibujo y conversi�n usan la paleta actual como una tabla de conversi�n de colores. Usted puede alterar la paleta actual con las funciones set_palette_to_hdc() o select_palette(). Advertencia: cuando la paleta de colores del sistema es cambiada expl�citamente, (por ejemplo, por otra aplicaci�n) �la paleta actual de Allegro no es actualizada con ello!

Para usar estas rutinas debe incluir winalleg.h tras los dem�s ficheros de cabecera de Allegro.


void set_gdi_color_format(void);
Le dice a Allegro que use el mapa de colores del GDI para im�genes de color verdadero. Esto es opcional, pero har� que las conversiones funcionen m�s r�pido. Si usted va a llamar a �sta funci�n, deber�a hacerlo despu�s de iniciar Allegro y �ntes de crear gr�ficos.


void set_palette_to_hdc(HDC dc, PALETTE pal);
Selecciona y realiza una paleta de Allegro sobre el contexto de dispositivo espec�fico.


HPALETTE convert_palette_to_hpalette(PALETTE pal);
Convierte una paleta de Allegro a una paleta de Windows y devuelve su manejador. Usted deber�a llamar a DeleteObject() cuando no la necesite m�s.

Relacionado con: convert_hpalette_to_palette.
void convert_hpalette_to_palette(HPALETTE hpal, PALETTE pal);
Convierte una paleta de Windows en una paleta de Allegro.
Relacionado con: convert_palette_to_hpalette.
HBITMAP convert_bitmap_to_hbitmap(BITMAP *bitmap);
Convierte un mapa de bits de memoria en un DDB de Windows y devuelve su manejador. Este mapa de bits usa su propia memoria, as� que puede destruir el original sin afectar al convertido. Usted deber�a llamar DeleteObject() cuando no necesite m�s este mapa de bits.
Relacionado con: convert_hbitmap_to_bitmap.
BITMAP *convert_hbitmap_to_bitmap(HBITMAP bitmap);
Crea un bitmap de Allegro en memoria desde un DDB de Windows.
Relacionado con: convert_bitmap_to_hbitmap.
void draw_to_hdc(HDC dc, BITMAP *bitmap, int x, int y);
Dibuja todo un bitmap de Allegro en un contexto de dispositivo de Windows, usando los mismos par�metros que la funci�n draw_sprite().
Relacionado con: blit_to_hdc, stretch_blit_to_hdc, draw_sprite.
void blit_to_hdc(BITMAP *bitmap, HDC dc, int sx, sy, dx, dy, w, h);
Realiza un blit de un mapa de bits de Allegro a un contexto de dispositivo de Windows, usando los mismos par�metros que la funci�n blit().
Relacionado con: draw_to_hdc, stretch_blit_to_hdc, blit_from_hdc, blit.
void stretch_blit_to_hdc(BITMAP *bitmap, HDC dc, int sx, sy, sw, sh, int dx, dy, dw, dh);
Realiza un blit de un mapa de bits de Allegro a un contexto de dispositivo de Windows, usando los mismos par�metros que la funci�n stretch_blit().
Relacionado con: draw_to_hdc, blit_to_hdc, stretch_blit_from_hdc, stretch_blit.
void blit_from_hdc(HDC hdc, BITMAP *bitmap, int sx, sy, dx, dy, w, h);
Realiza un blit de un mapa de bits de Allegro a un contexto de dispositivo de Windows, usando los mismos par�metros que la funci�n blit(). Vea stretch_blit_from_hdc() para m�s detalles.
Relacionado con: stretch_blit_from_hdc, blit_to_hdc, blit.
void stretch_blit_from_hdc(HDC hcd, BITMAP *bitmap, int sx, sy, sw, sh, int dx, dy, dw, dh);
Realiza un blit de un mapa de bits de Allegro a un contexto de dispositivo de Windows, usando los mismos par�metros que la funci�n stretch_blit(). Usa la paleta actual de Allegro y realiza una conversi�n a �sta paleta, sin importar la paleta DC actual. As� que si usted est� realizando un blit desde el modo de 8 bits, deber�a primero actualizar la paleta DC con la funci�n set_palette_to_hdc().
Relacionado con: blit_from_hdc, stretch_blit_to_hdc, stretch_blit.

Volver al Indice