MFC如何设置背景图片

==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


方法有很多种,有难有易。接下来从简单到难来讲解,并举例。

一、利用WM_CTLCOLOR消息将图片绘制上去

步骤如下:
1.为对话框添加WM_CTLCOLOR消息
MFC如何设置背景图片_第1张图片

2.添加两个成员变量

	CBitmap m_bmp;   //位图
	CBrush m_brush;  //画刷

3.加载位图,并且在WM_CTLCOLOR函数中绘制背景

m_bmp.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));    //这里将位图加载进资源后,再Load
	m_brush.CreatePatternBrush(&m_bmp); 
	if (nCtlColor == CTLCOLOR_DLG)
	{
		return m_brush;
	}

MFC如何设置背景图片_第2张图片

结果如图:
MFC如何设置背景图片_第3张图片

这个方法的缺点就是,图片不能自适应窗口大小。

二、用GDI函数将图片"画"上去

步骤如下:
1.添加成员变量如下

	CBitmap m_bmp;		//存放位图对象
	CDC m_dc;			//DC对象

2.在初始化对话框中加载位图并选入DC中

	//加载位图
	CBitmap bmp;
	bmp.LoadBitmapA(MAKEINTRESOURCE(IDB_BITMAP1));
	//添加位图
	m_bmp.Attach(bmp);
	//创建兼容DC
	CDC* pDc = GetDC();
	m_dc.CreateCompatibleDC(pDc);
	//用完之后释放
	ReleaseDC(pDc);
	//把位图对象选入DC中
	m_dc.SelectObject(&m_bmp);
	//使窗口无效,这样OnPaint函数就会被触发,使之被画出来
	Invalidate(FALSE);

3.最后在OnPaint函数中将位图画出来

		//画图DC
		CPaintDC dc(this);
		CRect rect = { 0 };
		GetClientRect(&rect);
		//缩放位图
		BITMAP bm;
		m_bmp.GetBitmap(&bm);
		dc.StretchBlt(0, 0, rect.Width(), rect.Height(),
			&m_dc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

		CDialogEx::OnPaint();

结果如图:
MFC如何设置背景图片_第4张图片

优点是图片可以伸缩,缺点就是图片会变得模糊。

三、用GDI+函数将图片"画"上去
1.初始化GDI+
请参看这篇文章MFC-GDI+初始化

2.添加一个Image成员变量

Image* m_img;

3.在初始化对话框中加载图片

	char buf[256] = "";
	GetCurrentDirectoryA(256, buf);
	sprintf_s(buf, "%s\\test.bmp", buf);
	CStringW s;   //转为宽字符
	s = buf;
	m_img = Image::FromFile(s);  //加载图片

4.在OnPaint函数中画出来

		CRect rect = { 0 };
		GetClientRect(&rect);   //获取客户区大小
		Graphics g(dc);
		g.DrawImage(m_img, 0, 0, rect.Width(), rect.Height());

这种方法功能最全,最好用。拉伸的时候图片清晰度被保持的很好,而且可以加载很多种类型的图片。还可以对图片进行旋转等操作。

结果如图:
MFC如何设置背景图片_第5张图片

你可能感兴趣的:(MFC)