MFC 使用GDI+ 绘制Png、Jpg等类型图片



MFC是微软对Win32 API的封装,使用较为简单,但是在美化方面MFC本身就比较欠缺了,单单只是简单的设置一下背景图片这个操作就得需要好多行代码,并且还不能直接使用Png、Jpg等图片,今天小悠就在这里简单的说一下MFC成显示png和jpg等图片的方法.

先看一下绘制的效果吧:     

首先说一下程序中需要引入的头文件以及lib库

 要想显示Png、Jpg等格式的图片,需要引入微软的GDI+图形设备接口,在你的MFC程序中 导入头文件GdiPlus.h 和库文件 gdiplus.lib就能使用GDI+了,小悠一般是这么做的:

1
2
3
4
//包含文件
#include <GdiPlus.h>
//GDI的库
#pragma comment(lib, "gdiplus.lib")

 

其次,在使用GDI+的时候需要初始化GDI+

初始化操作使用函数 GdiplusStartup(

  ULONG_PTR* token,

  const GdiplusStartupInput* input,

  GdiplusStartupOutput* output

);

来完成,其中

参数一:他是一个ULONG_PTR的指针,token这个参数就类

        似于一个句柄吧,关闭GDI+的时候需要用到它。

参数二:指针指向一个GdiplusStartupInput结构,其中包

        含了GDI+的一些信息。

参数三:指针到一个GdiplusStartupOutput结构,它接收

        一些GDI+信息

 

上面只是简单介绍了这个函数的参数,详细的信息你可以查看MSDN

例如小悠是这个样子初始化GDI+的:

1
2
3
4
//就一句话,里面的 两个变量
//ULONG_PTR m_Taken;
// Gdiplus::GdiplusStartupInput m_Input;
Gdiplus::GdiplusStartup(&m_Taken, &m_Input, NULL);

为了简单的说明,我们就直接在Onpaint里面完成绘制的全部操作

因为要绘制一张图片,首先我们需要将图片载入内存,然后你还需要知道你需要绘制的目标区域,最后告诉GDI+你的图片的剪切区域,完成绘制就OK了,下面是小悠简单的写的一个操作,在OnPaint里面完成的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CDialogEx::OnPaint();
               //这里简单的绘制一下背景,就省略了一些 复杂的 操作
               //获取到DC
               CDC* pDC = GetDC();
               //你需要绘制的目标
               CRect clientRect;
               GetClientRect(&clientRect);
               //载入你的图片
               Gdiplus::Bitmap * lpBmp =Gdiplus::Bitmap::FromFile(_T( "./bg.jpg" ));;
               //绑定你 的DC
               Gdiplus::Graphics graph(pDC->m_hDC);
               //开始绘制操作
               graph.DrawImage(lpBmp,
                                           //目标位置
                                    Gdiplus::Rect(0,0,clientRect.Width(),clientRect.Height()),
                                           //图片的剪切
                                           0,0,lpBmp->GetWidth(),lpBmp->GetHeight(),
                                           Gdiplus::UnitPixel
                                           );
               graph.ReleaseHDC(pDC->m_hDC);
               delete  lpBmp;

最后在对话框的析构函数中要释放GDI+的资源

释放一句话搞定:

1
2
if (m_Taken)
{Gdiplus::GdiplusShutdown(m_Taken);}

总结:

总的来说使用GDI+分为下面的几个简单步骤

包含对应的头文件,引入GDI+的lib库

初始化GDI+

绑定DC完成绘制

释放GDI+

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC使用 GDI+PNG 图像显示到指定的矩形区域中,可以按照以下步骤进行操作: 1. 在头文件中包含 GDI+ 库: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ``` 2. 在 MFC 对话框的 OnInitDialog 函数中初始化 GDI+: ``` GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ``` 3. 加载 PNG 图像并创建 GDI+ 的 Image 对象: ``` Image* pImage = Image::FromFile(L"test.png", FALSE); ``` 4. 获取指定矩形区域的设备上下文(DC): ``` CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); ``` 5. 创建 GDI+ 的 Graphics 对象,并将其绑定到 DC 上: ``` Graphics graphics(pDC->GetSafeHdc()); ``` 6. 将 PNG 图像绘制到指定矩形区域中: ``` graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); ``` 7. 释放 GDI+ 相关资源: ``` delete pImage; GdiplusShutdown(gdiplusToken); ``` 完整代码示例: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") using namespace Gdiplus; ... BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化 GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 加载 PNG 图像并创建 Image 对象 Image* pImage = Image::FromFile(L"test.png", FALSE); // 获取指定矩形区域的 DC CRect rect; GetDlgItem(IDC_STATIC_IMAGE)->GetClientRect(rect); CDC* pDC = GetDlgItem(IDC_STATIC_IMAGE)->GetDC(); // 创建 Graphics 对象,并将其绑定到 DC 上 Graphics graphics(pDC->GetSafeHdc()); // 将 PNG 图像绘制到指定矩形区域中 graphics.DrawImage(pImage, rect.left, rect.top, rect.Width(), rect.Height()); // 释放资源 delete pImage; GdiplusShutdown(gdiplusToken); return TRUE; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值