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():
if (desktop_color_depth() == 16) { set_color_depth(16); if (set_gfx_mode(GFX_DIRECTX_WIN, 640, 480, 0, 0) != 0) { set_color_depth(15); if (set_gfx_mode(GFX_DIRECTX_WIN, 640, 480, 0, 0) != 0) { /* modo dibujado directo en 640x480 no soportado */ goto Error; } } /* ok, estamos en un modo de dibujado directo */ }
if (desktop_color_depth() == 16) { set_color_depth(16); if (set_gfx_mode(GFX_DIRECTX_OVL, 640, 480, 0, 0) != 0) { set_color_depth(15); if (set_gfx_mode(GFX_DIRECTX_OVL, 640, 480, 0, 0) != 0) { /* driver overlay en 640x480 no soportado */ goto Error; } } /* ok, estamos en modo overlay a 640x480 */ }
Relacionado con: set_gfx_mode.Drivers: DIGI_*/Windows
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
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);
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().
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);
Relacionado con: convert_palette_to_hpalette.HBITMAP convert_bitmap_to_hbitmap(BITMAP *bitmap);
Relacionado con: convert_hbitmap_to_bitmap.BITMAP *convert_hbitmap_to_bitmap(HBITMAP bitmap);
Relacionado con: convert_bitmap_to_hbitmap.void draw_to_hdc(HDC dc, BITMAP *bitmap, int x, int y);
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);
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);
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);
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);
Relacionado con: blit_from_hdc, stretch_blit_to_hdc, stretch_blit.