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