效果展示
操作
文件操作
将需要用到的图片放到合适位置(没有指定位置,只要你找得到就行)
这里我放在项目下的res文件夹里
接下来我们把图片导入到项目的资源文件里
有两种导入方法
- 第一种
在资源视图找到.rc文件夹右键点击添加资源
如果有Bitmap文件夹在.rc文件夹或Bitmap文件夹右键添加皆可
选择Bitmap然后点击导入
选择我们需要的图片(这里可能出错,具体请参考注意事项1)
成功导入后记得Ctrl+S保存
- 第二种
在解决方案里找到资源文件里的.rc资源,右键查看代码
然后在合适的位置手动添加\修改资源(有注意事项)2
控件(图片)ID 控件(图片)类型 资源相对位置
新手找不到合适位置还是老老实实用第一个方法添加
随后在Resource.h里找一个不重复的数加上去
代码操作
首先得有对话框废话
这里跳过创建对话框
我们来到对话框的头文件里
声明绘图函数
afx_msg void OnPaint();
随后来到cpp里
在消息响应里添加绘图响应
ON_WM_PAINT()
然后在cpp里创建OnPaint的定义
//防憨憨全搬发现不对,这里CmfcTestDlg是你自己的对话框类
void CmfcTestDlg::OnPaint()
{
CPaintDC dc(this);// 用于绘制的设备上下文
CDC memDC;// 创建一个内存 DC,并选择 Bitmap
memDC.CreateCompatibleDC(&dc);// 创建与窗口 DC 兼容的内存 DC
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);// 加载 .bmp 图片
BITMAP bm;
bmp.GetBitmap(&bm);// 获取 Bitmap 的尺寸
CBitmap* pOldBitmap = memDC.SelectObject(&bmp);
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);// 绘制 Bitmap
memDC.SelectObject(pOldBitmap);// 恢复原 Bitmap
CDialogEx::OnPaint();
}
BitBlt的前四个参数为对话框内放的位置和图片显示大小
显示多个图片也行
//防憨憨全搬发现不对,这里CmfcTestDlg是你自己的对话框类
void CmfcTestDlg::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bmp0,bmp1;
bmp0.LoadBitmap(IDB_BITMAP1);
bmp1.LoadBitmap(IDB_BITMAP2);
BITMAP bm0,bm1;
bmp0.GetBitmap(&bm0);
bmp1.GetBitmap(&bm1);
CBitmap* pOldBitmap0 = memDC.SelectObject(&bmp0);
dc.BitBlt(0, 0, bm0.bmWidth, bm0.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap0);
CBitmap* pOldBitmap1 = memDC.SelectObject(&bmp1);
dc.BitBlt(500, 0, bm1.bmWidth, bm1.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap1);
CDialogEx::OnPaint();
}
有注意事项3
注意事项
这里选择图片一定要是bmp格式,且初始就为bmp格式,不能直接将后缀改为bmp。例如1.jpg/1.png->1.bmp
这样会导致vs报错error RC2170 : bitmap file xxx.bmp is not in 3.00 format
正确的做法:
找到我们需要的图片,右键使用画图等工具(这里亲测微软自带的画图软件可以修改)打开编辑
将图片另存为BMP图片即可。 ↩︎手动在.rc里添加资源不会在Resource.h里自动加控件宏定义,得手动去添加一个没有用到的数。自动添加资源可能会在Resource.h出现两个控件宏用一个ID,都注意并手动修改。 ↩︎
这里必须先恢复Bitmap
CBitmap* pOldBitmap0 = memDC.SelectObject(&bmp0);
dc.BitBlt(0, 0, bm0.bmWidth, bm0.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap0);
CBitmap* pOldBitmap1 = memDC.SelectObject(&bmp1);
dc.BitBlt(500, 0, bm1.bmWidth, bm1.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap1);
不能写成
CBitmap* pOldBitmap0 = memDC.SelectObject(&bmp0);
CBitmap* pOldBitmap1 = memDC.SelectObject(&bmp1);
dc.BitBlt(0, 0, bm0.bmWidth, bm0.bmHeight, &memDC, 0, 0, SRCCOPY);
dc.BitBlt(500, 0, bm1.bmWidth, bm1.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap0);
memDC.SelectObject(pOldBitmap1); ↩︎