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

📄 celldoc.cpp

📁 类似Excel的设计器源代码,基本实现电子图表的功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:


/////////////////////////////////////////////////////////////////////////////
// CCellDoc serialization

void CCellDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		m_warrayCol.Serialize(ar);
		m_warrayRow.Serialize(ar);
		m_ArrayRow.Serialize(ar);
	}
	else
	{
		// TODO: add loading code here
		m_warrayCol.RemoveAll();
		m_warrayRow.RemoveAll();

		m_warrayCol.Serialize(ar);
		m_warrayRow.Serialize(ar);

		CCellRow *pObj;
		int i,nNum;
		nNum=m_ArrayRow.GetSize();
		for(i=0;i<nNum;i++)
		{
			pObj=m_ArrayRow[i];
			if(pObj!=NULL)
				delete pObj;
		}
		m_ArrayRow.RemoveAll();
		m_ArrayRow.Serialize(ar);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CCellDoc diagnostics

#ifdef _DEBUG
void CCellDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CCellDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCellDoc commands

BOOL CCellDoc::GetCellRect(int nRow,int nCol,CRect &rtCell)//取单元格区域,视坐标
{
	if(
		(nCol<m_nTopLeftColNo)||
		(nRow<m_nTopLeftRowNo)||
		(nCol>=m_warrayCol.GetSize())||
		(nRow>=m_warrayRow.GetSize())
	)
		return FALSE;
	int i;
	int nx=this->m_nTopX;
	int ny=this->m_nTopY;

	for(i=m_nTopLeftColNo;i<nCol;i++)
		nx+=m_warrayCol[i];

	for(i=m_nTopLeftRowNo;i<nRow;i++)
		ny+=m_warrayRow[i];

	rtCell.left=nx;
	rtCell.right=nx+m_warrayCol[nCol];

	rtCell.top=ny;
	rtCell.bottom=ny+m_warrayRow[nRow];
	
	return TRUE;
}

void CCellDoc::Select(int nRow,int nCol,BOOL bSelect)
{
	if((nRow<0)||(nRow>=m_ArrayRow.GetSize()))
		return;
	CCellRow *pRow=m_ArrayRow[nRow];
	if(pRow==NULL)
		return;
	if((nCol <0)||(nCol>=pRow->m_ArrayCell.GetSize()))
		return;
	pRow->m_ArrayCell[nCol]->m_bSelected=bSelect;
}

CCellObj * CCellDoc::GetCell(int nRow,int nCol)
{
	if((nRow<0)||(nRow>=m_ArrayRow.GetSize()))
		return NULL;
	CCellRow *pRow=m_ArrayRow[nRow];
	if(pRow==NULL)
		return NULL;
	if((nCol <0)||(nCol>=pRow->m_ArrayCell.GetSize()))
		return NULL;
	return pRow->m_ArrayCell[nCol];
}
void CCellDoc::SelectInRect(CRect &rtSelect)
{
	int nRow=m_warrayRow.GetSize();
	int nCol=m_warrayCol.GetSize();
	int i,j;
	int nx=this->m_nTopX;
	int ny=this->m_nTopY;
	CRect rtCell;
	for(i=m_nTopLeftColNo;i<nCol;i++)
	{
		rtCell.left=nx;
		nx+=m_warrayCol[i];
		rtCell.right=nx-1;
		
	
		ny=this->m_nTopY;
		for(j=m_nTopLeftRowNo;j<nRow;j++)
		{
			rtCell.top=ny;
			ny+=m_warrayRow[j];
			rtCell.bottom=ny-1;

			if((rtSelect & rtCell).IsRectNull())
				continue;
			this->Select(j,i,TRUE);

		}
	}
}

void CCellDoc::RemoveAllSelectBut(int nRow,int nCol)
{
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			pObj->m_bSelected=FALSE;
			if((i==nRow)&&(j==nCol))
				pObj->m_bSelected=TRUE;
		}
	}
}

void CCellDoc::SelectAll(void)
{
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			pObj->m_bSelected=TRUE;
		}
	}
}

int  CCellDoc::SetSelectAdjust(DWORD dwAdjust)//设置文本对齐,返回设置的个数
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				if(dwAdjust < 0X0000FFFF)
					pObj->m_dwTxtAdjust=(pObj->m_dwTxtAdjust & 0XFFFF0000) | dwAdjust;
				else
					pObj->m_dwTxtAdjust=(pObj->m_dwTxtAdjust & 0X0000FFFF) | dwAdjust;

				pObj->m_dwFlags &= ~CELL_AUTODISP;
				nNums++;
			}
		}
	}
	return nNums;
}

