在ObjectARX中使用MFC-使用MfcGridCtrl

(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)开发基础与实例教程》

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片