MFC位绘图--如何将图数组显示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Calcular/article/details/47778005
#define SPACEM 100

class CSpace
{
public:
	int left;  //空间左上方绝对坐标x
	int top;  //空间左上方绝对坐标y
	int width;  //空间宽度
	int height;  //空间高度
	unsigned char space[SPACEM][SPACEM];  //生成2维度空间,0表示真空,1表示墙壁,2表示主角,3表示食物
public:
	CSpace(int ileft,int itop);
	~CSpace();
	void SetSpace(unsigned char in[SPACEM][SPACEM]);
	void DrawSpace(CDC *pDC);  
private:
protected:
};

CSpace::CSpace(int ileft,int itop)
{
	left=ileft;
	top=itop;
	width=SPACEM;
	height=SPACEM;
	int i,j;
	for(i=0;i<SPACEM;i++){
		for(j=0;j<SPACEM;j++)
			space[i][j]=0;}
}

CSpace::~CSpace()
{
}

void CSpace::SetSpace(unsigned char in[SPACEM][SPACEM])
{
	int i,j;
	for(i=0;i<SPACEM;i++)
		for(j=0;j<SPACEM;j++)
			space[i][j]=in[i][j];
}

void CSpace::DrawSpace(CDC *pDC)
{
	int i,j;
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);

	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC,500,500);
	memDC.SelectObject(&bmp);

	BITMAPINFO bmpInfo;
	bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmpInfo.bmiHeader.biWidth = 487;
	bmpInfo.bmiHeader.biHeight = -500;
	bmpInfo.bmiHeader.biPlanes = 1;
	bmpInfo.bmiHeader.biBitCount = 24;
	bmpInfo.bmiHeader.biCompression = BI_RGB;
	bmpInfo.bmiHeader.biSizeImage = 0;
	bmpInfo.bmiHeader.biXPelsPerMeter = 3000;
	bmpInfo.bmiHeader.biYPelsPerMeter = 3000;
	bmpInfo.bmiHeader.biClrUsed = 0;
	bmpInfo.bmiHeader.biClrImportant = 0;

	//每行字节数,4字节对齐
	long nLnBytes = (487*3+3)/4*4;

	BYTE *pData = new BYTE[nLnBytes*500];
	memset(pData,0,nLnBytes*500);
	for(i=0;i<SPACEM;i++)
	{
		for(j=0;j<SPACEM;j++)
		{
			if(space[i][j]==0)  //真空为白色
			{
				pData[i*nLnBytes+j*3+0]=255;
				pData[i*nLnBytes+j*3+1]=255;
				pData[i*nLnBytes+j*3+2]=255;
			}
			else if(space[i][j]==1)  //墙壁为黑色
			{
				pData[i*nLnBytes+j*3+0]=0;
				pData[i*nLnBytes+j*3+1]=0;
				pData[i*nLnBytes+j*3+2]=0;
			}
			else if(space[i][j]==2)  //主角为红色
			{
				pData[i*nLnBytes+j*3+0]=0;
				pData[i*nLnBytes+j*3+1]=0;
				pData[i*nLnBytes+j*3+2]=255;
			}
			else if(space[i][j]==3)  //食物为绿色
			{
				pData[i*nLnBytes+j*3+0]=0;
				pData[i*nLnBytes+j*3+1]=255;
				pData[i*nLnBytes+j*3+2]=0;
			}
			else
			{
				pData[i*nLnBytes+j*3+0]=0;
				pData[i*nLnBytes+j*3+1]=0;
				pData[i*nLnBytes+j*3+2]=0;
			}
		}
	}
	SetDIBits(pDC->m_hDC,bmp,0,500,pData,&bmpInfo,DIB_RGB_COLORS);
	delete []pData;
	pDC->StretchBlt(0,0,400,400,&memDC,0,0,SPACEM,SPACEM,SRCCOPY);
}
使用方法

该类中,成员space中存放了自定义调色板,整张位图空间大小为SPACEM*SPACEM

SetSpace可以把自定义的位图数组传入类实例中

DrawSpace可以将自定义位图数组显示

引入的pDC可以是静态控件,下面做了拉伸变换,可以通过改StretchBlt大小来控制拉伸大小


展开阅读全文

没有更多推荐了,返回首页