int CCellDoc::SetSelectAutoDisp(void)//设置文本自动现实,返回设置的个数
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->m_dwFlags |= CELL_AUTODISP;
				nNums++;
			}
		}
	}
	return nNums;
}

int CCellDoc::SetSelectFont(LOGFONT *pLogFont)//设置文本字体,返回设置的个数
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->SetLogFont(pLogFont);
				nNums++;
			}
		}
	}
	return nNums;
}

int CCellDoc::SetSelectFontSize(int nw)//设置文本字号,返回设置的个数
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->SetFontSize(nw);
				nNums++;
			}
		}
	}
	return nNums;
}

int CCellDoc::SetSelectFontFat(BOOL bk)//
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->SetTxtFat(bk);
				nNums++;
			}
		}
	}
	return nNums;
}

int CCellDoc::SetSelectFontXt(BOOL bk)//
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->SetTxtXt(bk);
				nNums++;
			}
		}
	}
	return nNums;
}	
int CCellDoc::SetSelectFontUnderLine(BOOL bk)//
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				pObj->SetTxtUnderLine(bk);
				nNums++;
			}
		}
	}
	return nNums;
}


int CCellDoc::SetSelectFrm(DWORD dwFrm,BOOL bSet)//设置单元格边框
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				if(bSet)
				{
					if((pObj->m_dwFlags & dwFrm)==0)
					{
						pObj->m_dwFlags |= dwFrm;
						nNums++;
					}
				}
				else
				{
					if(pObj->m_dwFlags & dwFrm)
					{
						pObj->m_dwFlags &= ~dwFrm;
						nNums++;
					}
				}
			}
		}
	}
	return nNums;	
}

int CCellDoc::SetSelectDot(int nDot)//设置单元格小数位数
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				if(pObj->m_lDot!= nDot)
				{
					pObj->m_lDot = nDot;
					nNums++;
				}
			}
		}
	}
	return nNums;	
}

int CCellDoc::SetSelectClolor(COLORREF clr,BOOL bBk)//设置单元格颜色
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				if(bBk)
				{
					if(pObj->m_clrBk != clr)
					{
						pObj->m_clrBk = clr;
						nNums++;
					}
				}
				else
				{
					if(pObj->m_clrTxt != clr)
					{
						pObj->m_clrTxt = clr;
						nNums++;
					}
				}
			}
		}
	}
	return nNums;	
}

int CCellDoc::SetSelectFrmNone(void)//设置单元格边框无
{
	int nNums=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(pObj->m_bSelected)
			{
				if(
					(pObj->m_dwFlags & CELL_FRMLEFT)||
					(pObj->m_dwFlags & CELL_FRMRIGHT)||
					(pObj->m_dwFlags & CELL_FRMTOP)||
					(pObj->m_dwFlags & CELL_FRMBOTTOM)||
					(pObj->m_dwFlags & CELL_FRMLT2RB)||
					(pObj->m_dwFlags & CELL_FRMLB2RT)
					)
					
				{
					pObj->m_dwFlags &= ~CELL_FRMLEFT;
					pObj->m_dwFlags &= ~CELL_FRMRIGHT;
					pObj->m_dwFlags &= ~CELL_FRMTOP;
					pObj->m_dwFlags &= ~CELL_FRMBOTTOM;
					pObj->m_dwFlags &= ~CELL_FRMLT2RB;
					pObj->m_dwFlags &= ~CELL_FRMLB2RT;

					nNums++;
				}
				
			}
		}
	}
	return nNums;	
}

void CCellDoc::DrawCell(CDC *pDC,CCellObj *pCell,CRect &rtCell)
{
	pCell->Draw(pDC,rtCell);
}

void CCellDoc::DrawFillSelect(CDC *pDC,CRect &rtCell)//标记选择
{

	COLORREF clrFill=RGB(255,255,255);
//	CBrush brush(RGB(169,178,202));
	CBrush brush(clrFill);
	CBrush *oldBrush;
//	CPen pen(PS_SOLID,0,RGB(169,178,202));
	CPen pen(PS_SOLID,0,clrFill);
	CPen *oldPen;

	oldPen=pDC->SelectObject(&pen);
	oldBrush=pDC->SelectObject(&brush);

	int oldMode=pDC->SetROP2(R2_NOT);
//	int oldMode=pDC->SetROP2(R2_XORPEN);
//	CRect rt=rtCell;

//	rt.InflateRect(2,2);
//	rt.right-=1;
//	rt.bottom-=1;
//	rt.top+=1;
//	rt.left+=1;
//	pDC->Rectangle(rt);
	pDC->Rectangle(rtCell);
	
	

	pDC->SetROP2(oldMode);
	pDC->SelectObject(oldPen);
	pDC->SelectObject(oldBrush);
}

