CGridCtrl学习笔记1——前言和环境配置
2011-05-25 17:09 愤怒的青蛙 阅读(5268) 评论(3) 编辑 收藏 举报这学期的GIS程序设计需要做一个课程设计,其实就是用MapX的组件做一个二次开发,关于GIS的内容其实挺简单的,但是有一个问题有点大,就是需要使用表格显示属性数据,这个说实话还是有点头疼的,以前从来没用过表格空间,也没写过类似的程序,开始去论坛去搜了一下,有人推荐使用MSFlexGrid控件,我试着用了一下,写了一个测试程序,发现用起来还是挺方便的,但是有几个问题令我实在是无法忍受,最后只好放弃了,第一个问题是,这个空间不支持跨行的多行选择,只支持连续多行选择,这个显然不靠谱,当我在地图上框选元素的时候,需要在属性表中对应标示出来,但是如果不支持跨行选择的怎么标示,后来没办法,使用模拟的方法,就是将选中行的背景颜色改掉,标示它为选中,这就出现第二个问题,那就是当对话框处于显示状态是,当我更新背景颜色时,表格会刷新显示,但是速度慢的是在是令我无法忍受,这我就无语了,试了很多方法,都没有解决,后来和老师讨论了一下,他说还是换一个控件吧,网上有很多好用的控件,于是又去求助Google,发现很多人都推荐CGridCtrl这个表格控件,于是去网上下载了源码和一个Demo,运行Demo试了一下,感觉还是相当不错的,最起码没有上面两个问题,于是今天开始搭环境,用这个空间先写一个小程序测试一下,下面把我的过程和遇到的问题及解决方法记录一下。
先说一下,开发环境是VS2010英文版(有可能会有一些操作使用英文叙述,应该可以翻译后在中文版对应找到相应功能),操作系统是Window7 SP1
1.首先是去官网下载源码和Demo,建议将demo下载下来,后面遇到问题是可以有一个参照的解决方法,官网地址是:http://www.codeproject.com/KB/miscctrl/gridctrl.aspx
2.按照官网上的说明(注意,我没有这样做),新建一个MFC程序,添加一个对话框资源,并创建对应的包装类,再添加一个custom control控件,然后给改控件添加一个Control变量,类型设为CGridCtrl(注意一点,官网上说设为MFCGridCtrl,但是看完源码后没有发现这个类,只有CGridCtrl),名称定为m_Gird。然后在对话框的交互定义中将DDX_Control改为DDX_GridControl,然后就显示,然后添加相应代码可以实现相应功能,但是我按照这个方法试了一下,发现怎么都搞不定,总是会在调用ShowWindow()方法时出现错误,提示在winocc.cpp文件的某处出现错误,去搜了一下,也没有找到解决办法。
修正一下,官网上说的没有问题,是我理解错误了,应该是将CustomControl的属性中的类设置为MFCGridControl,如下图
这样做以后没有问题,可以正常运行。。。
3.于是又去搜了一下怎么办,在CSDN的博客(http://blog.csdn.net/skyremember/archive/2008/11/02/3207556.aspx)上找到了解决方法(PS:我是这么做成功的),根据他的方法,首先将CGridCtrl源文件全部添加到工程中,然后在同上面相同,添加对话框和相应的包装类,然后在包装类的头文件中将GridCtrl.h包含进来,在定义一个成员变量CGridCtrl *m_Grid,然后添加WM_SHOWWINDOW的消息相应函数如下
CDialogEx::OnShowWindow(bShow, nStatus); // TODO: Add your message handler code here if (m_Grid != NULL) { delete m_Grid; m_Grid = NULL; } else { m_Grid = new CGridCtrl(); CRect rect; GetDlgItem(IDC_AREA)->GetWindowRect(rect); ScreenToClient(&rect); // m_Grid->MoveWindow(rect); m_Grid->Create(rect,this,100); m_Grid->SetEditable(FALSE); m_Grid->SetTextBkColor(RGB(255,255,255)); try { m_Grid->SetRowCount(10); m_Grid->SetColumnCount(10); m_Grid->SetFixedRowCount(1); m_Grid->SetFixedColumnCount(1); } catch (CMemoryException* e) { e->ReportError(); e->Delete(); } for (int i = 0; i < m_Grid->GetRowCount(); i++) { for (int j = 0; j < m_Grid->GetColumnCount(); j++) { GV_ITEM Item; Item.mask = GVIF_TEXT; Item.row = i; Item.col = j; Item.strText.Format(_T("2"),2); m_Grid->SetItem(&Item); } } m_Grid->Invalidate(); }
4.在菜单中添加一个测试项,添加响应函数如下(创建并显示一个对话框):
CProperDlg *pProDlg; pProDlg = new CProperDlg(); pProDlg->Create(IDD_DIALOG_GRID,NULL); pProDlg->ShowWindow(SW_SHOW);
5.编译运行程序,可以得到如下效果
PS:注意一个问题,刚想起来,如果直接将源文件添加进来的话,会编译错误,内容大概是CMemDC这个类重定义了,去网上搜了一下,大概是最初写这个类时,微软貌似没有这个类,后类微软自己写了这么一个类,所以导致重复定义,方法值将这个类改一个名字就好了,注意将引用这个类的地方也要改掉。