内存映射文件在进程中的应用与研究
以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
资料介绍:
4.1 相关技术
4.1.1 消息映射机制
MFC提供的一套消息映射机制来处理消息。所谓消息映射,简单讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理这个消息.MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理的成员函数.程序员将完成消息处理函数,实现所希望的消息处理能力。
如果派生类要覆盖基类的消息处理函数,就用ClassWizard在派生类中添加一个消息映射条目,用同样的原型定义一个函数,然后实现该函数。这个函数覆盖派生类的任何基类的同名处理函数。
使用MFC框架编程时,消息发送和处理的本质和Windows一样。但是,有一点需要强调的是,所有的MFC窗口都使用同一窗口过程,程序员不必去设计和实现自己的窗口过程,而是通过MFC提供的一套消息映射机制来处理消息。因此,MFC简化了程序员编程时处理消息的复杂性。
根据处理函数和处理过程的不同, MFC主要处理三类消息:
Windows 消息,前缀以“WM_”打头,WM_COMMAND例外。Windows消息直接送给MFC窗口过程处理,窗口过程调用对应的消息处理函数。一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。
【买计算机毕业论文就到www.think58.com】 think58好,好think58 [资料来源:http://www.THINK58.com]
控制通知消息,是控制子窗口送给父窗口的 WM_COMMAND通知消息。窗口过程调用对应的消息处理函数。一般,由窗口对象来处理这类消息,也就是说,这类消息处理函数一般是MFC窗口类的成员函数。
需要指出的是,Win32使用新的WM_NOFITY来处理复杂的通知消息。WM_COMMAND类型的通知消息仅仅能传递一个控制窗口句柄(lparam)、控制窗ID和通知代码(wparam)。WM_NOTIFY能传递任意复杂的信息。
命令消息,这是来自菜单、工具条按钮、加速键等用户接口对象的WM_COMMAND通知消息,属于应用程序自己定义的消息。通过消息映射机制,MFC框架把命令按一定的路径分发给多种类型的对象(具备消息处理能力)处理,如文档、窗口、应用程序、文档模板等对象。能处理消息映射的类必须从CCmdTarget类派生。
MFC 使用ClassWizard帮助实现消息映射,它在源码中添加一些消息映射的内容,并声明和实现消息处理函数。来分析这些被添加的内容。
在类的定义(头文件)里,它增加了消息处理函数声明,并添加一行声明消息映射的宏 DECLARE_MESSAGE_MAP。
在类的实现(实现文件)里,实现消息处理函数,并使用 IMPLEMENT_MESSAGE_MAP宏实现消息映射。一般情况下,这些声明和实现是由MFC的ClassWizard自动来维护的。 [资料来源:http://www.THINK58.com]
4.1.2 BMP(位图)文件
BMP文件又称位图文件,它是存储在电脑上的未经压缩的图片。因为它没有被压缩,所以BMP文件显示出来的图像是最清晰的,其他格式的图片文件基本都是在BMP文件基础上压缩得到的。在图像识别和图像处理等领域,BMP文件是最重要的。
从磁盘上读取BMP文件显示给用户的过程主要如下。
1) 建立与应用程序窗口相兼容的内存DC,建立一个与磁盘BMP文件大小相同的、与窗口客户区DC兼容的内存Bitmap(位图)。
2) 将这个内存Bitmap选入到内存DC中,这样应用程序就可以在内存DC上进行位图操作了。
3) 通过分析BMP文件的格式(文件头结构和信息头结构)。将这个BMP文件画到内存DC中。
4) 最后在窗口处理WM_PAINT消息时将内存DC复制到客户区DC中。
下面分别讲述各部分的实现过程。
1. 创建内存DC和内存Bitmap(位图)
CreateComaptibleDC函数用于创建一个与指定设备环境兼容的内存设备环境。
HDC CreateCompatibleDC(HDC hdc);//hdc函数为一个存在的设备环境句柄
CreateCompatibleDC函数创建了一个于指定的DC兼容的内存DC。参数中的hdc只是个参考DC,该函数创建这个DC的内存映像。
内存DC仅仅存在在内存中。当内存DC刚被创建时,它仅有黑白两色。在应用程序使用内存DC进行绘图操作时,它创建了一个与制定设备环境兼容的位图。这个位图能够被选入到任何内存的内存DC中。函数用法如下
本文来自think58
[版权所有:http://think58.com]
HBITMAP CreateCompatibleBitmap(
HDC hdc,
int nWidth, //位图的宽度
int nHeight //位图的高度
);
Hdc为参考DC的设备环境句柄,必须与CreateCompatibleDC函数使用的参考句柄相兼容。
CreateCompatibleBitmap函数创建的位图的颜色格式与参考DC的格式相同。它的返回值是位图句柄,可以使用SelectObject函数选入此句柄到上面创建的内存DC中。
2. 在DC间复制图像
在内存DC上绘制完图像之后,为了向用户显示,可以调用BitBlt把内存DC上的位图复制到真正的DC中。这就是在屏幕上快速显示图像的双缓冲技术(可以减少图像抖动)。
BitBlt是一个重要的块传送操作函数。块传送指把原为之重的数据块按照指定的方式传送到目的位置中。把内存中的位图复制到窗口客户区以及在不同的DC间复制图形数据都要用到块传送操作。BitBlt函数用法如下。
BOOL BitBlt(
HDC hdcDest, //目标DC
int nXDest,int nYDest, //指定目标DC中接受图像的起始位置
int nWidth,int nHeight, //欲传送图像的宽度和高度
HDC hdcSrc, //源DC
int nXSrc,int nYSrc, //指定源DC中要拷贝的图像的起始坐标
DWORD dwRop //传输过程要者性的光栅运算 内容来自think58
[资料来源:www.THINK58.com]
);
BitBlt是”数据块传送”的意思,即“Bit Block Transfer”。这个函数可以将一个DC中的图像拷贝到另一个DC中,而不改变图像的大小。
3. BMP文件结构
为了将BMP文件读到内存DC中,必须要了解文件的内部结构,下面简单介绍。
BMP文件的开始是BITMAPFILEHEADER结构(文件头),它的定义如下。
Typedef struct tagBITMAPFILEHEADER{
WORD bfType; //文件标示,必需为BM
DWORD bfSize; //文件长度
WORD bfReserved1; //0
WORD bfReserved2;//0
DWORD bfOffBits; //位图数据在文件中的起始位置
}BITMAPFILEHEADER,*PBITMAPFILEHEADER;
BITMAPFILEHEADER结构的后面是BITMAPINFOHEADER结构(信息头)。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //本结构的长度
LONG biWidth; //位图的宽度
LONG biHeight; //位图的高度
WORD biPlanes; //位图的色平面数
WORD biBitCount; //位图的颜色深度(一个像素所占用的位数)
DWORD biCompression; //位图的压缩方式
DWORD biSizeImage; //位图的尺寸
LONG biXpelsPerMeter;//图形x方向的分辨率
[来源:http://think58.com]
LONG biYPelsPerMeter;//图形y方向的分辨率
DWORD biClrUsed; //指定了颜色表的大小
DWORD biClrImportant;
}BITMAPINFOHEADER *PBITMAPINFOHEADER;
之后是颜色表(如果有的话)。位图信息BITMAPINFO是由BITMAPINFOHEADER结构和颜色表组成的。
Typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bmiHeader;//位图信息头
RGBQUAD bmiColors[1]; //颜色表
}BITMAPINFO;
think58.com
[资料来源:THINK58.com]