做了个WINBGI图形小库
我想把GDI的东西包装成BGI,记得吗,就是TC2里的图形库。昨天一起来就开始写,干到半夜终于完成了。可以这样画图,很简单的:
#include "winbgi.h"
int main(void)
{
bgi_init ("game", 400, 400); /*初始化窗口的标题,宽和高*/
outtextxy (100, 100, "你好");
circle (100, 100, 50);
bgi_swapbuffer (); /*从内存交换到屏幕*/
bgi_kill ();
return 0;
}
int main(void)
{
bgi_init ("game", 400, 400); /*初始化窗口的标题,宽和高*/
outtextxy (100, 100, "你好");
circle (100, 100, 50);
bgi_swapbuffer (); /*从内存交换到屏幕*/
bgi_kill ();
return 0;
}
除了bgi_swapbuffer和用bgi_init,bgi_kill代替initgraphics之外,其他函数跟tc2 bgi的完全相同。钟情于BGI绘图的同学可以拿来玩玩,可以看作是windows版的仿真。
一开始最难的是用标准的main包装WinMain,我就看看glut里面如何做到这点。原来很简单,只不过是把winmain的东西抽出来而已,特殊的是hInstance是通过GetModuleHandle (NULL)获得的,调用win api需要加连接参数-mwindows。
然后又发现一个问题,如果每个图形都是直接画到屏幕上的话,那出现WM_PAINT消息的时候屏幕的东西就会被擦掉。这才明白ogl里为什么要用swapbuffers了,于是就查swapbuffers的实现,结果到现在都没有找到。但思路是清楚的,就是先全部画到内存再blit到屏幕。终于不负有心人:
_gdc = GetDC (hwnd);
SetBkMode (_gdc, TRANSPARENT);
_mdc = CreateCompatibleDC (_gdc);
_hbm = CreateCompatibleBitmap (_gdc, _winwidth, _winheight); /* 原来需要这两句 */
SelectObject (_mdc, _hbm);
BitBlt (_mdc, 0, 0, rc.right, rc.bottom, _gdc, 0, 0, SRCCOPY);
但是因为窗口在初始化的时候会发WM_PAINT,就不用写bgi_swapbuffer了。SetBkMode (_gdc, TRANSPARENT);
_mdc = CreateCompatibleDC (_gdc);
_hbm = CreateCompatibleBitmap (_gdc, _winwidth, _winheight); /* 原来需要这两句 */
SelectObject (_mdc, _hbm);
BitBlt (_mdc, 0, 0, rc.right, rc.bottom, _gdc, 0, 0, SRCCOPY);
对了,我只在devcpp上试过。
试玩下载