给对话框添加背景图片方法很多,在此贴出两种很常见的方法。一种是通过读取位图资源显示位图(BitMap)
step:
1、创建内存设备上下文;
2、选择位图,将其装入内存设备上下文;
3、使用BitBlt()函数从内存设备上下文中把位图拷贝到输出设备上下文中显示;
PS:此处要特别说明一下BitBlt()函数,很重要的一个函数,必须记住
BOOL BitBlt
(
int x, //目标矩形的左上角X坐标,即你要让位图从界面的什么地方开始显示的X坐标
int y,//目标矩形的左上角Y坐标,即你要让位图从界面的什么地方开始显示的Y坐标
int nWidth, //目标矩形的宽度,但本人觉得此处写位图的宽度也是一样,因为只是拷贝,没有伸缩
int nHeight, //目标矩形的高度,但本人觉得此处写位图的高度也是一样,因为只是拷贝,没有伸缩
CDC* pSrcDC,//源位图设备
int xSrc,//位图资源的起点X坐标
int ySrc, //位图资源的起点Y坐标
DWORD dwRop//光栅操作码
);
此处再说明另一个接口StretchBlt(),可伸缩位图以此来达到全部显示到用户指定的空间中
BOOL StretchBlt
(
int x, //同上
int y, //同上
int nWidth,//这里就要写客户端的宽度了,因为位图伸缩到此处设置的宽度里
int nHeight,//这里就要写客户端的高度了,因为位图伸缩到此处设置的高度里
CDC* pSrcDC,//同上
int xSrc, //位图起点X坐标
int ySrc,//位图起点Y坐标
int nSrcWidth, //位图宽
int nSrcHeight, //位图高
DWORD dwRop//光栅操作码
);
OK。。说完这两个函数,接下来说第一种添加背景图片方法:
1、Resource View中xxx.rc右击,选择Add Resource,选中BitMap,点击Import,然后选择一张.bmp的图片导入,此时就完成了位图资源的插入,并且有一个对应的ID。
2、在OnPaint()中的else中插入如下代码,切记,必须将CDialogEx::OnPaint()去掉
//CDialogEx::OnPaint();
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect); //得到客户端的大小;
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap); //得到位图信息
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);//创建内存DC;
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); //选择位图,将其装入内存设备上下文;
//使用BitBlt()函数从内存设备上下文中把位图拷贝到输出设备上下文中显示,
//下边两个实现结果一样,所以本人觉得第3和4参数设为位图宽和高也行;
//dc.BitBlt(0,0, bitmap.bmWidth,bitmap.bmHeight,&dcMem,0,0,SRCCOPY);
dc.BitBlt(0,0, rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
dcMem.SelectObject( pbmpOld );//将原来的位图重新载入
dcMem.DeleteDC();//删除内存DC
以上就是第一种方法显示对话框背景图片,接下来是第二种方法:通过读取位图文件显示位图,方法和上边大同小异,只是上边事先插入资源,然后用资源ID来显示,而现在是通过读取位图文件而已,不同的地方是:
1、不需要去插入资源,所以,LoadBitmap(IDB_BITMAP1)就没用了,而是用下边方法代替:
HBITMAP hBitMap = (HBITMAP)::LoadImage( NULL, _T("res\\desk.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
bmpBackground.Attach(hBitMap);
2、此时bmpBackground.GetBitmap(&bitmap);也就不对了,而应该是:
bmpBackground.GetObject(sizeof(bitmap), &bitmap);
剩下的一样。这就是一般给对话框加背景图片的两种方法。
加载完成后发现图片有的太小,占不满整个对话框,或者图片太大,客户端装不下,解决办法就是用上边说明的第二个函数了,而不用第一个了,因为BitBlt只是拷贝,不带伸缩功能,将BitBlt()换成如下方法即可:
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
PS:
此处用的CPaintDC dc(this); 可能有的人会用CWindowsDC dc(this);如果用WindowsDC的话,那么目标矩形区域的起点包括标题栏的,也就是说0,0点在整个对话框的的左上角,也就是说贴出来的背景图有一部分是被标题栏挡住的。