关于MFC的使用总结之七——复现CGridListCtrlEx绘制表格_墨藍的博客-程序员宝宝_cgridlistctrlex

技术标签: CGridListCtrlEx  MFC  

MFC的使用总结之七——复现CGridListCtrlEx绘制表格

写在前面

MFC是一种用c++设计交互界面的的开发工具,在二三十年前比较流行,但目前比较少用了。所以现在使用MFC进行开发,相关资料的查找也比较困难。最近做了一个与MFC有关的项目,其中用到的相关知识总结于此。在使用工具时,最好的资料其实就是那个库本身,查看库内的代码总会有意想不到的收获。本人用的是VS2017专业版里面的MFC。本章主要是复现老外使用CGridListCtrlEx绘制表格。老外的链接如下:
CGridListCtrlEx,文末附老外和个人代码地址。

示例展示

上面网址上有两个下载地址,里面的例子都是可以用的,这里只展示一个例子,运行界面,有图表,日期,checkbox还有超链接。
在这里插入图片描述
如果能够连接维基百科,点击超链接是可以打开的
在这里插入图片描述
表格还可以进行排序,拖动等操作。
在这里插入图片描述

复现CGridListCtrlEx

文件导入

新建项目的过程请参照总结一,现在项目已经创建好了
在这里插入图片描述
首先将cgridlistctrlex_demo里面的CGridListCtrlEx文件夹全体复制到创建的.sln目录中
在这里插入图片描述
将CListCtrl_DataModel.h复制到.h和.cpp的那个目录下。
在项目的属性页中将CGridListCtrlEx文件里面的文件和CListCtrl_DataModel.h部添加到项目中
在这里插入图片描述
将原文夹res中的国旗图标复制到现在的res中
在这里插入图片描述
在资源视图的Icon添加这些资源,选中Icon,选择导入,可以更具需求更不更改名称都行
在这里插入图片描述

新建控件

从工具箱中拖入List Control
在这里插入图片描述
查看器属性页,一定要将View选项选成Report,个人因为这个原因复现好久都一直报错。
在这里插入图片描述
之后得到的界面就变成下面这个样子了
在这里插入图片描述

添加代码

在GridlistDlg.h中添加头文件

#include "afxcmn.h"

#include "..\CGridListCtrlEx\CGridListCtrlGroups.h"
#include "CListCtrl_DataModel.h"

添加定义

private:
	CGridListCtrlGroups m_ListCtrl;
	CListCtrl_DataModel m_DataModel;
	CImageList m_ImageList;

	CGridlistDlg(const CGridlistDlg&);
	CGridlistDlg& operator=(const CGridlistDlg&);

在GridlistDlg.cpp中添加头文件

#include "..\CGridListCtrlEx\CGridColumnTraitDateTime.h"
#include "..\CGridListCtrlEx\CGridColumnTraitEdit.h"
#include "..\CGridListCtrlEx\CGridColumnTraitCombo.h"
#include "..\CGridListCtrlEx\CGridColumnTraitHyperLink.h"
#include "..\CGridListCtrlEx\CGridRowTraitXP.h"
#include "..\CGridListCtrlEx\ViewConfigSection.h"

在void CGridlistDlg::DoDataExchange(CDataExchange* pDX)添加绑定

void CGridlistDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
}

