==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
方法有很多种,有难有易。接下来从简单到难来讲解,并举例。
一、利用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());
这种方法功能最全,最好用。拉伸的时候图片清晰度被保持的很好,而且可以加载很多种类型的图片。还可以对图片进行旋转等操作。
结果如图: