MFC UI表格制作从专家到入门
文章目录
- CListCtrl
- 常见问题
- 增强版CGridCtrl(第三方)
- 第三方库
- ReoGrid
CListCtrl
默认情况下,CListCtrl
不支持直接编辑单元格,需通过消息处理实现:
1.添加控件到资源视图
在对话框资源编辑器中拖入List Control
控件,设置ID(如IDC_LIST1
),样式选择Report
。
2.初始化表格样式与列头
在对话框的OnInitDialog()
中初始化控件:
m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 启用整行选择和网格线
m_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100); // 添加列
m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_CENTER, 50);
m_listCtrl.InsertItem(0, _T("张三")); // 插入行
m_listCtrl.SetItemText(0, 1, _T("25")); // 设置单元格文本
3.实现双击编辑功能
处理NM_DBLCLK
消息,创建编辑控件(如CEdit
):
void CMyDialog::OnNMDblclkList(NMHDR* pNMHDR, LRESULT* pResult) {LPNMITEMACTIVATE pNMIA = (LPNMITEMACTIVATE)pNMHDR;int nItem = pNMIA->iItem; // 获取行索引int nSubItem = pNMIA->iSubItem; // 获取列索引// 创建编辑框并定位到单元格位置CEdit* pEdit = new CEdit();pEdit->Create(WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, rect, this, IDC_EDIT);pEdit->SetFocus();
}
编辑完成后,需处理EN_KILLFOCUS
消息保存数据并销毁编辑框。
常见问题
1.焦点管理
编辑控件需正确处理焦点丢失事件,避免内存泄漏(如动态创建的CEdit
需在EN_KILLFOCUS
中销毁)。
2.性能优化
大数据量时启用虚拟模式(LVS_OWNERDATA
),按需加载数据。
4.数据验证
在LVN_ENDLABELEDIT
消息中校验输入格式(如数字、日期)。
增强版CGridCtrl(第三方)
支持直接编辑。内置支持文本框、下拉框、日期选择器等编辑器,无需手动处理消息。
1.集成控件到项目
下载CGridCtrl
源码,将头文件和实现文件加入项目。
2.在对话框中添加控件
// .h
CGridCtrl m_grid;// .cpp
m_grid.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(10,10,400,200), this, IDC_GRID);
m_grid.SetRowCount(10); // 设置行数
m_grid.SetColumnCount(3); // 设置列数
m_grid.SetItemText(0, 0, _T("数据")); // 填充单元格
第三方库
ReoGrid
适用于需要Excel级功能的场景。支持公式计算、样式定制等高级功能。