在BOOL CGridlistDlg::OnInitDialog()添加代码区添加片段

	// Create and attach image list
	m_ImageList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 1, 0);
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
	int nStateImageIdx = CGridColumnTraitDateTime::AppendStateImages(m_ListCtrl, m_ImageList);	// Add checkboxes

	m_ListCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);

	// Give better margin to editors
	m_ListCtrl.SetCellMargin(1.2);
	CGridRowTraitXP* pRowTrait = new CGridRowTraitXP;
	m_ListCtrl.SetDefaultRowTrait(pRowTrait);
	m_ListCtrl.EnableVisualStyles(true);

	// Create Columns
	m_ListCtrl.InsertHiddenLabelColumn();	// Requires one never uses column 0

	for (int col = 0; col < m_DataModel.GetColCount(); ++col)
	{
		const CString& title = m_DataModel.GetColTitle(col);
		CGridColumnTrait* pTrait = NULL;
		if (col == 0)	// Country
		{
			CGridColumnTraitCombo* pComboTrait = new CGridColumnTraitCombo;
			const vector<CString>& countries = m_DataModel.GetCountries();
			for (size_t i = 0; i < countries.size(); ++i)
				pComboTrait->AddItem((DWORD_PTR)i, countries[i]);
			pTrait = pComboTrait;
		}
		if (col == 1)	// City
		{
			pTrait = new CGridColumnTraitEdit;
		}
		if (col == 2)	// Year won
		{
			CGridColumnTraitDateTime* pDateTimeTrait = new CGridColumnTraitDateTime;
			pDateTimeTrait->AddImageIndex(nStateImageIdx, _T(""), false);		// Unchecked (and not editable)
			pDateTimeTrait->AddImageIndex(nStateImageIdx + 1, COleDateTime(1970, 1, 1, 0, 0, 0).Format(), true);	// Checked (and editable)
			pDateTimeTrait->SetToggleSelection(true);
			pTrait = pDateTimeTrait;
		}
		if (col == 3)	// Year won
		{
			CGridColumnTraitHyperLink* pHyperLinkTrait = new CGridColumnTraitHyperLink;
			pHyperLinkTrait->SetShellFilePrefix(_T("http://en.wikipedia.org/wiki/UEFA_Euro_"));
			pTrait = pHyperLinkTrait;
		}

		m_ListCtrl.InsertColumnTrait(col + 1, title, LVCFMT_LEFT, 100, col, pTrait);
	}

	// Insert data into list-control by copying from datamodel
	int nItem = 0;
	for (size_t rowId = 0; rowId < m_DataModel.GetRowIds(); ++rowId)
	{
		nItem = m_ListCtrl.InsertItem(++nItem, m_DataModel.GetCellText(rowId, 0));
		m_ListCtrl.SetItemData(nItem, rowId);
		for (int col = 0; col < m_DataModel.GetColCount(); ++col)
		{
			int nCellCol = col + 1;	// +1 because of hidden column
			const CString& strCellText = m_DataModel.GetCellText(rowId, col);
			m_ListCtrl.SetItemText(nItem, nCellCol, strCellText);
			if (nCellCol == 3)
			{
				if (strCellText == _T(""))
					m_ListCtrl.SetCellImage(nItem, nCellCol, nStateImageIdx);	// unchecked
				else
					m_ListCtrl.SetCellImage(nItem, nCellCol, nStateImageIdx + 1);	// checked
			}
		}
		m_ListCtrl.SetCellImage(nItem, 1, nItem); // Assign flag-images
	}

	CViewConfigSectionWinApp* pColumnProfile = new CViewConfigSectionWinApp(_T("Sample List"));
	pColumnProfile->AddProfile(_T("Default"));
	pColumnProfile->AddProfile(_T("Special"));
	m_ListCtrl.SetupColumnConfig(pColumnProfile);

之前要是有比较认真的小伙伴把那个ICON的名字该成和原代码一样的,请用如下代码替换对应部分

	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGDEN));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGGERM));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGFRAN));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGGREEC));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGSWED));
	m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FLGSPAIN));

至此,整个项目好像都复制过来了,试着运行一下应该没问题,结果发现好多错。
在这里插入图片描述
还有最后一个很重要的地方就是预编译器(stdafx.h)里面还需要引入头文件。这种使用预编译器的项目,这个也是一个大坑,至于要在其中加入下面几行代码就没错了

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

运行结果

各种功能基本都实现了,但还是有一个小遗憾,表格中上下之间不能拖动交换顺序,而原代码中是可以的,个人找了好久,未果,但没有寻病终(哈哈哈!),在此,寻好心人求解。
在这里插入图片描述
老外代码链接.
个人代码链接.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36289191/article/details/103492644

智能推荐

大数据BI工具Tableau学习【第一期】:Tableau简介和安装_张国荣家的弟弟的博客-程序员宝宝_bi工具tableau

tableau 使命:tableau是一个可视化分析平台,也可以是一种辅助性决策的工具软件,它改变了我们使用数据解决问题的方式,使个人和组织能够充分利用自己的数据。它的能力1.tableau帮助个人和组织提供数据驱动水平2.凭借人人可用的直观可视化分析,打破了商业智能行业的原有格局3.tableau帮助人们使用数据推动变革客户现身说法...

统计一个字符串中每种字符出现的次数 ?_Sword_meaning的博客-程序员宝宝

