博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
发一个自己封装的PNG透明图片类。
阅读量:5319 次
发布时间:2019-06-14

本文共 2767 字,大约阅读时间需要 9 分钟。

//-----------pnglib.h#include "stdafx.h"#include "afxdialogex.h"#include "atlimage.h"class DrawImage{public:	DrawImage(UINT, LPCTSTR);	DrawImage(HWND, UINT, LPCTSTR);	~DrawImage();public:	void Draw(int, int, int, int);	void Destroy();	BOOL LoadPNG(UINT, LPCTSTR);	BOOL LoadPNG(HWND, UINT, LPCTSTR);	int GetWidth();	int GetHeight();private:	BOOL Load_Resource(CImage *, UINT, LPCTSTR);	CImage img;	HDC hDC;	HWND hWnd;};

 

//----------------pnglib.cpp#include "stdafx.h"#include "pnglib.h"DrawImage::DrawImage(UINT nResID, LPCTSTR lpTyp){	LoadPNG(nResID, lpTyp);}DrawImage::DrawImage(HWND hWndin, UINT nResID, LPCTSTR lpTyp){	LoadPNG(hWndin, nResID, lpTyp);}DrawImage::~DrawImage(){	Destroy();}int DrawImage::GetWidth(){	return img.GetWidth();}int DrawImage::GetHeight(){	return img.GetHeight();}void DrawImage::Draw(int xDest, int yDest, int WidthDest, int HeightDest){	img.Draw(hDC, xDest, yDest, WidthDest, HeightDest);}void DrawImage::Destroy(){	img.Destroy();	ReleaseDC(hWnd, hDC);}BOOL DrawImage::LoadPNG(UINT nResID, LPCTSTR lpTyp){	hDC = ::GetDC(hWnd);	return Load_Resource(&img, nResID, lpTyp);}BOOL DrawImage::LoadPNG(HWND hWndin, UINT nResID, LPCTSTR lpTyp){	hWnd = hWndin;	hDC = ::GetDC(hWnd);	return Load_Resource(&img, nResID, lpTyp);}BOOL DrawImage::Load_Resource(CImage *pImage, UINT nResID, LPCTSTR lpTyp){	if (pImage == NULL)	{		return false;	}	pImage->Destroy();	HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);	if (hRsrc == NULL)return false;	HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);	if (hImgData == NULL)	{		::FreeResource(hImgData);		return false;	}	LPVOID lpVoid = ::LockResource(hImgData);	LPSTREAM pStream = NULL;	DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);	HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);	LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew);	::memcpy(lpByte, lpVoid, dwSize);	::GlobalUnlock(hNew);	HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);	if (ht != S_OK)	{		GlobalFree(hNew);	}	else	{		pImage->Load(pStream);		GlobalFree(hNew);	}	::FreeResource(hImgData);	for (int i = 0; i < img.GetWidth(); i++)	{		for (int j = 0; j < img.GetHeight(); j++)		{			unsigned char* puc = reinterpret_cast
(img.GetPixelAddress(i, j)); puc[0] = puc[0] * puc[3] / 255; puc[1] = puc[1] * puc[3] / 255; puc[2] = puc[2] * puc[3] / 255; } } if (img.IsNull()) { return false; } return true;}

 用法:

把你的PNG添加到工程里面,修改资源ID为   PIC_PNG1用法1:默认在当前窗口中绘图DrawImage m_png(PIC_PNG1,"png");m_png.Draw(100,100,m_png.GetWidth(),m_png.GetHeight());//其中两个100是图片左上角的坐标用法2:可以在任何窗口中绘图HWND hWndin = 桌面句柄;//在桌面绘图,需要自己去获取DrawImage m_png(hWndin,PIC_PNG1,"png");m_png.Draw(100,100,m_png.GetWidth(),m_png.GetHeight());

 

作者:天楼桦

转载于:https://www.cnblogs.com/liu-q/p/5825337.html

你可能感兴趣的文章
Linux设置环境变量的方法
查看>>
Atitit.进程管理常用api
查看>>
构建自己的项目管理方案
查看>>
利用pca分析fmri的生理噪声
查看>>
div水平居中且垂直居中
查看>>
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
原生JavaScript第六篇
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>