1.加载背景位图。
在资源视图中,右击.rc文件夹,选择添加资源。在资源类型中,选择Bitmap。这里可以自己新建,也可以导入已经有的背景位图。我们这里选择导入,然后给该位图改ID为IDB_MAIN。
2.添加绘图代码。这里是基于对话框的的应用程序,所以代码要放在ONPAINT函数中。如果是单文档应用程序就放在OnDraw()函数中。
在else里面加入代码:
CPaintDC dc(this);
CDC MemDC;
CBitmap bitmap;
BITMAP m_bitmap;
bitmap.LoadBitmap(IDB_MAIN);
bitmap.GetBitmap(&m_bitmap);
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&bitmap);
dc.BitBlt(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,&MemDC,0,0,SRCCOPY);
bitmap.DeleteObject();
MemDC.DeleteDC();
所需数据结构:
CPaintDC(用在OnPaint函数中响应WM_PAINT消息的,用于重绘。经常在OnPaint函数中可以看到它。)
CDC(用来创建兼容DC的)
CBitmap(位图类)
BITMAP(位图的结构体,用来保存位图信息)
从代码中可以看出代码步骤如下:
1.加载位图,将位图资源加载到CBitmap类中去。
2.将位图信息获取到BITMAP的结构体中,方便后面绘图时使用。
4.创建兼容DC ,DC是在窗口上画图,而兼容DC是在“兼容位图”上画图。这里用到的是MFC的双缓存技术,可以避免频繁绘图导致屏幕闪烁。
原理就是用兼容DC在兼容位图上将绘图操作全部绘制完,然后再一次性拷贝到源DC上。创建兼容DC时需要指定跟哪个DC兼容,这里是与CPaintDC 兼容。
5.选择位图到兼容DC中。
6.绘制背景。
7.释放资源,从类中删除位图,删除兼容DC。
加载后,我们发现图片并不一定充满了整个对话框,这怎么办呢?
这是因为BitBlt并不支持缩放操作,图片是多大显示就是多大。我们可以使用StretchBlt函数来实现,它只比BitBlt多了两个参数而已,即源图像的宽和高。两个函数的比较可以参加博客:
我们先获取对话框的大小:
CRect rect;
GetClientRect(&rect);
然后将dc.BitBlt(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,&MemDC,0,0,SRCCOPY);改成
m_bitmap.bmWidth,m_bitmap.bmHeight,SRCCOPY);
然后编译运行,就可以了!
附:BitBlt函数简介
BitBlt 用于从原DC中复制位图到目标DC,语法格式如下:
BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);
x:目标DC矩形区域的左上角x轴坐标点。
y:目标DC矩形区域的左上角y轴坐标点。
nWidth:在目标DC中绘制位图的宽度。
nHight:在目标DC中绘制位图的高度。
pSrcDC:源DC对象指针。
xSrc:源DC的起点x轴坐标,函数从该起点复制位图到目标设备。我们可以理解为从图片左边某一处向右开始复制
ySrc:源DC的起点y轴坐标,函数从该起点复制位图到目标设备。我们可以理解为从图片上面某一处向下开始复制。
dwRop:光栅操作代码
dwRop有如下选择:
|