var str="HELLOWORLD" ; var arr=[] ; for(var i=0 ;i&lt;str.length ;i++){ var char=str[i] ; //console.log(char) ; //通过打印char我们得到的是下面这样一个关联数组 ; ![](https://img-blog.csdnimg.cn/20191109153203371.pn...

Leetcode--计算一个字符串中最长的有效括号字符长度_你听的到、的博客-程序员宝宝

Leetcode–计算一个字符串中最长的有效括号字符长度首先这又是一道括号匹配的问题,我这里先记录一下之前几道类似的题目:1、给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:首先空串题目认为是有效字符串,这里只需简单判断...

深度学习中遇到的各种参数总结_躺着醒,醒着睡的博客-程序员宝宝_深度学习中的参数

深度学习里面的各种参数做一个学习记录提示:自己根据自己的理解写的,水平有限,仅供参考,如有错误,欢迎指正个人学习记录,仅供参考深度学习里面的各种参数做一个学习记录1. batchsize,iteration,epoch2. filter,kernel_size,stride,padding3. ReLU,sigmoid,softmax4. BatchNormal,Dropout,num_classes,mini_batch5. receptive field1. batchsize,iteratio

TDC-GP22的研究_我信张i的博客-程序员宝宝_tdc-gp22

本资源包含TDC-GP22的使用手册,TDC芯片寄存器的官方配置,本人基于stm32写的TDC-GP22寄存器配置程序,TDC-GP22的接线图和一个用文档方式写的注意事项文件:url80.ctfile.com/f/25127180-557023468-dd5834(访问密码:551685)以下内容无关:setState同步异步场景React通过this.state来访问state,通过this.setState()方法来更新state,当this.setState()方法被调用的时候,Reac

随便推点

CAN中继 can总线中继器、can总线中继模块波特率和滤波设置_mmprime的博客-程序员宝宝_can中继器

can总线隔离中继器、canbridge、CanRepeater的can波特率和验收滤波设置。波特率支持2.5kbps~1Mbps之间任意设置,验收滤波设置支持20个组合的列表或屏蔽模式的ID过滤。1、配套的配置软件是绿色软件,无需安装,直接双击打开软件:2、搜索设备-读取配置3、设置can通道通讯波特率“CAN0参数”设置界面对应can总线隔离中继器的CAN1通道;“CAN1参数...

Bash shell echo如何原生输出带空格的字符串而不换行_ethnicitybeta的博客-程序员宝宝_shell输出空格

假如我们有一个文本文件 coder.txt,内容如下:Twinkle, twinkle, little star,How I wonder what you are.然后我们使用 cat 逐行打印这个文件,在终端中执行以下指令:cat coder.txt输出效果:那么现在有一个需求,假如需要对每行文本做进一步的处理,在bash中使用for循环逐行处理。我们先这样写:for f in `cat coder.txt`; do echo $f; done我们预期会像cat指令一样.

CS285课程笔记(6)——Inverse Reinforcement Learning_RavenRaaven的博客-程序员宝宝

1. 为什么要引入Inverse Reinforcement Learning2. Inverse RL问题的定义3. 经典方法3.1 Feature Matching IRL &amp; Maximum Margin Planning3.2 Maximum Entropy IRL4. 与深度学习结合的方法4.1 Guided Cost Learing Algorithm4.2 IRL &amp; GANs...

[EI检索]2022智能制造、先进传感与大数据国际会议诚邀您关注_m0_64094619的博客-程序员宝宝

International Conference on Intelligent Manufacturing, Advanced Sensing and Big Data一、基本信息【大会官网】:http://www.imasbd.org/【会议时间】:2022年3月18-20日【会议地点】:中国 .桂林【截稿日期】:2022年1月18号【录用/拒稿通知】:投稿后7-15个工作日【收录检索】:EI、Scopus。出版:Elsevier【官方邮箱】:[email protected]

琅琊榜读书笔记_dieyuqi2955的博客-程序员宝宝

花了一周的时间把琅琊榜看完,算是对琅琊榜的敬畏吧。之前看到电视剧,觉得电视剧拍的挺好的。所以就把书找来看了。看完之后感慨万千。在知乎上找到了人物关系图。给我的感触是,你可能有理想,可能理想很大,看着不可能实现,但是坚持脚踏实地,步步为营,最终你会实现你的梦想。转载于:https://www.cnblogs.com/LoganChen/p/8929593.html...

Flink流处理框架总结_坚果大叔的博客-程序员宝宝

Flink流处理框架第一部分 Flink 概述第 1 节 什么是 Flink第 2 节 Flink 特点第 2 节 Flink 应用场景第 4 节 Flink 核心组成及生态发展第 5 节 Flink 处理模型:流处理与批处理第 6 节 流处理引擎的技术选型第二部分 Flink快速应用第 1 节 单词统计案例(批数据)1.1 需求1.2 代码实现第 2 节 单词统计案例(流数据)2.1 需求2.2 代码实现第三部分 Flink体系结构第 1 节 Flink的重要角色第 2 节 Flink运行架构2.1 Fl

推荐文章

热门文章

相关标签