(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