在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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章