zoukankan      html  css  js  c++  java
  • CGridCtrl学习笔记1——前言和环境配置

    这学期的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这个类重定义了,去网上搜了一下,大概是最初写这个类时,微软貌似没有这个类,后类微软自己写了这么一个类,所以导致重复定义,方法值将这个类改一个名字就好了,注意将引用这个类的地方也要改掉。

  • 相关阅读:
    原理Lambda表达式
    关于Web.config的debug和release.config文件
    利用GeoIP数据库及API进行地理定位查询 Java
    JSONP跨域的原理解析
    如何处理JSON中的特殊字符
    IIS下防止mdb数据库被下载的实现方法
    点击文字选中radio
    关于微信40029错误
    nopcommerce的WidgetZones
    js判断移动终端(手机浏览器)
  • 原文地址:https://www.cnblogs.com/madhenry/p/2056858.html
Copyright © 2011-2022 走看看