天天看点

VC2019 使用GDI+ 显示PNG图片

新建一个单文档工程;

添加一个菜单;在视类中处理此菜单;

视类CPP文件添加:

    #include "gdiplus.h"

视类.h文件添加成员:

    ULONG_PTR m_gdiplusToken;

视类.h文件头部添加:

    #pragma comment(lib,"gdiplus.lib")

    这是载入GDI+的库;

gdiplus.h,在 外部依赖项 中可以发现;

先在VC资源中导入png1.png;操作失败;将文件拷贝到项目res文件夹下,并修改.rc文件;.rc文件包括如下一句;

IDB_PNG1                PNG                     "res\\png1.png"

菜单处理函数:

void CimageDemo1View::OnMenu32771()
{
	// TODO: 在此添加命令处理程序代码
	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
	Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

	CClientDC* pDC = new CClientDC(GetDlgItem(IDB_PNG1));
	//CClientDC* pDC = new CClientDC();
	CRect rect;
	//GetDlgItem(IDB_PNG1)->GetWindowRect(&rect);
	rect.top = 0;
	rect.left = 0;
	rect.bottom = 350;
	rect.right = 800;
	Gdiplus::Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object 
	Gdiplus::Image image(_T("png1.png")); // Construct an image graphics.
	graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());
	delete pDC;

	//Gdiplus::GdiplusShutdown(m_gdiplusToken);	
}
           

然后还需要在源码目录放一个png1.png;

代码是先根据资源中的png生成DC指针;由此DC构造Gdiplus::Graphics类别的对象graphics;然后画png1.png到此graphics对象上;

运行;

VC2019 使用GDI+ 显示PNG图片

有如下问题;

    GetDlgItem(IDB_PNG1)->GetWindowRect(&rect);

此句引发异常:读取位置 0x00000020 时发生访问冲突;

根据网上资料有:

    vs不支持通过AfxGetMainWnd()获取窗口句柄,把AfxGetMainWnd()->m_hWnd改成AfxGetApp()->m_pMainWnd->m_hWnd即可;

先改为直接设置rect的值;

然后最后这句是释放GDI+库,会引发 写入位置 0x02EF12BC 时发生访问冲突;先注释掉;

然后是图像并没有画到本窗口的DC上,是画到了桌面的DC上;

VC2019 使用GDI+ 显示PNG图片

下回再搞;如果是直接从Debug目录运行.exe文件,此目录也需要放一个png1.png;