MFC 对话框添加背景图片详细过程(两种方法)

给对话框添加背景图片方法很多,在此贴出两种很常见的方法。一种是通过读取位图资源显示位图(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点在整个对话框的的左上角,也就是说贴出来的背景图有一部分是被标题栏挡住的。
MFC 对话框添加背景图片详细过程(两种方法)_第1张图片


你可能感兴趣的:(VC/MFC)