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有如下选择:

BLACKNESS           使用黑色填充目标区域
DSTINVERT              目标矩阵区域颜色取反
MERGECOPY            使用与运算组合原设备矩形区域的颜色和目标设备的画刷
MERGEPAINT           使用或运算将反向的源矩形区域的颜色和目标矩形区域的颜色合并
NOTSRCCOPY          复制源设备区域的反色到目标设备中
NOTSRCERASE        使用或运算组合源设备区域与目标设备区域的颜色,然后对结果颜色取反
PATCOPY                  复制源设备当前选中的画刷到目标设备
PATINVERT               使用异或运算组合目标设备选中的画刷和目标设备区域的颜色
PATPAINT                 通过或运算组合目标区域当前选中的画刷和源设备区域反转的颜色
SRCAND                   使用与运算组合源设备和目标设备区域的颜色
SRCCOPY                 直接复制源设备区域到目标设备中
SRCERASE               使用与运算组合目标设备区域的反色与源设备区域的颜色
SRCINVERT              使用异或运算组合源设备区域颜色和目标设备区域颜色
SRCPAINT                 使用或运算组合源设备区域颜色和目标设备区域颜色
WHITENESS             使用白色填充目标区域