MFC表格控件CListCtrl的改造及用法

1、目的

  简单描述MFC的表格控件使用方法。Qt适用习惯了以后MFC用的比较别扭,因此记录一下以备后续复制代码使用。由于MFC原生的CListCtrl比较局限,比如无法改变表格的背景色、文字颜色等设定,因此先对CListCtrl类进行重写,以便满足要求。

2、CListCtrl类改造

#pragma onceclass CustomListCtrl : public CListCtrl
{DECLARE_DYNAMIC(CustomListCtrl)public:CustomListCtrl();virtual ~CustomListCtrl();protected:DECLARE_MESSAGE_MAP()virtual void PreSubclassWindow();
public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);public:afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);public:CPtrList m_ptrListCol;  //保存列颜色CPtrList m_ptrListItem; //保存Item颜色表CPtrList m_colTextColor; //保存列字体颜色CPtrList m_ItemTextColor; //保存单元格字体颜色bool FindColColor(int col, COLORREF& color); //查找列颜色bool FindItemColor(int col, int row, COLORREF& color);void SetColColor(int col, COLORREF color);  //设置列颜色void SetItemColor(int col, int row, COLORREF color); //设置Item颜色void SetColTextColor(int col, COLORREF color);   //设置列文本颜色void SetItemTextColor(int col, int row, COLORREF color);COLORREF m_color;BOOL SetTextColor(COLORREF cr);
public:// 字体高度int m_fontHeight;// 字体宽度int m_fontWith;
};#include "pch.h"
#include "CustomListCtrl.h"// CustomListCtrl.cpp : 实现文件
//
struct stColor
{int nRow;int nCol;COLORREF rgb;
};
// CustomListCtrlIMPLEMENT_DYNAMIC(CustomListCtrl, CListCtrl)CustomListCtrl::CustomListCtrl():m_fontHeight(12),m_fontWith(0)
{m_color = RGB(0, 0, 0);
}CustomListCtrl::~CustomListCtrl()
{
}BEGIN_MESSAGE_MAP(CustomListCtrl, CListCtrl)ON_WM_MEASUREITEM()ON_WM_MEASUREITEM_REFLECT()
END_MESSAGE_MAP()// CustomListCtrl 消息处理程序void CustomListCtrl::PreSubclassWindow()
{// TODO: 在此添加专用代码和/或调用基类ModifyStyle(0, LVS_OWNERDRAWFIXED);CListCtrl::PreSubclassWindow();
}void CustomListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{// TODO: 添加您的代码以绘制指定项TCHAR lpBuffer[256];LV_ITEM lvi;lvi.mask = LVIF_TEXT | LVIF_PARAM;lvi.iItem = lpDrawItemStruct->itemID;lvi.iSubItem = 0;lvi.pszText = lpBuffer;lvi.cchTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));LV_COLUMN lvc, lvcprev;::ZeroMemory(&lvc, sizeof(lvc));::ZeroMemory(&lvcprev, sizeof(lvcprev));lvc.mask = LVCF_WIDTH | LVCF_FMT;lvcprev.mask = LVCF_WIDTH | LVCF_FMT;CDC* pDC;pDC = CDC::FromHandle(lpDrawItemStruct->hDC);CRect rtClient;GetClientRect(&rtClient);for (int nCol = 0; GetColumn(nCol, &lvc); nCol++){if (nCol > 0){// Get Previous Column Width in order to move the next display itemGetColumn(nCol - 1, &lvcprev);lpDrawItemStruct->rcItem.left += lvcprev.cx;lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left;}CRect rcItem;if (!GetSubItemRect(lpDrawItemStruct->itemID, nCol, LVIR_LABEL, rcItem))continue;::ZeroMemory(&lvi, sizeof(lvi));lvi.iItem = lpDrawItemStruct->itemID;lvi.mask = LVIF_TEXT | LVIF_PARAM;lvi.iSubItem = nCol;lvi.pszText = lpBuffer;lvi.cchTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));CRect rcTemp;rcTemp = rcItem;if (nCol == 0){rcTemp.left -= 2;}if (lpDrawItemStruct->itemState & ODS_SELECTED){pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT));pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));}else{COLORREF color;color = GetBkColor();pDC->FillSolidRect(rcTemp, color);if (FindColColor(nCol, color)){pDC->FillSolidRect(rcTemp, color);}if (FindItemColor(nCol, lpDrawItemStruct->itemID, color)){pDC->FillSolidRect(rcTemp, color);}}pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));UINT uFormat = DT_CENTER;TEXTMETRIC metric;pDC->GetTextMetrics(&metric);int ofst;ofst = rcItem.Height() - metric.tmHeight;rcItem.OffsetRect(0, ofst / 2);pDC->SetTextColor(m_color);CFont nFont, * nOldFont;nFont.CreateFont(m_fontHeight, m_fontWith, 0, 0, 0, FALSE, FALSE, 0, 0, 0, 0, 0, 0, _TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont);DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat);pDC->SelectStockObject(SYSTEM_FONT);}
}void CustomListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
void CustomListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{}bool CustomListCtrl::FindColColor(int col, COLORREF& color) //查找列颜色
{int flag = 0;for (POSITION pos = m_ptrListCol.GetHeadPosition(); pos != NULL;){stColor* pColor = (stColor*)m_ptrListCol.GetNext(pos);if (pColor->nCol == col){flag = 1;color = pColor->rgb;break;}}if (1 == flag){return true;}return false;
}bool CustomListCtrl::FindItemColor(int col, int row, COLORREF& color) //查找颜色
{int flag = 0;for (POSITION pos = m_ptrListItem.GetHeadPosition(); pos != NULL;){stColor* pColor = (stColor*)m_ptrListItem.GetNext(pos);if (pColor->nCol == col && pColor->nRow == row){flag = 1;color = pColor->rgb;break;}}if (1 == flag){return true;}return false;
}void CustomListCtrl::SetColColor(int col, COLORREF color) //设置列颜色
{stColor* pColor = new stColor;pColor->nCol = col;pColor->rgb = color;m_ptrListCol.AddTail(pColor);
}void CustomListCtrl::SetItemColor(int col, int row, COLORREF color) //设置格子颜色
{stColor* pColor = new stColor;pColor->nCol = col;pColor->nRow = row;pColor->rgb = color;m_ptrListItem.AddTail(pColor);
}BOOL CustomListCtrl::SetTextColor(COLORREF cr)  //设置字体颜色
{m_color = cr;return TRUE;
}void CustomListCtrl::SetColTextColor(int col, COLORREF color)
{stColor* pColor = new stColor;pColor->nCol = col;pColor->rgb = color;m_colTextColor.AddTail(pColor);
}void CustomListCtrl::SetItemTextColor(int col, int row, COLORREF color)
{stColor* pColor = new stColor;pColor->nCol = col;pColor->nRow = row;pColor->rgb = color;m_ItemTextColor.AddTail(pColor);
}

