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

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC(Microsoft Foundation Classes)使用 ObjectARX 绘制图形,您可以按照以下步骤进行操作: 1. 创建 MFC 应用程序:首先,您需要创建一个 MFC 应用程序项目。在 Visual Studio 选择“创建新项目”,然后选择“MFC 应用程序”。 2. 链接 ObjectARX:在项目设置,将 ObjectARX 库添加到项目的附加依赖项。这样可以确保您可以使用 ObjectARX API。 3. 初始化 ObjectARX:在 MFC 应用程序的初始化代码,调用 ObjectARX 的初始化函数,以确保 ObjectARX 的环境正确设置。 4. 绘制图形:在 MFC 应用程序的视图类,重写 OnDraw 函数,并使用 ObjectARX 提供的绘图函数来绘制图形。您可以使用 ObjectARX 的图形对象和绘图命令来创建和操作图形元素。 5. 处理用户输入:在 MFC 应用程序的视图类,重写相应的消息处理函数(例如 OnLButtonDown、OnMouseMove 等),以响应用户的鼠标或键盘输入。根据用户的输入,您可以调用 ObjectARX 提供的绘图函数来更新图形。 请注意,ObjectARX 是用于与 AutoCAD 进行集成开发的框架,它提供了一套 API 来创建和操作 AutoCAD 的图形对象。因此,在使用 MFC 绘制图形时,您需要了解 ObjectARX 的相关 API 和概念。 这只是一个简单的概述,具体的实现步骤可能会因您的需求和环境而有所不同。建议您参考 ObjectARX 和 MFC 的文档,并根据您的具体需求进行详细的开发和调试。希望这些信息对您有所帮助!如果您有更多具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值