⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgridctrl.cpp

📁 此次上传的使linux下的文件传输协议
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -