树上小屋

这是一个将艺术和工程融为一体的活计.

导航

做了个WINBGI图形小库

我想把GDI的东西包装成BGI,记得吗,就是TC2里的图形库。昨天一起来就开始写,干到半夜终于完成了。可以这样画图,很简单的:

#include "winbgi.h"

int main(void)
{
  bgi_init (
"game"400400); /*初始化窗口的标题,宽和高*/
  outtextxy (
100100"你好");
  circle (
10010050);
  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, 
00, rc.right, rc.bottom, _gdc, 00, SRCCOPY);
但是因为窗口在初始化的时候会发WM_PAINT,就不用写bgi_swapbuffer了。

对了,我只在devcpp上试过。
试玩下载 

posted on 2006-09-11 11:51  euclid  阅读(1510)  评论(6编辑  收藏  举报