📄 cgridctrl.cpp
字号:
return TRUE;
}
BOOL CGridCtrl::SetFixedColumnCount(int nFixedCols)
{
ASSERT(nFixedCols >= 0);
if (nFixedCols > GetColumnCount())
{
if (!SetColumnCount(nFixedCols))
{
return FALSE;
}
}
if (m_idCurrentCell.col < nFixedCols)
{
SetFocusCell(-1,-1);
}
m_nFixedCols = nFixedCols;
if (GetSafeHwnd() && m_bAllowDraw)
{
Invalidate();
}
return TRUE;
}
BOOL CGridCtrl::SetRowCount(int nRows)
{
ASSERT(nRows >= 0);
if (nRows == GetRowCount())
{
return TRUE;
}
if (nRows < m_nFixedRows)
{
m_nFixedRows = nRows;
}
if (m_idCurrentCell.row >= nRows)
{
SetFocusCell(-1,-1);
}
int addedRows = nRows - GetRowCount();
if(addedRows<0)
{
for(int row=nRows; row<m_nRows; row++)
{
for(int col=0; col<m_nCols; col++)
{
CGridCell* pCell = GetCell(row, col);
if (pCell)
{
EmptyCell(pCell, row, col);
delete pCell;
}
}
GRID_ROW* pRow=m_RowData[row];
if(pRow) delete pRow;
}
}
m_nRows=nRows;
m_RowData.SetSize(m_nRows);
m_arRowHeights.SetSize(nRows);
if(addedRows>0)
{
int startRow=nRows-addedRows;
for(int row=startRow; row<GetRowCount(); row++)
{
m_arRowHeights[row]=m_nDefCellHeight;
m_RowData[row] = new GRID_ROW;
m_RowData[row]->SetSize(m_nCols);
for (int col = 0; col < m_nCols; col++)
{
GRID_ROW* pRow = m_RowData[row];
if (pRow)
{
pRow->SetAt(col, CreateCell(row, col));
}
}
}
}
if (GetSafeHwnd() && m_bAllowDraw)
{
ResetScrollBars();
Invalidate();
}
return TRUE;
}
BOOL CGridCtrl::SetColumnCount(int nCols)
{
ASSERT(nCols >= 0);
if (nCols == GetColumnCount())
{
return TRUE;
}
CGridColumn* pCol=NULL;
if (nCols < m_nFixedCols)
{
m_nFixedCols = nCols;
}
if (m_idCurrentCell.col >= nCols)
{
SetFocusCell(-1,-1);
}
int addedCols = nCols - GetColumnCount();
if (addedCols < 0)
{
for (int row = 0; row < m_nRows; row++)
{
for (int col = nCols; col < GetColumnCount(); col++)
{
CGridCell* pCell = GetCell(row, col);
if (pCell)
{
EmptyCell(pCell, row, col);
delete pCell;
}
}
}
for(int col=nCols;col<GetColumnCount();col++)
{
if(m_ColData.GetUpperBound()>=col)
{
pCol=m_ColData[col];
if(pCol)
{
delete pCol;
m_ColData.RemoveAt(col);
}
}
}
}
m_nCols = nCols;
for(int col=0;col<m_nCols;col++)
{
if(m_ColData.GetSize()<=col)
{
pCol=new CGridColumn;
m_ColData.Add(pCol);
}
}
for (int i = 0; i < m_nRows; i++)
{
if (m_RowData[i])
{
m_RowData[i]->SetSize(nCols);
}
}
if (addedCols > 0)
{
int startCol = nCols - addedCols;
for (int col = startCol; col < GetColumnCount(); col++)
{
pCol=m_ColData[col];
pCol->m_nWidth=m_nDefCellWidth;
}
for (int row = 0; row < m_nRows; row++)
{
for (col = startCol; col < GetColumnCount(); col++)
{
GRID_ROW* pRow = m_RowData[row];
if (pRow)
{
pRow->SetAt(col, CreateCell(row,col)); //当新增列时,就创建新列中的单元格
}
}
}
}
if (GetSafeHwnd() && m_bAllowDraw)
{
ResetScrollBars();
Invalidate();
}
return TRUE;
}
//如果nColumn=-1,就在列的末尾处插入一行数据
int CGridCtrl::InsertColumn(LPCTSTR strHeading, GridDrawTextTypeEnum nFormat , int nColumn)
{
if (nColumn >= 0 && nColumn >= GetColumnCount())
{
return -1;
}
ResetSelectedRange();
if (m_nRows < 1)
{
SetRowCount(1);
}
CGridColumn* pCol=NULL;
if (nColumn < 0)
{
nColumn = m_nCols;
pCol=new CGridColumn;
pCol->m_nWidth=0;
m_ColData.Add(pCol);
for (int row = 0; row < m_nRows; row++)
{
GRID_ROW* pRow = m_RowData[row];
if (!pRow)
{
return -1;
}
pRow->Add(CreateCell(row, nColumn));
}
}
else
{
pCol=new CGridColumn;
pCol->m_nWidth=0;
m_ColData.InsertAt(nColumn,pCol);
for (int row = 0; row < m_nRows; row++)
{
GRID_ROW* pRow = m_RowData[row];
if (!pRow)
{
return -1;
}
pRow->InsertAt(nColumn, CreateCell(row, nColumn));
}
}
m_nCols++;
SetItemText(0, nColumn, strHeading);
for (int row = 0; row < m_nRows; row++)
{
SetItemFormat(row, nColumn, nFormat);
}
pCol=m_ColData[nColumn];
if(pCol)
{
pCol->m_nWidth=GetTextExtent(strHeading).cx;
}
//在插入行成功了以后,要把所有下面行和列中的单元格中的合并内容都增加1,否则就会出错
CGridCell* p;
for(int i=0;i<GetRowCount();i++)
{
for(int j=nColumn;j<GetColumnCount();j++)
{
p=GetCell(i,j);
if(p->m_TopLeftCellId.row>0 && p->m_TopLeftCellId.col>0)
{
p->m_TopLeftCellId.row++;
}
}
}
if (m_idCurrentCell.col != -1 && nColumn < m_idCurrentCell.col)
{
m_idCurrentCell.col++;
}
ResetScrollBars();
return nColumn;
}
int CGridCtrl::InsertRow(LPCTSTR strHeading, int nRow /* = -1 */)
{
if (nRow >= 0 && nRow >= GetRowCount())
{
return -1;
}
ResetSelectedRange();
if (m_nCols < 1)
{
SetColumnCount(1);
}
if (nRow < 0)
{
nRow = m_nRows;
m_arRowHeights.Add(0);
m_RowData.Add(new GRID_ROW);
}
else
{
m_arRowHeights.InsertAt(nRow, (int)0,1);
m_RowData.InsertAt(nRow, new GRID_ROW);
}
m_nRows++;
m_RowData[nRow]->SetSize(m_nCols);
for (int col = 0; col < m_nCols; col++)
{
GRID_ROW* pRow = m_RowData[nRow];
if (!pRow)
{
return -1;
}
pRow->SetAt(col, CreateCell(nRow, col));
}
SetItemText(nRow, 0, strHeading);
m_arRowHeights[nRow] = GetTextExtent(strHeading).cy;
//在插入行成功了以后,要把所有下面行和列中的单元格中的合并内容都增加1,否则就会出错
CGridCell* p;
for(int i=nRow;i<GetRowCount();i++)
{
for(int j=0;j<GetColumnCount();j++)
{
p=GetCell(i,j);
if(p->m_TopLeftCellId.row>0 && p->m_TopLeftCellId.col>0)
{
p->m_TopLeftCellId.row++;
}
}
}
if (m_idCurrentCell.row != -1 && nRow < m_idCurrentCell.row)
{
m_idCurrentCell.row++;
}
ResetScrollBars();
return nRow;
}
CGridCell* CGridCtrl::CreateCell(int nRow, int nCol)
{
/*
创建单元格时,需要对列的属性进行查询,列的属性有三种情况:
1,按照第一行(固定行)的单元格属性进行创建
2,按照第一行(非固定行)的单元格属性进行创建
3,按照上一行的单元格属性进行创建
4,按照列的安排属性进行创建
5,默认是文本类型的创建
*/
CGridCell* pRet=NULL;
if (nCol < 0 || nCol >= m_nCols)
{
return FALSE;
}
CGridColumn* pCol=NULL;
pCol=m_ColData[nCol];
if(!pCol)
{
return NULL;
}
switch(pCol->m_nCreateType)
{
case JnGridCreateText: //默认创建一个文本类型的单元格,不设置单元格属性
{
CGridCellText* pCell=new CGridCellText;
memcpy(&(pCell->lfFont), &m_Logfont, sizeof(LOGFONT));
pRet=(CGridCell*)pCell;
}
break;
case JnGridCreateFromFix1:
break;
case JnGridCreateFormNoFix1:
break;
case JnGridCreateFormPre:
{
}
break;
case JnGridCreateFormDefCol:
break;
}
return pRet;
}
void CGridCtrl::EmptyCell(CGridCell* pCell, int nRow, int nCol)
{
SetItemState(nRow, nCol, 0);
switch(pCell->m_nCtrlType)
{
case JnCtrlText:
{
CGridCellText* p=(CGridCellText*)pCell;
p->m_sText.Empty();
// delete p;
}
break;
default:
break;
}
}
BOOL CGridCtrl::DeleteColumn(int nColumn)
{
if (nColumn < 0 || nColumn >= GetColumnCount())
{
return FALSE;
}
ResetSelectedRange();
for (int row = 0; row < GetRowCount(); row++)
{
GRID_ROW* pRow = m_RowData[row];
if (!pRow)
{
return FALSE;
}
CGridCell* pCell = pRow->GetAt(nColumn);
if (pCell)
{
EmptyCell(pCell, row, nColumn);
delete pCell;
}
pRow->RemoveAt(nColumn);
}
CGridColumn* pCol=m_ColData[nColumn];
if(pCol)
{
delete pCol;
}
m_ColData.RemoveAt(nColumn);
m_nCols--;
if (nColumn < m_nFixedCols)
{
m_nFixedCols--;
}
if (nColumn == m_idCurrentCell.col)
{
m_idCurrentCell.row = m_idCurrentCell.col = -1;
}
else if (nColumn < m_idCurrentCell.col)
{
m_idCurrentCell.col--;
}
ResetScrollBars();
return FALSE;
}
BOOL CGridCtrl::DeleteRow(int nRow)
{
if ( nRow < 0 || nRow >= GetRowCount())
{
return FALSE;
}
GRID_ROW* pRow = m_RowData[nRow];
if (!pRow)
{
return FALSE;
}
ResetSelectedRange();
for (int col = 0; col < GetColumnCount(); col++)
{
CGridCell* pCell = pRow->GetAt(col);
if (pCell)
{
EmptyCell(pCell, nRow, col);
delete pCell;
}
}
delete pRow;
m_RowData.RemoveAt(nRow);
m_arRowHeights.RemoveAt(nRow);
m_nRows--;
if (nRow < m_nFixedRows)
{
m_nFixedRows--;
}
if (nRow == m_idCurrentCell.row)
{
m_idCurrentCell.row = m_idCurrentCell.col = -1;
}
else if (nRow < m_idCurrentCell.row)
{
m_idCurrentCell.row--;
}
ResetScrollBars();
return TRUE;
}
BOOL CGridCtrl::DeleteNonFixedRows()
{
int nFixed = GetFixedRowCount();
int nCount = GetRowCount();
for (int nRow = nCount; nRow >= nFixed; nRow--)
{
DeleteRow(nRow);
}
return TRUE;
}
BOOL CGridCtrl::DeleteAllItems()
{
ResetSelectedRange();
m_arRowHeights.RemoveAll();
for (int row = 0; row < m_nRows; row++)
{
GRID_ROW* pRow = m_RowData[row];
if (!pRow)
{
continue;
}
for (int col = 0; col < m_nCols; col++)
{
CGridCell* pCell = pRow->GetAt(col);
if (pCell)
{
EmptyCell(pCell, row, col);
delete pCell;
}
}
delete pRow;
}
m_RowData.RemoveAll();
for(int col=0;col<m_nCols;col++)
{
if(m_ColData.GetUp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -