技术标签: CGridListCtrlEx MFC
MFC是一种用c++设计交互界面的的开发工具,在二三十年前比较流行,但目前比较少用了。所以现在使用MFC进行开发,相关资料的查找也比较困难。最近做了一个与MFC有关的项目,其中用到的相关知识总结于此。在使用工具时,最好的资料其实就是那个库本身,查看库内的代码总会有意想不到的收获。本人用的是VS2017专业版里面的MFC。本章主要是复现老外使用CGridListCtrlEx绘制表格。老外的链接如下:
CGridListCtrlEx,文末附老外和个人代码地址。
上面网址上有两个下载地址,里面的例子都是可以用的,这里只展示一个例子,运行界面,有图表,日期,checkbox还有超链接。
如果能够连接维基百科,点击超链接是可以打开的
表格还可以进行排序,拖动等操作。
新建项目的过程请参照总结一,现在项目已经创建好了
首先将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;
各种功能基本都实现了,但还是有一个小遗憾,表格中上下之间不能拖动交换顺序,而原代码中是可以的,个人找了好久,未果,但没有寻病终(哈哈哈!),在此,寻好心人求解。
老外代码链接.
个人代码链接.
tableau 使命:tableau是一个可视化分析平台,也可以是一种辅助性决策的工具软件,它改变了我们使用数据解决问题的方式,使个人和组织能够充分利用自己的数据。它的能力1.tableau帮助个人和组织提供数据驱动水平2.凭借人人可用的直观可视化分析,打破了商业智能行业的原有格局3.tableau帮助人们使用数据推动变革客户现身说法...
var str="HELLOWORLD" ; var arr=[] ; for(var i=0 ;i<str.length ;i++){ var char=str[i] ; //console.log(char) ; //通过打印char我们得到的是下面这样一个关联数组 ; ’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:首先空串题目认为是有效字符串,这里只需简单判断...
深度学习里面的各种参数做一个学习记录提示:自己根据自己的理解写的,水平有限,仅供参考,如有错误,欢迎指正个人学习记录,仅供参考深度学习里面的各种参数做一个学习记录1. batchsize,iteration,epoch2. filter,kernel_size,stride,padding3. ReLU,sigmoid,softmax4. BatchNormal,Dropout,num_classes,mini_batch5. receptive field1. batchsize,iteratio
本资源包含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总线隔离中继器、canbridge、CanRepeater的can波特率和验收滤波设置。波特率支持2.5kbps~1Mbps之间任意设置,验收滤波设置支持20个组合的列表或屏蔽模式的ID过滤。1、配套的配置软件是绿色软件,无需安装,直接双击打开软件:2、搜索设备-读取配置3、设置can通道通讯波特率“CAN0参数”设置界面对应can总线隔离中继器的CAN1通道;“CAN1参数...
假如我们有一个文本文件 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指令一样.
1. 为什么要引入Inverse Reinforcement Learning2. Inverse RL问题的定义3. 经典方法3.1 Feature Matching IRL & Maximum Margin Planning3.2 Maximum Entropy IRL4. 与深度学习结合的方法4.1 Guided Cost Learing Algorithm4.2 IRL & GANs...
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]
花了一周的时间把琅琊榜看完,算是对琅琊榜的敬畏吧。之前看到电视剧,觉得电视剧拍的挺好的。所以就把书找来看了。看完之后感慨万千。在知乎上找到了人物关系图。给我的感触是,你可能有理想,可能理想很大,看着不可能实现,但是坚持脚踏实地,步步为营,最终你会实现你的梦想。转载于:https://www.cnblogs.com/LoganChen/p/8929593.html...
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