(1)在VC ++中使用的ObjectARX向导创建一个新工程GridDialog1
在项目的文件夹中添加一个Common文件夹;
从我分享的百度云连接中的MfcGridCtrl文件夹复制到公共文件夹中;
链接:https://pan.baidu.com/s/1sKbKdT-kHD76iNsYDBmuvw密码:3oui
将文件夹中的所有头文件和的.cpp文件都添加到项目中:
这是后编译,发现出错,需要强制类型转换:
(2)MfcGridCtrl文件夹中的CGridCtrlUtil是我添加的类,其中包含了设置特殊单元格类型的函数:
// 设置单元格为复选框类型
void CGridCtrlUtil::SetCellCheckType( bool bIsCheck, CGridCtrl &gridCtrl, int rowIndex,
int columnIndex)
{
gridCtrl.SetCellType(rowIndex, columnIndex, RUNTIME_CLASS(CGridCellCheck));
CGridCellCheck* pCheckCell = (CGridCellCheck*)gridCtrl.GetCell(rowIndex, columnIndex);
if (pCheckCell != NULL)
{
pCheckCell->SetCheck(bIsCheck);
}
}
// 获得复选框单元格用户是否选中
bool CGridCtrlUtil::GetCellChecked(CGridCtrl &gridCtrl, int rowIndex, int columnIndex)
{
if (gridCtrl.GetCell(rowIndex, columnIndex)->IsKindOf(RUNTIME_CLASS(CGridCellCheck)))
{
CGridCellCheck* pCheckCell = (CGridCellCheck*)gridCtrl.GetCell(rowIndex, columnIndex);
if (pCheckCell != NULL)
{
return pCheckCell->GetCheck() == TRUE;
}
else
{
return false;
}
}
else
{
return false;
}
}
// 获得复选框单元格的选中状态
void CGridCtrlUtil::SetCellChecked( CGridCtrl &grid, int rowIndex, int colIndex, bool bChecked )
{
if (grid.GetCell(rowIndex, colIndex)->IsKindOf(RUNTIME_CLASS(CGridCellCheck)))
{
((CGridCellCheck*)grid.GetCell(rowIndex, colIndex))->SetCheck(bChecked);
}
}
// 设置单元格为组合框类型
void CGridCtrlUtil::SetCellComboType( CGridCtrl &gridCtrl, int row, int col )
{
gridCtrl.SetCellType(row, col, RUNTIME_CLASS(CGridCellCombo));
}
// 设置组合框单元格的可选项
void CGridCtrlUtil::SetCellComboOptions( CGridCtrl &gridCtrl, int row, int col, const CStringArray &ar )
{
CGridCellCombo *pCell = (CGridCellCombo*) gridCtrl.GetCell(row, col);
pCell->SetOptions(ar);
}
// 设置组合框单元格的可选项
void CGridCtrlUtil::SetCellComboOptions( CGridCtrl &gridCtrl, int row, int col, const std::vector<CString> &items )
{
CStringArray ar;
for (int i = 0; i < items.size(); i++)
{
ar.Add(items[i]);
}
SetCellComboOptions(gridCtrl, row, col, ar);
}
// 设置组合框单元格的样式
void CGridCtrlUtil::SetCellComboDwStyle( CGridCtrl &gridCtrl, int row, int col, DWORD dwStyle )
{
CGridCellCombo *pCell = (CGridCellCombo*) gridCtrl.GetCell(row, col);
pCell->SetStyle(dwStyle);
}
// 设置单元格为普通的编辑框类型
void CGridCtrlUtil::SetCellEditType( CGridCtrl &gridCtrl, int row, int col )
{
gridCtrl.SetCellType(row, col, RUNTIME_CLASS(CGridCell));
}
// 设置单元格为按钮类型
void CGridCtrlUtil::SetCellButtonType( CGridCtrl &gridCtrl, int row, int col )
{
gridCtrl.SetCellType(row, col, RUNTIME_CLASS(CGridCellButton));
}
// 某个单元格是否是复选框类型
bool CGridCtrlUtil::CellIsCheckType( CGridCtrl &grid, int row, int col )
{
return (grid.GetCell(row, col)->IsKindOf(RUNTIME_CLASS(CGridCellCheck)) == TRUE);
}
(3)添加对话框资源(IDD_GRID),在其中放置一个自定义控制控件(IDC_GRID),控件的类属性为MfcGridCtrl
将对话框的ID修改为IDD_GRID;
修改控件的属性:
(4)使用的ObjectARX的MFC支持工具为对话框添加映射类(CGridDlg)
在类CGridDlg头文件中添加成员变量m_grid:
private:
CGridCtrl m_grid;
并添加头文件:
#include "Common\\MfcGridCtrl\\GridCtrl.h"
在GridDlg.cpp文件中的的DoDataExchange函数中添加IDC_GRID资源和m_grid变量关联的代码:
void CGridDlg::DoDataExchange (CDataExchange *pDX) {
CAcUiDialog::DoDataExchange (pDX) ;
DDX_Control(pDX, IDC_GRID, m_grid);
}
(5)在对话框中添加GetAllColumnName函数,用于获取所有输出列名称集合:
在GridDlg.h中添加函数声明:
public:
std::vector<CString> GetAllColumnName();
在GridDlg.cpp中添加函数实现:
std::vector<CString> CGridDlg::GetAllColumnName()
{
std::vector<CString> colNames;
colNames.push_back(TEXT("序号"));
colNames.push_back(TEXT("图例"));
colNames.push_back(TEXT("设备及材料名称"));
colNames.push_back(TEXT("规格及型号"));
colNames.push_back(TEXT("单位"));
colNames.push_back(TEXT("数量"));
colNames.push_back(TEXT("备注"));
return colNames;
}
(6)在GridDlg类中添加UpdateOutColGrid成员函数:
void CGridDlg::UpdateOutColGrid()
{
m_grid.SetRowCount(1);
int row = 1, col = 0;
int i = 0;
std::vector<CString> colNames = GetAllColumnName();
m_grid.SetRowCount((int)colNames.size() + 1);
for (int i = 0; i < colNames.size(); i++)
{
m_grid.SetItemText(row + i, col, colNames[i]);
}
// 精度下拉框的内容
std::vector<CString> precisionStrs;
CString val = TEXT("0");
int precisionCount = 9;
for (i = 0; i < precisionCount; i++)
{
precisionStrs.push_back(val);
if (i == 0)
{
val += TEXT(".");
}
val += TEXT("0");
}
// 文字对齐方式的选项值
std::vector<CString> textAlignments;
textAlignments.push_back(TEXT("左"));
textAlignments.push_back(TEXT("中"));
textAlignments.push_back(TEXT("右"));
int defaultAligmentIndex = 2;
// 设置单元格的内容和状态
int colWidth = 80;
for (i = 1; i < m_grid.GetRowCount(); i++)
{
// 第一列为不可编辑
m_grid.SetItemState(i, 0, GVIS_READONLY);
// 设置第二列为复选框
int col = 1;
bool cellCheck = true;
CGridCtrlUtil::SetCellCheckType(cellCheck, m_grid, i, col);
m_grid.SetItemData(i, col, 1);
// 设置第三列为下拉框
col = 2;
if (i != m_grid.GetRowCount() - 2)
{
m_grid.SetItemState(i, col, GVIS_READONLY);
}
else
{
CGridCtrlUtil::SetCellComboType(m_grid, i, col);
CGridCtrlUtil::SetCellComboDwStyle(m_grid, i, col, CBS_DROPDOWNLIST);
CGridCtrlUtil::SetCellComboOptions(m_grid, i, col, precisionStrs);
m_grid.SetColumnWidth(col, colWidth);
m_grid.SetItemText(i, col, TEXT("0.00"));
}
// 文字对齐方式列
col = 3;
CGridCtrlUtil::SetCellComboType(m_grid, i, col);
CGridCtrlUtil::SetCellComboDwStyle(m_grid, i, col, CBS_DROPDOWNLIST);
CGridCtrlUtil::SetCellComboOptions(m_grid, i, col, textAlignments);
// 设置默认的对齐方式
if (i == 1 || (i == m_grid.GetRowCount() - 1)) // 编号列、备注列为文字列,默认对齐方式为左对齐
{
defaultAligmentIndex = 0; // 左对齐
}
else
{
defaultAligmentIndex = 1; // 居中
}
m_grid.SetItemText(i, col, textAlignments[defaultAligmentIndex]);
}
m_grid.AutoSizeRows();
}
并添加包含头文件:
#include "Common\\MfcGridCtrl\\GridCtrlUtil.h"
(7)添加对话框的初始化事件,
在对话框的初始化事件的OnInitDialog()中设置网格控件的基本属性,并调用UpdateOutColGrid函数填充输出单元格列表格:
BOOL CGridDlg::OnInitDialog()
{
CAcUiDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
// 输出列Grid初始化
m_grid.SetRowCount((int)GetAllColumnName().size());
m_grid.SetFixedRowCount(1);
m_grid.SetColumnCount(4);
m_grid.SetItemText(0, 0, TEXT("列名"));
m_grid.SetItemText(0, 1, TEXT("输出"));
m_grid.SetItemText(0, 2, TEXT("精度"));
m_grid.SetItemText(0, 3, TEXT("文字对齐"));
m_grid.SetColumnWidth(0, 160);
m_grid.SetColumnWidth(1, 50);
m_grid.SetColumnWidth(2, 75);
m_grid.SetColumnWidth(3, 75);
UpdateOutColGrid();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
(8)添加的OnOK事件,可以检测每一列的输出属性:
void CGridDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
if (!UpdateData())
{
return;
}
// 获取各个输出列的内容
for (int i = 1; i < m_grid.GetRowCount(); i++)
{
if (CGridCtrlUtil::GetCellChecked(m_grid, i, 1) && m_grid.GetRowHeight(i) > 0) // 是否输出
{
int index = i - 1;
CString colName = m_grid.GetItemText(i, 0); // 列名
CString precisionStr = m_grid.GetItemText(i, 2); // 显示精度
CString strTextAlignment = m_grid.GetItemText(i, 3); // 文字水平对齐方式
int textAlignment = 0;
if (strTextAlignment.CompareNoCase(TEXT("左")) == 0)
{
textAlignment = 0;
}
else if (strTextAlignment.CompareNoCase(TEXT("中")) == 0)
{
textAlignment = 1;
}
else //strTextAlignment.CompareNoCase(TEXT("右")) == 0
{
textAlignment = 2;
}
}
}
CAcUiDialog::OnOK();
}
(9)在注册命令函数static void AAAMyGroupMyCommand()中,添加以下代码用于显示CGridDlg对话框:
static void AAAMyGroupMyCommand () {
// Put your command code here
CAcModuleResourceOverride myResource;
CGridDlg dlg;
dlg.DoModal();
}
包含头文件:
#include "GridDlg.h"
(10)效果
编译运行程序,运行AutoCAD2018(我的开发环境是CAD2018 + VS2015);
执行命令MyCommandLocal,系统会弹出入下图所示的对话框:
最后,附上整个项目的源代码:GridDialog1
链接:https://pan.baidu.com/s/1GOx4dq7HFys-0J3I8ROI5w 密码:to2j
参考资料:
《AutoCAD ObjectARX(VC)开发基础与实例教程》
暂无评论内容