3、表格初始化

  初始化表格界面效果
在这里插入图片描述

// 初始化表格界面
CustomListCtrl m_listInput;
void CTestDlg::OnInitInputCtrl()
{CRect rect;m_listInput.GetClientRect(&rect);int nWidth = rect.Width() - 15;m_listInput.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);m_listInput.InsertColumn(0, _T("分支号"), LVCFMT_CENTER, nWidth * 0.08);m_listInput.InsertColumn(1, _T("名称"), LVCFMT_CENTER, nWidth * 0.1);m_listInput.InsertColumn(2, _T("始节点"), LVCFMT_CENTER, nWidth * 0.08);m_listInput.InsertColumn(3, _T("终节点"), LVCFMT_CENTER, nWidth * 0.08);m_listInput.InsertColumn(4, _T("需风类型"), LVCFMT_CENTER, nWidth * 0.1);m_listInput.InsertColumn(5, _T("风阻R"), LVCFMT_CENTER, nWidth * 0.1);m_listInput.InsertColumn(6, _T("风阻△R"), LVCFMT_CENTER, nWidth * 0.1);m_listInput.InsertColumn(7, _T("需风量Q(m3/s)"), LVCFMT_CENTER, nWidth * 0.15);m_listInput.InsertColumn(8, _T("风量△Q"), LVCFMT_CENTER, nWidth * 0.14);m_listInput.InsertColumn(9, _T("调节性"), LVCFMT_CENTER, nWidth * 0.1);
}

4、表格插入内容

在这里插入图片描述

