想到总结这个问题是因为在先前的那个扫雷程序中,想实现在一个界面上显示当前的地雷的布局,实际上是显示一个二维数组,当时想了一些办法,觉得类似的可能用得上故作一个简单的总结。雷区的方格存储的是数字,-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);
显示的界面效果如下,
这种方法虽然可以实现显示一个二维数组的显示,但是,对于整个系统而言并不合适,因为这里的这个对话框是通过一个全局函数显示出来的,在切换等级后,再次让作弊地图显示时,前一个显示的界面并不会消失(不点击确定),这样切换越多,这个界面显示会很多,不易于控制,所以放弃这种,用下面的这种方法实现。
第二种,单独地再创建一个对话框,在这个对话框中显示雷区地雷的布局,这样还需要添加控件,看是显示在列表框还是编辑框中。开始是选择列表框,但是没有实现(后续再尝试能否行得通),后来通过编辑框实现了这个功能。这种方法的实现步骤为:
首先添加一个对话框资源,对这个对话框添加对应的类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();
因为当前地图的大小是自定义的,所以编辑框的大小也必须灵活对应。所以还需要改变一下编辑框中的属性信息。
界面显示如图下图所示:当界面比较大的时候,可能显示不下,所以编辑框的水平和垂直滑动条属性对应栏要设为true.
关于控件的运行就不单独列出来,在用到的时候再做相关的总结。