我想把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上试过。
试玩下载