做女装的看哪个网站好,谷歌外贸网站seo怎么做,成都网络推广中联无限,免费视图网站建设在使用 MFC 的 CGridCtrl 控件创建表格时#xff0c;遇到的一个典型问题是#xff0c;当表格滚动条出现时#xff0c;最后一列会显示空白。这篇博客将记录解决这一问题的详细过程#xff0c;同时总结了 CGridCtrl 初始化及优化的关键步骤#xff0c;帮助开发者快速搭建一个…在使用 MFC 的 CGridCtrl 控件创建表格时遇到的一个典型问题是当表格滚动条出现时最后一列会显示空白。这篇博客将记录解决这一问题的详细过程同时总结了 CGridCtrl 初始化及优化的关键步骤帮助开发者快速搭建一个功能完善的用户管理表格。 问题描述
在开发用户管理模块时使用了 MFC 的 CGridCtrl 控件遇到以下问题
当添加的数据超过表格的可视范围出现垂直滚动条后表格的最后一列显示空白。如果调整某列的宽度最后一列的内容又可以正常显示。通过分析发现滚动条的宽度未正确考虑到表格的列宽调整逻辑中导致最后一列被“覆盖”。 解决方法
方法 1手动调整最后一列宽度
通过监听滚动条的显示状态在需要时动态调整最后一列的宽度确保内容可见。或者在添加删除函数中使用调整列宽和填充最后一列。
void CUserManagerDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_gridUserManager.GetSafeHwnd()) {m_gridUserManager.ExpandColumnsToFit(FALSE); // 调整列宽m_gridUserManager.ExpandLastColumn(); // 填充最后一列}
}方法 2限制列总宽度
将所有列的总宽度限制为表格的客户区宽度减去滚动条宽度。这种方法更加精确但实现较为复杂。 优化表格初始化的代码
在 CGridCtrl 的初始化过程中我们需要设置表格的行列数、样式以及默认单元格的背景色、字体颜色等属性。以下是经过优化后的初始化代码
void CUserManagerDlg::InitUserManager()
{if (m_gridUserManager.GetSafeHwnd() NULL)return;// 清空表格数据m_gridUserManager.DeleteAllItems();m_gridUserManager.SetVirtualMode(FALSE); // 设置为非虚拟模式// 配置默认单元格样式m_gridUserManager.GetDefaultCell(TRUE, FALSE)-SetBackClr(g_nGridFixCellColor); // 固定行背景色m_gridUserManager.GetDefaultCell(FALSE, TRUE)-SetBackClr(g_nGridFixCellColor); // 固定列背景色m_gridUserManager.GetDefaultCell(FALSE, FALSE)-SetBackClr(g_nGridCellColor); // 普通单元格背景色m_gridUserManager.SetFixedTextColor(g_nGridFixFontColor); // 固定行/列字体颜色// 设置表格行列数int nRows 1; // 初始只有标题行int nCols 7; // 包含固定列的总列数m_gridUserManager.SetRowCount(nRows);m_gridUserManager.SetColumnCount(nCols);m_gridUserManager.SetFixedRowCount(1);m_gridUserManager.SetFixedColumnCount(0);// 配置表头int nColIdx 0;m_gridUserManager.SetColumnWidth(nColIdx, 30); // 列宽m_gridUserManager.SetItemText(0, nColIdx, _T(No.));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx, _T(用户名));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx, _T(密码));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx, _T(权限));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx, _T(会话超时分钟));m_gridUserManager.SetColumnWidth(nColIdx, 70);m_gridUserManager.SetItemText(0, nColIdx, _T(会话过期小时));m_gridUserManager.SetColumnWidth(nColIdx, 100);m_gridUserManager.SetItemText(0, nColIdx, _T(最后一次登录时间));// 配置交互属性m_gridUserManager.SetEditable(TRUE);m_gridUserManager.SetRowResize(FALSE);m_gridUserManager.SetColumnResize(TRUE);m_gridUserManager.SetFixedRowSelection(FALSE);m_gridUserManager.SetFixedColumnSelection(FALSE);m_gridUserManager.SetListMode(TRUE);m_gridUserManager.SetSingleRowSelection(TRUE);// 自动调整列宽m_gridUserManager.ExpandColumnsToFit(TRUE);m_gridUserManager.ExpandLastColumn();// 填充表格数据FillUserManager();
}初始化中的关键点 清空表格数据 使用 DeleteAllItems() 确保表格在初始化前处于空状态。 设置默认样式 使用 GetDefaultCell() 设置单元格背景色、字体等全局样式减少逐个单元格设置的重复工作。 列宽自动调整 调用 ExpandColumnsToFit() 和 ExpandLastColumn() 确保列宽自适应表格宽度避免多余的滚动条。 交互属性 禁用行高调整SetRowResize(FALSE)启用列宽调整SetColumnResize(TRUE)只允许选择单行SetSingleRowSelection(TRUE) 总结
在开发过程中通过方法 1 手动调整最后一列宽度成功解决了最后一列显示空白的问题。同时通过优化 CGridCtrl 的初始化代码表格的功能更加完善交互体验也得到了提升。希望这篇文章能为 MFC 开发者提供参考。