一:BitBlt函数显示位图
BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD dwRop);
调用形式:
dc.BitBlt(x,y,nWidth,nHeight,pSrcDC,xSrc,ySrc,dwRop);
理解:pSrcDC(内存)中含有一张位图,dwRop参数决定了对该位图进行不同的操作,以dwRop=SRCCOPY为例,他表示将pSrcDC中的位图拷贝到dc上,(xSrc,ySrc)决定了从哪个像素点开始进行拷贝。将拷贝的图像画在起点为(x,y),宽高分别为nWidth,nHeight的矩形区域内进行显示。
实验源码(在OnPaint中添加):
CPaintDC dc(this);
BITMAP bm;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc); //创建与显示DC相兼容的内存DC
bmp.GetBitmap(&bm); //填充BITMAP结构
CBitmap *pOldBmp=memdc.SelectObject(&bmp); //将选定的位图选入内存DC
dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,100,0,SRCCOPY);
memdc.SelectObject(pOldBmp);
memdc.DeleteDC();
bmp.DeleteObject();
实验结果:
将源码修改为:dc.BitBlt(70,0,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY);运行结果为:
即在坐标(70,0)处开始进行图像显示。
将源码修改为:dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,100,0,SRCCOPY);运行结果为:
即从图像(100,0)位置处的像素开始进行拷贝。BitBlt函数不能缩放图像。而StretchBlt可以。
二:StretchBlt
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);
理解:StretchBlt和BitBlt参数的理解一样的,只是StretchBlt增加了nSrcWidth,nSrcHeight两个参数。结合点
(xSrc,ySrc)就确定了一个矩形,它表示将图像中该矩形区的像素点拷贝到起点为(x,y),宽高为nWidth, nHeight的矩形内,进行显示。
实验源码:
CPaintDC dc(this);
BITMAP bm;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc); //创建与显示DC相兼容的内存DC
bmp.GetBitmap(&bm); //填充BITMAP结构
CRect rectClient;
GetClientRect(&rectClient);
CBitmap *pOldBmp=memdc.SelectObject(&bmp); //将选定的位图选入内存DC
//dc.SetStretchBltMode(HALFTONE);
dc.StretchBlt(0,0,rectClient.Width(),rectClient.Height(),&memdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
memdc.SelectObject(pOldBmp);
memdc.DeleteDC();
bmp.DeleteObject();
运行结果:
可以看到,图像有很明显的失真。这是因为图像原本的大小与显示大小相差很多,造成图像大尺度拉伸或缩小而造成的,可以使用函数SetStretchBltMode来解决。将以上注释的代码去掉注释,运行结果为:
哇,秀色可餐。
三:实验证明用TransparentBlt来显示不会出现失真。
CPaintDC dc(this);
BITMAP bm;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CDC memdc;
memdc.CreateCompatibleDC(&dc); //创建与显示DC相兼容的内存DC
bmp.GetBitmap(&bm); //填充BITMAP结构
CRect rectClient;
GetClientRect(&rectClient);
CBitmap *pOldBmp=memdc.SelectObject(&bmp); //将选定的位图选入内存DC
dc.TransparentBlt(0,0,rectClient.Width(),rectClient.Height(),&memdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
memdc.SelectObject(pOldBmp);
memdc.DeleteDC();
bmp.DeleteObject();
实验结果: