MFC如何设置背景图片

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


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

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

步骤如下:
1.为对话框添加WM_CTLCOLOR消息

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;
	}

结果如图:

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

二、用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();

结果如图:

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

三、用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());

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

结果如图:

  • 11
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值