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對象上;

運行;

有如下問題;

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

此句引發異常:讀取位置 0x00000020 時發生訪問衝突;

根據網上資料有:

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

先改爲直接設置rect的值;

然後最後這句是釋放GDI+庫,會引發 寫入位置 0x02EF12BC 時發生訪問衝突;先註釋掉;

然後是圖像並沒有畫到本窗口的DC上,是畫到了桌面的DC上;

下回再搞;如果是直接從Debug目錄運行.exe文件,此目錄也需要放一個png1.png;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章