i=_lread(hfile,&filehead,sizeof(bitmapfileheader));
if(i==hfile_error) falsereturn;//goto bmp_false_end;
// type=filehead.bftype;
//读取信息头
i=sizeof(bitmapinfoheader)+sizeof(rgbquad)*256;
_lread(hfile,lpinfohead,i);
//建立调色板
if(!sty)createpal(lpinfo);
ubytes=_llseek(hfile,0,2);
if ((filehead.bfsize)>ubytes) falsereturn;//goto bmp_false_end;
if(hdata)globalfree(hdata);
size=ubytes_filehead.bfoffbits;
hdata=globalalloc(gmem_fixed,size);
bmpdata * data=(bmpdata*)globallock(hdata);
//读取数据
_llseek(hfile,filehead.bfoffbits,0);
for(;_lread(hfile,data,rblock)==rblock;data+=rblock);
globalunlock(hdata);
_lclose(hfile);
return true;
}
在mybmp.h文件中为了构造bmp框架,我们定义了三个类:class palette、
class dibpalette 、class mydib 。其中palette是基类。dibpalette继承了类palette,而类mydib又继承了类dibpalette。
- class palette:
在此类中,我们定义了两个成员变量hpal和holdpal、七个成员函数。这七个成员函数功能如下:其中两个分别是构造函数和析构函数,两个函数createpal
(bitmapinfo*)、createpal(lplogpalette )根据指定参数完成构造调色板的作用,一个函数setpal(hdc)实现调色板,一个函数resetpal(hdc)恢复调色板,一个函数getpal()获得调色板。
- class mydib:
在此类中,我们定义了两个核心成员变量p和hdata,其中p是一个自定义结构,它包含一个bmpinfo 头信息和一个调色板,hdata是指向内存中一块数据的句柄,另外两个参数lpinfo和lpinfohead实际上是指向结构p的指针。四个成员函数 show()的内核是api函数setdibitstodevice()。它们的功能是根据结构p和句柄hdata把图像显示到屏幕上。
- class bmp:
在此类中,我们只定义了两个成员函数open,它们的功能是打开一个bmp文件,并将文件内容填入其基类的参数中。前面我们提到过在多媒体编程中需要用公共调色板,但有时也需要用私有调色板,因此在open函数中第二个参数指定了这个区别,若参数为0则构造自己的hpal,否则自己的hpal无效。
实例分析
在这个实例中,我们将调入一个bmp文件,并把它显示到屏幕上,程序过程如下: