文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Visual C++中DDB与DIB位图编程全攻略-2

Visual C++中DDB与DIB位图编程全攻略-2

时间:2008-05-19  来源:sdccf

  来源:天极网

500) {this.resized=true; this.width=500;}">


图1 加载DDB位图资源

 


我们来逐行解析上述代码是怎样产生图1的效果的。

第1、2行定义了一个CBitmap对象,并调用其成员函数LoadBitmap加载工程中的位图资源IDB_LOADED_BITMAP。第3、4行定义了BITMAP结构体的实例并调用CBitmap的成员函数GetBitmap获得位图信息,BITMAP结构体定义在头文件中,其形式为:

/* Bitmap Header Definition */
typedef struct tagBITMAP
{
LONG bmType; //必需为0
LONG bmWidth; //位图的宽度(以像素为单位)
LONG bmHeight; //位图的高度(以像素为单位)
LONG bmWidthBytes; //每一扫描行所需的字节数,应是偶数
WORD bmPlanes; //色平面数
WORD bmBitsPixel; //色平面的颜色位数
LPVOID bmBits; //指向存储像素阵列的数组
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
第5~8行的作用是:构建一个CDC对象,调用CDC::CreateCompatibleDC创建一个兼容的内存设备上下文,接着调用CDC::SelectObject将DDB选入内存设备上下文中。

第9行调用函数CDC::BitBlt绘制位图,CDC::BitBlt的原型为:

CDC::BitBlt(int x, int y, int nWidth, int nHeight, CDC *pSrcDC, int xSrc, int ySrc, DWORD dwRop)
CDC::BitBlt执行的操作为将源DC中位图复制到目的DC中。其中前四个参数为目的区域的坐标(x,y)及长度和宽度(Width, nHeight),第五个参数是源DC指针,接下来的参数是源DC中的起始坐标,最后一个参数为光栅操作的类型。

第10行调用CDC::SelectObject把原来的DDB选入到内存设备上下文中并使新DDB脱离出来。

与CDC::BitBlt对应的还有另一个函数CDC::StretchBlt,它具有缩放功能,其原型为:

BOOL CDC::StretchBlt(int x, int y, int nWidth, int nHeight, CDC *pSrcDC, int
xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);
该函数把位图从源矩形拷贝到目的矩形中,如果源和目的矩形尺寸不同,那么将缩放位图的功能以适应目的矩形的大小。函数的大部分参数与BitBlt的相同,但多了两个参数nSrcWidth和nSrcHeight用来指定源矩形的宽和高。

如果我们将函数CBitMapExampleDlg::OnLoadddbpic() 中的第9行改为:

CRect clientRect;
GetClientRect(&clientRect); //获得对话框窗口的大小
dc.StretchBlt(0, 0, clientRect.right, clientRect.bottom, &memDC, 0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
则单击加载按钮后的对话框如图2所示,位图被拉伸至整个对话框的范围。


500) {this.resized=true; this.width=500;}">


图2 拉伸位图

CDC::BitBlt和dc.StretchBlt函数中的dwRop参数较为有用,它定义光栅操作的类型。请看"DDB位图"父菜单下"标记"子菜单单击事件的消息处理函数代码:

void CBitMapExampleDlg::OnMarkDdbpic()
{
CBitmap bmpDraw;
bmpDraw.LoadBitmap(IDB_YESKY_BITMAP); //装入天极网logo DDB位图资源
BITMAP bmpInfo;
bmpDraw.GetBitmap(&bmpInfo); //获取天极网logo位图的尺寸

CDC memDC; //定义一个兼容DC
CClientDC dc(this);
memDC.CreateCompatibleDC(&dc); //创建DC

CBitmap *pbmpOld = memDC.SelectObject(&bmpDraw);
//保存原有DDB,并选入天极网logo位图入DC
dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCAND);
memDC.SelectObject(pbmpOld); //选入原DDB
}
单击该按钮后,将产生如图3的效果,天极网的logo被透明地添加到了位图中!


500) {this.resized=true; this.width=500;}">


图3 在DDB位图中加入天极网logo

能产生这个效果的原因在于我们在代码行:

dc.BitBlt ( 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &memDC, 0, 0, SRCAND );

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载