📄 celldoc.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// 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 + -