// 表格插入内容
void CTestDlg::setInputData()
{m_listInput.DeleteAllItems();std::sort(m_vecInit.begin(), m_vecInit.end());for (int i = 0; i < m_vecInit.size(); ++i){stu_GraphParams& windResult = m_vecInit[i];CString sTmp;// 分支号sTmp.Format("%d", windResult.nNumber);m_listInput.InsertItem(i, sTmp);// 名称m_listInput.SetItemText(i, 1, windResult.sName);// 始节点sTmp.Format("%d", windResult.nStartJunction);m_listInput.SetItemText(i, 2, sTmp);// 终节点sTmp.Format("%d", windResult.nEndJunction);m_listInput.SetItemText(i, 3, sTmp);// 需风类型m_listInput.SetItemText(i, 4, _T("自然"));// 风阻CString strResistance;strResistance.Format("%.6f", windResult.dResistance);m_listInput.SetItemText(i, 5, strResistance);// △风阻CString strResistanceEx;strResistanceEx.Format("%.6f", windResult.dResistanceEx);m_listInput.SetItemText(i, 6, strResistanceEx);// 数值改变的话修改单元格颜色bool bChange = (strResistanceEx.CompareNoCase(strResistance) != 0) ? true : false;if(windResult.dResistanceEx > 0.000001f && bChange){COLORREF cf = RGB(255, 0, 0);m_listInput.SetItemColor(6,i,cf);}// 需风量sTmp.Format("%.3f", windResult.dFlowRate);m_listInput.SetItemText(i, 7, sTmp);// 风量sTmp.Format("%.3f", windResult.dFlowRateEx);m_listInput.SetItemText(i, 8, sTmp);// 调节性bool bAdjust = windResult.bAdjust;if (bAdjust){m_listInput.SetItemText(i, 9, _T("是"));}else{m_listInput.SetItemText(i, 9, _T("否"));}}
}

5、双击获取表格选中行的内容

// 双击事件
void CTestDlg::OnNMDblclkInputList(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);*pResult = 0;// TODO: 在此添加控件通知处理程序代码int nIndex = m_listInput.GetNextItem(-1, LVIS_SELECTED);POSITION ps = m_listInput.GetFirstSelectedItemPosition();if (NULL == ps){return;}int nItem = m_listInput.GetNextSelectedItem(ps);stu_WindEdgeInfo windEdgeInfo;windEdgeInfo.sEdgeId = m_listInput.GetItemText(nItem, 0);windEdgeInfo.sName = m_listInput.GetItemText(nItem, 1);windEdgeInfo.sStartIndex = m_listInput.GetItemText(nItem, 2);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Carla教程一:动力学模型到LQR

Carla教程一、动力学模型到LQR 从运动学模型和动力学模型到LQR 模型就是可以描述车辆运动规律的模型。车辆建模都是基于自行车模型的设定,也就是将四个轮子抽象为自行车一样的两个轮子来建模。 1、运动学模型 运动学模型是基于几何关系分析出来的,一般适用于低俗情况下,…

【监控系统】可视化工具Grafana简介及容器化部署实战

1.什么是Grafana 官网地址&#xff1a;https://grafana.com/ Grafana用Go语言开发的开源数据可视化工具&#xff0c;可以做数据监控和数据统计&#xff0c;带有告警功能。支持快速灵活的客户端图表&#xff0c;面板插件有许多不同方式的可视化指标和日志&#xff0c;官方库中…

【NLP】无服务器问答系统

一、说明 在NLP的眼见的应用&#xff0c;就是在“ 当你在谷歌上提出一个问题并立即得到答案时会发生什么&#xff1f;例如&#xff0c;如果我们在谷歌搜索中询问谁是美国总统&#xff0c;我们会得到以下回答&#xff1a;Joe Biden&#xff1b;这是一个搜索问题&#xff0c;同时…

SpringCloudAlibaba微服务实战系列(一)Nacos服务注册发现

SpringCloudAlibaba微服务实战系列&#xff08;一&#xff09;Nacos服务注册发现 实战前先做一个背景了解。 单体架构、SOA和微服务 单体架构&#xff1a;近几年技术的飞速发展&#xff0c;各种各样的服务已经进入到网络化。单体架构发布时只需要打成一个war或jar包发布即可&a…

jar 命令实践

jar -h非法选项: h 用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项:-c 创建新档案-t 列出档案目录-x 从档案中提取指定的 (或所有) 文件-u 更新现有档案-v 在标准输出中生成详细输出-f 指定档案文件名-m 包含指定清单文…

嵌入式软件—RK3568开发环境搭建

一、RK3568 1.1 开发板特点 BSP比较大&#xff0c;对于电脑内存和存储空间要求高 1.2 BSP BSP&#xff08;Board Support Package&#xff0c;板级支持包&#xff09;&#xff0c;类似于PC系统中BIOS和驱动程序的集合&#xff0c;BSP包含的范围更广&#xff0c;除了外设驱动…

数值线性代数:知识框架

记录数值线性代数研究的知识框架。 软件包线性方程组直接法Guass消元法/LU分解、Cholesky分解 LAPACK oneAPI MKL ARPACK Octave 迭代法Jacobi迭代、SOR迭代、共轭梯度法最小二乘特征值/特征向量非对称幂法、QR、Arnoldi分解对称QR、Jacobi、二分法、分治法、SVD 参考资料 G…

pg三种插件验证

sr_plan 创建extension, 他会创建保留执行计划的表 创建表并插入数据 开启sr_plan.write_mode, 允许sr_plan收集SQL和执行计划 查看QUERY 1的执行计划 PostgreSQL支持merge join、GroupAggregate(通过INDEX SCAN),所以这个CASE,非常快,并不需要b对所有数据进行聚合。查看…

nginx mirror代码分析

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…

Python——Windows下载ffmpeg

目录 前言 一、下载 &#xff08;3种下载方式&#xff09; 1、第一种下载方式——我上传的文件 2、第二种下载方式——GitHub下载 3、第三种下载方式——官网下载 二、解压 三、配置环境变量 四、验证是否安装成功 五、其他 关于ffmpeg其他安装教程 ffmpeg的延迟问题 …

typescript自动编译文件实时更新

npm install -g typescripttsc --init 生成tsconfig.json配置文件 tsc -w 在监听模式下运行&#xff0c;当文件发生改变的时候自动编译

C语言文件操作

目录 前言: 文件的分类 1. 程序文件 2.数据文件 文件的使用 文件指针 文件指针的使用 文件的打开与关闭 文件的使用方式 示例1&#xff1a; 示例2&#xff1a; 文件的顺序读写 函数简介 示例1&#xff1a; 示例2&#xff1a; 函数简介 示例1&#xff1a; 示例2&…

【我们一起60天准备考研算法面试(大全)-第二十六天 26/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

NAT详解(网络地址转换)

一句话说清楚它是干什么的&#xff1a; 网络地址转换&#xff1a;是指通过专用网络地址转换为公用地址&#xff0c;从而对外隐藏内部管理的IP地址&#xff0c;它使得整个专用网只需要一个全球IP就可以访问互联网&#xff0c;由于专用网IP地址是可以重用的&#xff0c;所以NAT大…

【Linux】Http协议的学习

文章目录 前言一、了解HTTP协议是如何规定的总结 前言 HTTP协议&#xff08;超文本传输协议&#xff09;和我们上一篇写的网络版计算器中自己定制的协议一样&#xff0c;只不过Http协议是是一个非常好用的协议&#xff0c;所以我们可以直接用现成的不用自己再搞一套了。 一、了…

EM算法实例

EM算法的E步骤&#xff0c; 是计算在当前的预估参数下&#xff0c;隐含变量&#xff08;是A硬币还是B硬币&#xff09;的每个值出现的概率。也就是给定和观测数据&#xff0c;计算这组数据出自A硬币的概率和这组数据出自B硬币的概率 我们根据E步中求出的A硬币、B硬币概率分布&…

在家构建您的迷你 ChatGPT

这篇文章分为三个部分&#xff1b;他们是&#xff1a; 什么是指令遵循模型&#xff1f;如何查找遵循模型的指令构建一个简单的聊天机器人废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 什么是指令遵循模型&#xff1f; 语言模型是机器学习模型&#xff0c;可以根…

tp6 实现excel 导入功能

在项目根目录安装 composer require phpoffice/phpspreadsheet 我们看一下郊果图&#xff0c;如下 点击导入excel表格数据 出现弹窗选择文件&#xff0c;控制台打开输出文档内容 前端layui代码 <form id"uploadForm" class"form-horizontal" encty…

如何使用 Flatpak 在 Linux 上安装 ONLYOFFICE 桌面编辑器?

Flatpak 是一款与 Linux 发行版无关的软件实用工具&#xff0c;可用于在 Linux 上构建和分发桌面端应用。其可帮助您安装第三方 Linux 应用程序&#xff0c;无需安装库或处理依赖。 ONLYOFFICE 桌面版是什么 ONLYOFFICE 编辑器桌面版是一款全面的办公工具&#xff0c;提供了文…

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…