VC编程心得Word文档格式.docx
《VC编程心得Word文档格式.docx》由会员分享,可在线阅读,更多相关《VC编程心得Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
LONGbiHeight;
//位图以像素为单位的高
WORDbiPlanes;
//目标设备的平面数,必须为1
WORDbiBitCount;
//每一个色平面像素位数1、4
DWORDbiCompression;
//压缩类型BI_RGB,BI_REL4
DWORDbiSizeImage;
//图象以字节为单位的尺寸
LONGbiXPelsPerMeter;
//x方向的分辨率dpm
LONGbiYPelsPerMeter;
//y方向的分辨率dpm
DWORDbiClrUsed;
//实际使用色彩数
DWORDbiClrImportant;
//重要色彩数
}BITMAPINFOHEADER
24位真彩色图象存储格式
24位真彩色图象格式在16位编辑器(例如VC编辑器)中打开,可以看到图象的二进制数据。
24位真彩色的二进制数据为:
包括位图文件头、位图信息头和位图阵列三部分。
1、位图文件头
位图文件头用来记录文件大小的一些信息,在文件中占14个字节,存储的内容如下:
字节1234567891011121314
000000424DCCB402000000000036000000
其中:
424D为位图的标志,即ASCII码BM
CCB402表示位图文件的总字节数,换算成十进制为(CCB402)H=(177356)10,即这副图象的大小为177356字节。
00000000为保留字节,用来存储文件大小的数据;
3600000000表示位图阵列的起始位置,(36)H=(54)10即54字节开始为位图阵列。
2、位图信息头
位图信息头记录和位图相关的一些信息,在文件中占40个字节,存储的内容为:
字节12345678910111213141516
0000002800
00001600002C010000C5000000010018000000
000032000000000000120B0000120B00000000
000048000000000000
28000000表示信息头的长度,(28)H=(40)10,即信息头占40个字节;
2C010000表示位图宽度,单位为像素。
(012C)H=(300)10,即位图的宽度为300个像素。
C5000000表示位图高度,单位为像素。
(C5)H=(197)10,即位图的高度为197个像素。
0100表示位图设备级别
1800位图级别,(0018)H=(24)10,即24位真彩色;
00000000表示压缩类型,为零表示不压缩;
00000000保留字节;
120B0000表示水平分辨率
120B0000表示垂直分辨率
00000000表示位图实际使用的颜色表中的颜色变址数
00000000表示位图显示过程中被认为重要颜色变址数。
3、位图阵列
位图阵列,即像素表示部分,每个像素点由3个字节的数据组成,按照从左到右的顺序,分别表示蓝色、绿色、红色。
在VC++中的WINGDI.h中对于位图的编码和格式有更加详细的定义,下面给出24位真彩色位图格式在VC++中的定义。
TypedefstructtagBITMAPFILEHEADER{//位图文件头
WORDbfType;
//位图标志:
BM
DWORDbfSize;
//位图文件总字节数
WORDbfReseaved1;
WORDbfReseaved2;
DWORDbfOffBits;
}BITMAPFILEHEADER;
TypedefstructtagBITMAPINFOHEADER{//位图信息头格式定义
DWORDbiSize;
//位图信息头占用字节数
LONGbiWidth;
//位图图象宽度(以像素为单位)
LONGbiHeight;
//位图图象高度(以像素为单位)
WORDbiplanes;
//位图设备级别
WORDbiBitCount;
//位图级别设定,每个像素所需要的位数,必须是1(双色),
//4(16色),8(256色)或24(真彩色)之一
DWORDbiCompression;
//压缩类型
DWORDbiSizeImage;
//位图阵列表字节数
LONGbiXPelsPerMeter;
//水平分辨率
LONGbiYPelsPerMeter;
//垂直分辨率
DWORDbiClrUsed;
//位图实际使用的颜色表中的颜色变址数
DWORDbiClrImportant;
//位图显示过程中被认为重要颜色变址数
}BITMAPINFOHEADER;
TypedefstructtagRGBTRIPLE{//位图阵列格式定义
BYTErgbBlue;
//定义蓝色
BYTErgbGreen;
//定义绿色
BYTErgbRed;
//定义红色
}RGBTRIPLE;
//构成一个3字节的RGBTRIPLE
灰度位图存储格式
typedefstructtagBITMAPINFO{//bmi
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];
}BITMAPINFO;
灰度位图比24位真彩色位图增加了一部分:
颜色索引表(RGBQUAD)。
因此,灰度位图的像素阵列的起始位置不是第(36)H=(54)10个字节,而是第(436)H=(1078)10个字节,同时灰度位图用一个字节表示一个像素。
这样,灰度位图的像素阵列小了三分之二。
颜色索引表定义为:
typedefstructtagRGBQUAD
BYTEred;
BYTEgreen;
BYTEblue;
BYTEnull;
}tagRGBQUAD;
在实际的编程中,读取数据的方式发生了变化,除了要读取文件头,文件信息头外,还要设置变量读取颜色索引表。
除此以外,灰度图象的编程读取显示方式与24位真彩色位图的方式完全相同。
7字符格式:
.f符点数表示方法,例如要表示:
4.0符点数,可以表示成:
4.f;
还有,在进行除法运算,3/2时,结果是1,但若写成:
3/2.f,这时结果是1.5。
8HWNDGetDlgItem(intnID)const;
//返回指定子窗口的句柄;
HWNDGetDlgItem(
HWNDhDlg,//handleofdialogbox
intnIDDlgItem//identifierofcontrol
);
//返回指定子窗口中某一控件的句柄;
9//选中当前黑色画笔,并保存以前的画笔
CGdiObject*pOldPen=pDC->
SelectObject(pPenBlack);
10SetBkColor(:
:
GetSysColor(COLOR_APPWORKSPACE));
这里“:
”代表WindowsAPI函数(是SDK函数,不是MFC函数),全局作用域,全局变量。
与绘图有关的操作或信息
DC
11在Windows程序中,所谓的“设备环境(DC:
DeviceContext)”就是一种电子画布;
电子画笔被称为“GDI对象(GDIObject)”。
除画笔之外,GDI对象还包括画刷、字体、位图和调色板等。
应该说,GDI对象就是那些可以用来在设备环境上绘图的工具。
在Windows程序中,一个设备环境只能拥有一种画笔、一种画刷和一种字体,也就是说,一个设备环境不能同时拥有同一类型的多个GDI对象。
CDC
12在MFC中,CDC类实现了对设备环境的封装。
所有的绘图操作都必须通过一个CDC类(或其派生类)的对象来完成。
CDC类提供了许多函数,可以完成各种与设备环境有关的操作,如选择GDI对象、使用颜色与调色板、绘制图形、显示字体、设置设备环境的属性和坐标转换等。
CDC类的派生类包括:
CPaintDC类、CClientDC类、CWindowDC类和CMetaFileDC类。
CDC为我们提供了四个输出文本的函数:
TextOut、ExtTextOut、TabbedTextOut、DrawOut,分别用于不同的场合。
如果想要绘制的文本需要支持Tab符,那么采用TabbedTextOut函数,可以使绘制出来的文本效果更佳;
如果需要在一个矩形区域内绘制多行文本,那么采用DrawOut函数,会更富于效率;
如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数就将是最好的选择。
如果没有什么特殊要求,那使用TextOut函数就显得简练多了。
GDI
13在MFC中,CgdiObject类封装了GDI对象。
但是,用户几乎不直接使用CgdiObject类,而是使用该类的派生类(包括:
Cpen类、Cbrush类、Cfont类、Cbitmap类、Cpalette类和Crgn类)。
其中,Crgn类封装了GDI区域,区域是窗口中特定的一块,通常用来指定操作的范围,以免干扰其他不需要修改的区域。
显示位图资源
CRectrect;
CDChMemDC;
GetClientRect(&
rect);
//获得客户窗口的大小
BITMAPBmp;
HBITMAPhbitmap=LoadBitmap(:
AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP_VIEW));
//装入位图资源
hMemDC.CreateCompatibleDC(NULL);
//创建内存设备上下文
SelectObject(hMemDC,hbitmap);
//位图选入上下文中
GetObject(hbitmap,sizeof(BITMAP),(LPSTR)&
Bmp);
//获得位图大小
StretchBlt(dc.m_hDC,0,0,rect.right,rect.bottom,
hMemDC,0,0,Bmp.bmWidth,Bmp