连连看游戏 以及 (读取并显示位图),(截屏)头文件
BITBLT.H: 这是我今晚写的一个头文件。它可以读取24bpp的BMP后缀的位图。
注意,仅针对24bpp,BMP格式,不能读取其他格式图像。
然后调用里面的BitBlt函数可以把位图显示在屏幕指定位置。
显示时,采用了颜色空间距离拟合为VGA模式下的16色。
还可以获取和设置位图指定坐标的颜色。具体方法可以查看该文件的代码。
具体用法参考BitBltDemo.c中的代码。
这个头文件可以放到TC的INCLUDE文件夹中。以后只要像引用其他头文件那样引用它即可。
在这个头文件里我模仿了一些微软的做法,例如以句柄实现数据结构的封装等。
CPYSCR.H
我从前写的一个头文件。用于在TC的绘图模式下截图屏幕,并保存到BMP文件。
同样,可以放在TC的INCLUDE文件夹中。
BitBltDemo.c
这是BITBLT.h头文件的使用范例。注意,代码中使用的是图片的绝对路径,因此
运行前需要把附件所带的CELLS.bmp的绝对路径设置正确。否则会出现加载位图失败。
lian_jfd.c
我写的一个连连看游戏。采用了CELLS.bmp文件作为图片资源。该文件的核心算法讲解略。
编译前请把文件结尾的main函数中的图片和驱动文件所在的路径设置正确即可。
VGA模式下的截图.BMP
使用CPYSCR.H在VGA模式下,对初始化后的连连看游戏进行的截图。(还未绘制进度条)
具体文件请参考附件的压缩包。
---------------------------------------------------
在BitBlt.h中的一些重要函数:
---------------------------------------------------
/*读取一个问题,返回位图句柄,如果失败,返回NULL*/
HBITMAP LoadBitmap(char *filename);
/*释放位图对象占用的内存*/
bool DeleteBitmap(HBITMAP hBitmap);
/*把图片贴到屏幕上!指定屏幕上的目标矩形 和 位图上的起始点*/
bool BitBlt(HBITMAP hBitmap, int nXDest, int nYDest, int nWidth, int nHeight, int nXSrc, int nYSrc);
/* 获取位图尺寸 */
void GetBitmapSize(HBITMAP hBitmap, BMSIZE* sz)
/* 获取某点的color值,返回0xff表示失败 */
BYTE GetPixel(HBITMAP hBitmap, int nXPos, int nYPos);
/* 设置某点颜色值,返回是否设置成功 */
bool SetPixel(HBITMAP hBitmap, int nXPos, int nYPos, BYTE color);
-------------------------------------------------------------
在cpyscr.h中,有以下重要函数:
-------------------------------------------------------------
/* 指定在VGA模式下的屏幕左上角和右下角坐标,把该矩形区域截屏并保存到给定的filename文件*/
/* 被保存的文件格式是bpp=4的BMP位图。如有其他需求可以在Photoshop中做进一步处理。*/
void CopyScreen(char* filename,int left,int top,int right,int bottom);
-------------------------------------------------------------
以上文件的具体代码,限于篇幅,不在这里贴出了,请下载附件进行查看。
请注意:本压缩包的文件全部使用TC2.0编译的。请不要使用VC去编译。
------------------------------------------------------------------
(1)补充了一个节省内存的版本:bitblt2.h。它加载图片时的像素上限建议数量为80000像素。
(2)修正了GetNearestColor函数中的一个逻辑错误。(重要修正)
[[it] 本帖最后由 hoodlum1980 于 2008-9-11 12:37 编辑 [/it]]