Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206685
  • 博文数量: 20
  • 博客积分: 1380
  • 博客等级: 中尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-28 14:52
文章分类
文章存档

2017年(2)

2014年(3)

2013年(1)

2009年(1)

2008年(1)

2007年(12)

我的朋友

分类: C/C++

2009-03-04 14:39:08

在WINDOWS里使用ALLEGRO


      在WINDOWS里使用ALLEGRO,如果不要MFC且使用ALLEGRO封装好的API就用ALLEGRO.H,如果要使用没有封装过的API就调用 winalleg.h,但如果你要使用MFC,你可以在代用这些之前定义ALLEGRO_AND_MFC这个宏,而在这种情况下,ALLEGRO的 ASSERT()和 TRACE()由于和WINDOWS 的宏冲突所以就改为AL_ASSERT() and AL_TRACE().
     在WIN32程序中使用WINMAIN做入口点,而ALLEGRO可以让main做入口点,不过你得把在main函数之后加END_OF_MAIN() 以便让ALLEGRO知道主函数结束,如过你嫌麻烦,那么就直接写一个WINMAIN做入口点{请先包含winalleg.h},省你麻烦。但是用 main做入口点的小把戏在你直接调用未封装的API时,就会发生冲突,因为那些API只认WINMAIN();那么就请你在使用未封装的API时,使用 WINMAIN做入口,但同时要定义ALLEGRO_NO_MAGIC_MAIN这个宏。
    如果你写的是个控制台程序,那么就在调用头文件之前定义宏ALLEGRO_USE_CONSOLE ,这样的话,前面提到的用main做入口的小把戏就没用了,这个宏可以让ALLEGRO知道该怎么做。
    WIN的程序有图标,ALLEGRO默认IDI_APPLICATION作为自身图标,如果你要改变你所写的程序的图标,可以使用tools/win目录里的wfixicon这个程序创建一个名为allegro_icon的图标资源。
    DIRECT X要求你的系统支持视频位图(包括屏幕)。也就是说在你操作时,必须能锁住这些位图。这项工作将被ALLEGRO自动完成,不过吗,有时换是需要你手动操作的,所以查看acquire_bitmap()相关的内容了解更详细的知识。
    由于DirectX本身设计的特点,可能你在用WIN键或别的方法切出你的程序后,屏幕的内容以及一些视频位图(video bitmap)的内容将丢失,你可以使用set_display_switch_callback()这个API来找回你要的东西。
    在WINDOWS里,desktop_color_depth()将只能返回 8, 16, 24 和 32.那么就是说无法区分15和16位色深,这两中色深被报告出相同的结果16,
    (2003.10.31 14:14)WINDOWS的GFX_*驱动相关:
    ALLEGRO的set_gfx_mode()函数在WINDOWS下支持以下参数:
    GFX_TEXT这个参数将关闭在此之前用set_gfx_mode打开的其他图形模式。
    GFX_AUTODETECT 让ALLEGRO自己挑选一个合适的图形驱动。
    GFX_AUTODETECT_FULLSCREEN自动检测图形驱动,但只使用全屏模式的驱动,如果当前使用的操作系统不支持,就返回失败信息。
    GFX_AUTODETECT_WINDOWED同上,但只使用窗口模式的驱动。
    GFX_SAFE当你不关心当前使用的色深和分辨率是,这个特殊的图形驱动将很适合你,查看set_gfx_mode() 文档可以得到更多的介绍。
    GFX_DIRECTX是GFX_DIRECTX_ACCEL的别名。
    GFX_DIRECTX_ACCEL通用的全屏幕DirectX驱动,在硬件加速可用时使用这一参数。
    GFX_DIRECTX_SOFT是DirectX的全屏驱动,只使用软件绘制而不是调用硬件加速的特性。
    GFX_DIRECTX_SAFE是DirectX简化全屏的驱动,不支持任何硬件加速,视频和系统位图等等。
    GFX_DIRECTX_WIN 是通用的窗口模式DirectX驱动,当选用的色深不匹配WINDOWS桌面的色深时,运行在模拟色深(color conversion)模式, Color conversion不直接绘制而且不支持15-bit 和 16-bit 色深.
    这个限制是desktop_color_depth()所导致的。但它允许选择直接绘制模式, 16-bit色深设置方法:
    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)
          {
       /* 640x480 direct drawing mode not supported */
       goto Error;
       }
    }
    /* ok, we are in direct drawing mode */
    } 要注意的是,由于某些原因,驱动要求屏幕的宽度是4的倍数。 GFX_DIRECTX_OVL是DirectX overlay 驱动. 他使用特殊的硬件特性运行你的程序在窗口模式:他不能在所有硬件上通用,但在支持它的硬件上,他跑的很好,他要求你采用与屏幕相同的色深,这也是 desktop_color_depth() 造成的限制之一,以下的方法可以设置overlay 驱动,并且是16-bit色深:
    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)
             {
             /* 640x480 overlay driver not supported */
             goto Error;
             }
          }
       /* ok, the 640x480 overlay driver is running */
       }
    GFX_GDI 是窗口 GDI 驱动. 它非常慢,但可以运行在所有的硬件上,所以当你不关心你做的程序的速度,效果等诸多表现,且你希望运行在窗口模式时,这个参数将帮助你达成愿望,需要注意 的是这个驱动使用硬件鼠标指针,目的是加快默写基本的鼠标操作,比如GUI操作。参看: set_gfx_mode.
    WINDOWS的DIGI_*驱动:
    Windows 声音函数支持以下数字声卡:
    DIGI_AUTODETECT可以让Allegro自选一个声卡驱动
    DIGI_NONE代表不支持数字声音
    DIGI_DIRECTX(n)使用DirectSound设备#n (zero-based)with direct mixing
    DIGI_DIRECTAMX(n)使用DirectSound设备#n (zero-based)with Allegro mixing
    DIGI_WAVOUTID(n) - high (n=0) 或 low (n=1) quality WaveOut device
    查看: detect_digi_driver, install_sound,install_sound_input.
     MIDI_*/Windows 驱动
    Windows声卡驱动支持以下MIDI声卡:
    MIDI_AUTODETECT让 Allegro选择合适的 MIDI 声卡驱动
    MIDI_NONE - 无MIDI声音
    MIDI_WIN32MAPPER - 使用win32 MIDI mapper
    MIDI_WIN32(n) - 使用win32 设备 #n (zero-based)
    MIDI_DIGMID - sample-based software wavetable player
    以下的函数提供特殊接口让ALLEGRO可以为Win32程序工作.为了使用以下函数,你必须在其他的头文件之后包含winalleg.h.
    查看: detect_midi_driver, install_sound,install_sound_input.
    HWND win_get_window(void); 提取一个窗口句柄给 Allegro使用. 需要注意的是ALLEGRO使用underlying window 即使你不设置图形模式,除非你安装了 neutral 系统驱动(SYSTEM_NONE).
    void win_set_window(HWND wnd); 注册一个用户创建的窗口给ALLEGRO使用,这个函数在你调用 allegro_init()初始化图形库之前,或是安装自动探测系统驱动之前(SYSTEM_AUTODETECT). 这可以让ALLEGRO工作在已经存在的窗口而不是她自己创建的窗口,这样可以让你完全的控制窗口;在特殊情况下你要负责时间的处理。(Allegro 将自动控制一部分,但不对他们进行过滤). 你可以使用库里的没一个组件(graphics, mouse, keyboard, sound, timers 等待), 某些应当引起你的注意(比如 readkey() 如果键盘缓冲是空的,他将一直等待接收按键,所谓的BLOCKING就会发生)因此,在窗口线程中谨慎使用这些函数。然而在库被初始化后的非图形模式里你 是可以调用它的。这中情况下keyboard, mouse, joystick, sound 和 声音记录模块将被重新打开如果一贯用户创建的窗口被注册,传送NULL指令可以让ALLEGRO使用它自己的内建窗口。或是调用一个新的窗口句柄{如果内 建窗口已经在使用}
    void win_set_wnd_create_proc(HWND (*proc)(WNDPROC));
     在ALLEGRO创建自己的窗口时注册一个用户定义的过程给ALLEGRO使用。这个函数必须在用allegro_init()初始化库之前被调用 或是安装自动探测系统驱动(SYSTEM_AUTODETECT).它可以让你调整Allegro的窗口,不过只在创建后有效:不象 win_set_window(), 因为它让你在窗口创建之后没有窗口的控制权(好处是你不必操心事件的运行).这个注册的函数将传递一个窗口过程 (WNDPROC object) 你必须为新窗口写一个返回新窗口的句柄的函数,然后你就可以象以前一样使用ALLEGRO的所有特性。
    HDC win_get_dc(BITMAP *bmp);
    提取DirectX 的视频位图和系统位图句柄。
    void win_release_dc(BITMAP *bmp, HDC dc);
    释放你在此之前用win_get_dc()得到的位图句柄。
    GDI routines
     下面的这些GDI函数在WINDOWS的设备上下文里绘制ALLEGRO内存位图有平台针对性,当你使用他们时,你将被迫安装 neutral system driver (SYSTEM_NONE) 或是 attach Allegro to an external window with win_set_window().
    有两种方法在Windows GDI上绘制ALLEGRO内存位图. 当你使用的是静态位图{static bitmaps} (比如从datafile调用的一些图片),你可以用convert_bitmap_to_hbitmap()把他们转换成 DDB (device-dependent bitmaps即设备依赖位图) 然后用Win32的BitBlt()绘制这些图.
    当你使用的 是{dynamic bitmaps}(for example some things which react to user input),最好使用set_palette_to_hdc()和blit_to_hdc()函数,他们使用 DIB (device-independent bitmaps即非设备依赖位图).
    当然,也有把设备上下文里的位图BLIT到Allegro BITMAP的方法,这样的话,你就可以做打印屏幕位图等类似的事.
     所有的绘图和转换函数是用当前调色版作为颜色转换表。你可以使用 set_palette_to_hdc() 或select_palette() 函数来变换这个表. 警告: 当 GDI系统调色版被改变以后, (比如被另一个程序修改) 当前的 Allegro 不会跟着更新。使用这些函数,你必须在ALLEGRO头文件之后包含winalleg.h
    void set_gdi_color_format(void);
    告诉Allegro让truecolor images使用GDI color层.这是可选项,但着可以让图形转换更快的完成。如果你打算用这个,你必须在初始化Allegro之后创建任何图形之前使用它.
    void set_palette_to_hdc(HDC dc, PALETTE pal);
    在特殊设备上下文里选择一个Allegro调色板.
    HPALETTE convert_palette_to_hpalette(PALETTE pal);
    将Allegro调色板转换成Windows调色板并返回一个句柄,在你不需要他的时候,你应该调用DeleteObject().
    查看: convert_hpalette_to_palette.
    void convert_hpalette_to_palette(HPALETTE hpal, PALETTE pal);
    转换一个Windows调色板成为Allegro调色板. 查看: convert_palette_to_hpalette.
    HBITMAP convert_bitmap_to_hbitmap(BITMAP *bitmap);
    把Allegro内存位图转换成Windows DDB并返回一个句柄. 这个位图使用自己的内存,所以你可以把原位图销毁而不会影响到转换成的那个。当你不再用它时,请调用DeleteObject().
    查看: convert_hbitmap_to_bitmap.
    BITMAP *convert_hbitmap_to_bitmap(HBITMAP bitmap);
    从Windows DDB创建一个Allegro 内存位图。
    查看: convert_bitmap_to_hbitmap.
    void draw_to_hdc(HDC dc, BITMAP *bitmap, int x, int y);
    把整个 Allegro位图绘制到Windows设备上下文,使用与draw_sprite()函数一样的参数.
    查看: blit_to_hdc, stretch_blit_to_hdc, draw_sprite.
    void blit_to_hdc(BITMAP *bitmap, HDC dc, int sx, sy, dx, dy, w, h);
    把一个Allegro内存位图BLIT到Windows设备上下文,使用与blit() 函数相同的参数.
    : 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);
    把 Allegro内存位图BLIT到Windows设备上下文,使用与stretch_blit()函数相同的参数.
    查看: 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);
    把Windows设备上下文BLIT到Allegro内存位图,使用与blit() 函数相同的参数. 详情参看 stretch_blit_from_hdc() .
    查看: 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);
     把Windows设备上下文BLIT到Allegro内存位图,使用与stretch_blit()函数相同的参数. 它使用当前的 Allegro调色板转换到目的调色板,不考虑当前的 DC调色板 .所以如果你blitting from 8-bit模式,你应该先用set_palette_to_hdc()函数设置DC调色板.
    查看: blit_from_hdc, stretch_blit_to_hdc, stretch_blit.

  翻译作者:vrix.ipona

阅读(2461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~