您的位置:首页 > 其它

mfc中使用bmp和png位图

2015-04-21 10:45 295 查看
#include <GdiPlus.h>
#include <AtlImage.h>
#pragma comment(lib,"gdiplus.lib")  

//全局对象
CImage			m_Imagebmp;				//bmp图片
Image *			m_pImage;				//png图片

//全局函数

//绘画背景
VOID DrawViewImage(CDC * pDC, CImage & BitImage, BYTE cbDrawMode);
//绘画PNG图像
bool DrawImagePng(CDC * pDC, INT nXPos, INT nYPos);

//加载 bmp文件
m_Imagebmp.Load(TEXT("res\\bmp\\VIEW_BACK.bmp"));

//加载 png文件
CT2CW strFileName(TEXT("res\\png\\READY.png"));
m_pImage=Image::FromFile((LPCWSTR)strFileName);
//错误判断
if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok)) 
{
	try { delete m_pImage; } catch (...) { ASSERT(FALSE); } m_pImage=NULL;
	return false;
}

//绘画界面
void CMyWindow::OnPaint()
{
	CPaintDC dc(this);
	DrawViewImage(&dc,m_Imagebmp,DRAW_MODE_CENTENT);
	DrawImagePng(&dc,0,100);
}


//绘画模式

#define DRAW_MODE_SPREAD 0 //平铺模式

#define DRAW_MODE_CENTENT 1 //居中模式

#define DRAW_MODE_ELONGGATE 2 //拉伸模式

//绘画模式

#define DRAW_MODE_SPREAD 0 //平铺模式

#define DRAW_MODE_CENTENT 1 //居中模式

#define DRAW_MODE_ELONGGATE 2 //拉伸模式

//绘画背景
VOID CMyWindow::DrawViewImage( CDC * pDC, CImage & BitImage, BYTE cbDrawMode )
{
	//获取位置
	CRect rcClient;
	GetClientRect(&rcClient);

	//无效区域
	CRect rcDirty;
	pDC->GetClipBox(&rcDirty);

	//绘画位图
	switch (cbDrawMode)
	{
	case DRAW_MODE_SPREAD:		//平铺模式
		{
			//加载资源
			INT nImageWidth=BitImage.GetWidth();
			INT nImageHeight=BitImage.GetHeight();

			//绘画位图
			for (INT nXPos=0;nXPos<rcClient.right;nXPos+=nImageWidth)
			{
				for (INT nYPos=0;nYPos<rcClient.bottom;nYPos+=nImageHeight)
				{
					BitImage.BitBlt(pDC->m_hDC,nXPos,nYPos);
				}
			}

			return;
		}
	case DRAW_MODE_CENTENT:		//居中模式
		{
			//变量定义
			INT nImageWidth=BitImage.GetWidth();
			INT nImageHeight=BitImage.GetHeight();

			//位置计算
			INT nXPos=(rcClient.Width()-BitImage.GetWidth())/2;
			INT nYPos=(rcClient.Height()-BitImage.GetHeight())/2;

			//绘画位图
			BitImage.BitBlt(pDC->m_hDC,nXPos,nYPos);

			return;
		}
	case DRAW_MODE_ELONGGATE:	//拉伸模式
		{
			//变量定义
			INT nImageWidth=BitImage.GetWidth();
			INT nImageHeight=BitImage.GetHeight();

			//绘画位图
			BitImage.StretchBlt(pDC->m_hDC,0,0,rcClient.Width(),rcClient.Height(),0,0,nImageWidth,nImageHeight);

			return;
		}
	}

	return;
}

//绘画图像
bool CMyWindow::DrawImagePng( CDC * pDC, INT nXPos, INT nYPos )
{
	//加载判断
	ASSERT(m_pImage!=NULL);
	if (m_pImage==NULL) return false;

	//创建屏幕
	ASSERT(pDC!=NULL);
	Graphics graphics(pDC->GetSafeHdc());

	//获取属性
	INT nImageWidth=m_pImage->GetWidth();
	INT nImageHeight=m_pImage->GetHeight();

	//构造位置
	RectF rcDrawRect;
	rcDrawRect.X=(REAL)nXPos;
	rcDrawRect.Y=(REAL)nYPos;
	rcDrawRect.Width=(REAL)nImageWidth;
	rcDrawRect.Height=(REAL)nImageHeight;

	//绘画图像
	graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);

	return true;
}




//GDI+初始化
	GdiplusStartupInput m_GdiplusStartupInput;
	ULONG_PTR m_GdiplusToken;
	ULONG_PTR token=GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInput, NULL);

	//清除使用
	GdiplusShutdown(token);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: