代码改变世界

CGridCtrl学习笔记1——前言和环境配置

  愤怒的青蛙  阅读(5305)  评论(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的消息相应函数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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.在菜单中添加一个测试项,添加响应函数如下(创建并显示一个对话框):

1
2
3
4
CProperDlg *pProDlg;
pProDlg = new CProperDlg();
pProDlg->Create(IDD_DIALOG_GRID,NULL);
pProDlg->ShowWindow(SW_SHOW);

5.编译运行程序,可以得到如下效果

PS:注意一个问题,刚想起来,如果直接将源文件添加进来的话,会编译错误,内容大概是CMemDC这个类重定义了,去网上搜了一下,大概是最初写这个类时,微软貌似没有这个类,后类微软自己写了这么一个类,所以导致重复定义,方法值将这个类改一个名字就好了,注意将引用这个类的地方也要改掉。

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示