MFC在编辑框中显示一个二维数组

想到总结这个问题是因为在先前的那个扫雷程序中,想实现在一个界面上显示当前的地雷的布局,实际上是显示一个二维数组,当时想了一些办法,觉得类似的可能用得上故作一个简单的总结。雷区的方格存储的是数字,-1的位置表示地雷,其他的数字表示以那个数字为中心,周围8个格子所包含的地雷总个数。所以这个问题实际上是显示一个m_RowCount和m_ColCount列的二维数组。当时想了两种方法。下面就分别做一下介绍。

第一种显示在一个全局的对话框中。代码如下:

CString map_str=_T("");
CString tmp_str=_T("");

for(int i=0;i<m_ColCount;i++)
{
	for(int j=0;j<m_RowCount ;j++)
	{
	tmp_str=_T("");
	tmp_str.Format(_T("%-4d  "),m_Mine[j][i].iArondMineNum);
	map_str+=tmp_str;
	}
	map_str+=_T("\n");
}
::MessageBox(NULL,map_str.GetBuffer(),_T("作弊地图"),MB_OK);

显示的界面效果如下,

MFC在编辑框中显示一个二维数组_第1张图片
图1-1显示9*9矩阵

这种方法虽然可以实现显示一个二维数组的显示,但是,对于整个系统而言并不合适,因为这里的这个对话框是通过一个全局函数显示出来的,在切换等级后,再次让作弊地图显示时,前一个显示的界面并不会消失(不点击确定),这样切换越多,这个界面显示会很多,不易于控制,所以放弃这种,用下面的这种方法实现。

第二种,单独地再创建一个对话框,在这个对话框中显示雷区地雷的布局,这样还需要添加控件,看是显示在列表框还是编辑框中。开始是选择列表框,但是没有实现(后续再尝试能否行得通),后来通过编辑框实现了这个功能。这种方法的实现步骤为:

首先添加一个对话框资源,对这个对话框添加对应的类CCheatMap,然后再在界面中添加一个编辑框控件,修改它的ID,并关联一个CString的成员变量m_strtemp。这里首先是获取雷区中整个的数字信息,整体是一个字符串,最后将这个字符串传给类CCheatMap的对象dlg的成员变量m_strtemp。最终显示在编辑框中的是m_strtemp,而编辑框中的显示必须和当前界面的行列一致,还必须换行显示,map_str+=_T("\r\n");还要用到转移字符,更多转义字符的信息详见:http://blog.csdn.net/shufac/article/details/20492085

代码如下:

Mine mine1[50][50];  //最大雷区
	for(int i=0;i<m_ColCount;i++)
	{
		for(int j=0;j<m_RowCount ;j++)
		{
			mine1[j][i]=m_Mine[j][i];
		}
	}
	CCheatMap dlg;	
	CString map_str=_T("");
	CString tmp_str=_T("");
	int i=0;
	for(int i=0;i<m_ColCount;i++)
	{
		for(int j=0;j<m_RowCount ;j++)
		{
			tmp_str=_T("");
			//-1的位置为雷的位置,显示的时候为保证一致性显示为9的位置为雷位
			if(mine1[j][i].iArondMineNum==-1)

				tmp_str=_T("X   ");			
			else

				tmp_str.Format(_T("%-4d"),mine1[j][i].iArondMineNum);			

			map_str+=tmp_str;
		}
		map_str+=_T("\r\n");		
	}
	dlg.m_strtemp=map_str;
	dlg.DoModal();


因为当前地图的大小是自定义的,所以编辑框的大小也必须灵活对应。所以还需要改变一下编辑框中的属性信息。

界面显示如图下图所示:
MFC在编辑框中显示一个二维数组_第2张图片
图1-2第二种方式显示9*9矩阵示意图

当界面比较大的时候,可能显示不下,所以编辑框的水平和垂直滑动条属性对应栏要设为true.

关于控件的运行就不单独列出来,在用到的时候再做相关的总结。



你可能感兴趣的:(二维数组,mfc,显示,编辑框)