void CCellDoc::DrawAllCell(CDC *pDC,CRect &rtClient,BOOL bPrint)
{
	

	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	CRect rtCell;
	
	//画背景
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			
			if(!GetCellRect(i,j,rtCell))
				continue;
			if((rtCell & rtClient).IsRectNull())
				continue;
			if(pObj!=NULL)
				pObj->DrawBk(pDC,rtCell);
		}
	}
	//显示内容
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			
			if(!GetCellRect(i,j,rtCell))
				continue;
			if((rtCell & rtClient).IsRectNull())
				continue;
			DrawCell(pDC,pObj,rtCell);
		}
	}

	//画边框
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			
			if(!GetCellRect(i,j,rtCell))
				continue;
			if((rtCell & rtClient).IsRectNull())
				continue;
			if(pObj!=NULL)
				pObj->DrawFrm(pDC,rtCell);
		}
	}

	//标记选择
	if(!bPrint)
	{
		for(i=0;i<nRows;i++)
		{
			CCellRow *pRow=m_ArrayRow[i];
			if(pRow==NULL)
				continue;
			nCols=pRow->m_ArrayCell.GetSize();
			for(j=0;j<nCols;j++)
			{
				CCellObj *pObj;
				pObj=pRow->m_ArrayCell[j];
				if(pObj==NULL)
					continue;
				if(pObj->m_bSelected == FALSE)
					continue;
				if(!GetCellRect(i,j,rtCell))
					continue;
				if((rtCell & rtClient).IsRectNull())
					continue;
				DrawFillSelect(pDC,rtCell);
			}
		}
	}
}

int CCellDoc::GetSelectCellNum(int *nRows,int *nCols,int *nRow,int *nCol,CCellObj **pFirstObj)//获取当前选中单元的个数,行数,列数,第一个选中单元的坐标
{
	int pnSaveCol[512];
	int k;
	int nSelectedColNum=0;
	for(k=0;k<512;k++)
		pnSaveCol[k]=0;

	int nNum=0;
	*nRows=0;
	*nCols=0;
	*nRow=-1;
	*nCol=-1;

	BOOL bFirst=TRUE;
	BOOL bRowHasSelect;
	int nRowNum=m_ArrayRow.GetSize();
	int i,j,nColNum;
	CRect rtCell;
	for(i=0;i<nRowNum;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nColNum=pRow->m_ArrayCell.GetSize();
		bRowHasSelect=FALSE;
		for(j=0;j<nColNum;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(!pObj->m_bSelected)
				continue;
			nNum++;
			if(bFirst)
			{
				*nRow=i;
				*nCol=j;
				bFirst=FALSE;
				if(pFirstObj!=NULL)
					*pFirstObj=pObj;
			}
			
			BOOL bFind=FALSE;
			for(k=0;k<nSelectedColNum;k++)
			{
				if(pnSaveCol[k]==j)
				{
					bFind=TRUE;
					break;
				}
			}
			if(!bFind)//原来没存
			{
				pnSaveCol[nSelectedColNum]=j;
				nSelectedColNum++;
			}
			bRowHasSelect=TRUE;
		}
		if(bRowHasSelect)//该行中有被选取的列
			(*nRows)++;
	}
	*nCols=nSelectedColNum;
	return nNum;
}

BOOL CCellDoc::InsertRow(int nIndex)//在nIndex>0前插入行,-1末尾追加
{
	if(m_warrayRow.GetSize()>=MAXROWS)
		return FALSE;
	if((nIndex <0)||(nIndex >= m_warrayRow.GetSize()))//追加
	{
		m_warrayRow.Add(20);//add Fix Row
		CCellRow *pRow;
		pRow=new CCellRow(m_warrayCol.GetSize());
		m_ArrayRow.Add(pRow);//add cellrow
		return TRUE;
	}
	m_warrayRow.InsertAt(nIndex,20);//insert Fix Row
	CCellRow *pRow;
	pRow=new CCellRow(m_warrayCol.GetSize());
	m_ArrayRow.InsertAt(nIndex,pRow);//insert cellrow
	return TRUE;
}

BOOL CCellDoc::InsertCol(int nIndex)//在nIndex>0前插入列,-1末尾追加
{
	if(m_warrayCol.GetSize()>=MAXCOLS)
		return FALSE;
	if((nIndex <0)||(nIndex >= m_warrayCol.GetSize()))//追加
	{
		m_warrayCol.Add(72);//add Fix Col
		CCellRow *pRow;
		CCellObj *pObj;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -