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

📄 cellview.cpp

📁 类似Excel的设计器源代码,基本实现电子图表的功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		else
			pDoc->m_nTopLeftColNo=pDoc->m_warrayCol.GetSize();

		SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);	
		Invalidate();
	}
	else if(nSBCode==SB_THUMBPOSITION)//SB_THUMBTRACK)
	{
		if(pDoc->m_nTopLeftColNo == (INT)nPos)
			return;
		pDoc->m_nTopLeftColNo = nPos;
		SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
		Invalidate();
	}
	else if(nSBCode==SB_RIGHT)
	{
		if(pDoc->m_nTopLeftColNo!=pDoc->m_warrayCol.GetSize() -1)
		{
			pDoc->m_nTopLeftColNo=pDoc->m_warrayCol.GetSize() -1;
			SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
		}
		Invalidate();
	}

	else if(nSBCode==SB_LEFT)
	{
		if(pDoc->m_nTopLeftColNo!=0)
		{
			pDoc->m_nTopLeftColNo=0;
			SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
		}
		Invalidate();
	}
//	CView::OnHScroll(nSBCode, nPos, pScrollBar);
}

BOOL CCellView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	dwStyle|=WS_VSCROLL;
	dwStyle|=WS_HSCROLL;

	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

void CCellView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	BOOL bret;
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	SCROLLINFO scinfo;
	scinfo.cbSize=sizeof(SCROLLINFO);

	if(!GetScrollInfo( SB_HORZ, &scinfo))
		return;
	scinfo.nMin=0;
	scinfo.nMax=pDoc->m_warrayCol.GetSize();
	scinfo.nPos=0;
	scinfo.nPage=5;
	scinfo.nTrackPos=0;

	bret=SetScrollInfo( SB_HORZ, &scinfo);


	if(!GetScrollInfo( SB_VERT, &scinfo))
		return;
	scinfo.nMin=0;
	scinfo.nMax=pDoc->m_warrayRow.GetSize();
	scinfo.nPos=0;
	scinfo.nPage=10;
	scinfo.nTrackPos=0;
	bret=SetScrollInfo( SB_VERT, &scinfo);

}

BOOL CCellView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return TRUE;
//	return CView::OnEraseBkgnd(pDC);
}

int CCellView::HitTestFixRow(int *nRowNo,CPoint point)//
{
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nt=pDoc->m_nHigthFixRow;
	int i;
	CRect rt;
	for(i=pDoc->m_nTopLeftRowNo;i<pDoc->m_warrayRow.GetSize();i++)
	{
		rt.top=nt+3;
		nt+=(int)pDoc->m_warrayRow[i];
		rt.bottom=nt-3;

		rt.left=0;
		rt.right=pDoc->m_nWidthFixCol;

		if(rt.PtInRect(point))
		{
			*nRowNo=i;
			return HIT_IN;
		}

		rt.top=nt-2;
		rt.bottom=nt+2;
		if(rt.PtInRect(point))
		{
			*nRowNo=i;
			return HIT_ADJUST;
		}
	}
	*nRowNo=-1;
	return HIT_NO;
}

int CCellView::HitTestFixCol(int *nColNo,CPoint point)//
{
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nt=pDoc->m_nWidthFixCol;
	int i;
	CRect rt;
	for(i=pDoc->m_nTopLeftColNo;i<pDoc->m_warrayCol.GetSize();i++)
	{
		rt.top=0;
		rt.bottom=pDoc->m_nHigthFixRow;

		rt.left=nt+3;
		nt+=(int)pDoc->m_warrayCol[i];
		rt.right=nt-3;

		
		if(rt.PtInRect(point))
		{
			*nColNo=i;
			return HIT_IN;
		}

		rt.left=nt-2;
		rt.right=nt+2;
		if(rt.PtInRect(point))
		{
			*nColNo=i;
			return HIT_ADJUST;
		}
	}
	*nColNo=-1;
	return HIT_NO;
}

BOOL CCellView::HitTestCell(int *nRow,int *nCol,CPoint point)
{
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nx=pDoc->m_nTopX;
	int ny=pDoc->m_nTopY;
	int i,j;
	CRect rt;
	for(i=pDoc->m_nTopLeftColNo;i<pDoc->m_warrayCol.GetSize();i++)
	{
		rt.left=nx;
		nx+=(int)pDoc->m_warrayCol[i];
		rt.right=nx-1;

		ny=pDoc->m_nHigthFixRow;
		for(j=pDoc->m_nTopLeftRowNo;j<pDoc->m_warrayRow.GetSize();j++)
		{
			rt.top=ny;
			ny+=(int)pDoc->m_warrayRow[j];
			rt.bottom=ny-1;
		
			if(rt.PtInRect(point))
			{
				*nCol=i;
				*nRow=j;
				return TRUE;
			}
		}
	}
	return FALSE;
}


void CCellView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CPoint local;
	local=point;
	int nColW;
	int nRowH;
	if(m_DrawShape==adjustcol)
	{
		int nt=local.x-m_ptLast.x;
		if(nt==0)
		{
			return;
		}
		if((m_nCurFixColNo>=0)&&(m_nCurFixColNo<pDoc->m_warrayCol.GetSize()))
		{
			nColW=(int)pDoc->m_warrayCol[m_nCurFixColNo];
			if((nColW + nt) > 12)
			{
				pDoc->m_warrayCol[m_nCurFixColNo]+=nt;
				m_ptLast=local;
				Invalidate();
				pDoc->SetModifiedFlag();
				return;
			}
		}
		return;
	}

	if(m_DrawShape==adjustrow)
	{
		int nt=local.y-m_ptLast.y;
		if(nt==0)
		{
			return;
		}
		if((m_nCurFixRowNo>=0)&&(m_nCurFixRowNo<pDoc->m_warrayRow.GetSize()))
		{
			nRowH=(int)pDoc->m_warrayRow[m_nCurFixRowNo];
			if((nRowH + nt) > 12)
			{
				pDoc->m_warrayRow[m_nCurFixRowNo]+=nt;
				m_ptLast=local;
				Invalidate();
				pDoc->SetModifiedFlag();
				return;
			}
		}
		return;
	}
	if(m_DrawShape==rectselect)
	{
		CRect rtc;
		rtc.left=m_ptLast.x;
		rtc.top=m_ptLast.y;
		rtc.right=local.x;
		rtc.bottom=local.y;
		rtc.NormalizeRect();
		if(!(nFlags & MK_SHIFT))
			pDoc->RemoveAllSelectBut(-1,-1);
		pDoc->SelectInRect(rtc);
		this->Invalidate();
		return;


	}
	int nAdJustCol;
	if(HIT_ADJUST==HitTestFixCol(&nAdJustCol,point))
	{
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEWE));
		return;

	}

	if(HIT_ADJUST==HitTestFixRow(&nAdJustCol,point))
	{
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS));
		return;
	}
	m_ptLast=local;
	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

}

void CCellView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	::SetClassLong(GetSafeHwnd(),GCL_HCURSOR,NULL);
	m_uMouseFlag=nFlags;
	int nAdJustCol;
	int FixHit;
	FixHit=HitTestFixCol(&nAdJustCol,point);
	if(FixHit==HIT_ADJUST)
	{
		
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEWE));
		m_nCurFixColNo=nAdJustCol;
		m_DrawShape=adjustcol;
		m_ptLast=point;
		return;

	}
	else if(FixHit==HIT_IN)
	{
		if(nFlags & MK_SHIFT)		
		{
			int i;
			int nRows=pDoc->m_warrayRow.GetSize();
			for(i=0;i<nRows;i++)
				pDoc->Select(i,nAdJustCol,TRUE);
		}
		else
		{
			int i;
			int nRows=pDoc->m_warrayRow.GetSize();
			if(nRows>0)
				pDoc->RemoveAllSelectBut(0,nAdJustCol);
			for(i=0;i<nRows;i++)
				pDoc->Select(i,nAdJustCol,TRUE);
		}
		this->Invalidate();
		return;

	}
	FixHit=HitTestFixRow(&nAdJustCol,point);
	if(FixHit==HIT_ADJUST)
	{
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS));
		m_nCurFixRowNo=nAdJustCol;
		m_DrawShape=adjustrow;
		m_ptLast=point;
		return;

	}
	else if(FixHit==HIT_IN)
	{
		if(nFlags & MK_SHIFT)		
		{
			int i;
			int nCols=pDoc->m_warrayCol.GetSize();
			for(i=0;i<nCols;i++)
				pDoc->Select(nAdJustCol,i,TRUE);
		}
		else
		{
			int i;
			int nCols=pDoc->m_warrayCol.GetSize();
			if(nCols>0)
				pDoc->RemoveAllSelectBut(nAdJustCol,0);
			for(i=0;i<nCols;i++)
				pDoc->Select(nAdJustCol,i,TRUE);
		}
		this->Invalidate();
		return;

	}
	
	int nRow,nCol;
	if(HitTestCell(&nRow,&nCol,point))
	{
		if(nFlags & MK_SHIFT)
			pDoc->Select(nRow,nCol,TRUE);
		else
			pDoc->RemoveAllSelectBut(nRow,nCol);
		this->Invalidate();
		m_DrawShape=rectselect;
		m_ptLast=point;	

//		CCellObj *pCell;
//		pCell=pDoc->GetCell(nRow,nCol);
//		if(pCell!=NULL)
//			((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_wndToolBarTextTool.SetDlgItemText(ID_EDIT_CELL,pCell->m_szDef);
//
		return;
	}

	CRect rtall;
	rtall.left=0;
	rtall.right=pDoc->m_nWidthFixCol;
	rtall.top=0;
	rtall.bottom=pDoc->m_nHigthFixRow;

	if(rtall.PtInRect(point))
	{
		pDoc->SelectAll();
		this->Invalidate();
	}
	m_DrawShape=normal;
	::SetClassLong(GetSafeHwnd(),GCL_HCURSOR,
		(LONG)(AfxGetApp()->LoadCursor(IDC_ARROW)));

}

void CCellView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_DrawShape=normal;

	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nRows,nCols,nRow,nCol;
	CCellObj *pFirstObj=NULL;

	int nSels=pDoc->GetSelectCellNum(&nRows,&nCols,&nRow,&nCol,&pFirstObj);//获取当前选中单元的个数,行数,列数,第一个选中单元的坐标

	CMainFrame *pwndMain;
	pwndMain=(CMainFrame *)(AfxGetApp()->m_pMainWnd);
	CComboBox * pCombo=(CComboBox *)(&(pwndMain->m_wndToolBarTextTool.m_ComboFont));

	if(nSels==0)
	{
		
		pCombo->SelectString(-1,"宋体");

		pCombo=(CComboBox *)(&(pwndMain->m_wndToolBarTextTool.m_ComboFontSize));
		pCombo->SelectString(-1,"14");
	}
	else if(nSels==1)
	{
		if(pFirstObj!=NULL)
		{
			
			pCombo->SelectString(-1,pFirstObj->GetLogFont()->lfFaceName);	
			CString szt;
			szt.Format("%d",pFirstObj->GetLogFont()->lfHeight);
			pCombo=(CComboBox *)(&(pwndMain->m_wndToolBarTextTool.m_ComboFontSize));
			pCombo->SelectString(-1,szt);

			((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_wndToolBarTextTool.SetDlgItemText(ID_EDIT_CELL,pFirstObj->m_szDef);
			m_nCurEditCol=nCol;
			m_nCurEditRow=nRow;

			if(pFirstObj->GetLogFont()->lfWeight >400)
				m_bFontFat=TRUE;
			else
				m_bFontFat=FALSE;

			if(pFirstObj->GetLogFont()->lfItalic)
				m_bFontXt=TRUE;
			else
				m_bFontXt=FALSE;

			if(pFirstObj->GetLogFont()->lfUnderline)
				m_bFontUnderLine=TRUE;
			else
				m_bFontUnderLine=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMLEFT)
				m_bCellFrmLeft=TRUE;
			else
				m_bCellFrmLeft=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMTOP)
				m_bCellFrmTop=TRUE;
			else
				m_bCellFrmTop=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMRIGHT)
				m_bCellFrmRight=TRUE;
			else
				m_bCellFrmRight=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMBOTTOM)
				m_bCellFrmBottom=TRUE;
			else
				m_bCellFrmBottom=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMLT2RB)
				m_bCellFrmLT2RB=TRUE;
			else
				m_bCellFrmLT2RB=FALSE;

			if(pFirstObj->m_dwFlags & CELL_FRMLB2RT)
				m_bCellFrmLB2RT=TRUE;
			else
				m_bCellFrmLB2RT=FALSE;
				
	
		}
	}
	else
	{
		
		pCombo->SetCurSel(-1);
		pCombo=(CComboBox *)(&(pwndMain->m_wndToolBarTextTool.m_ComboFontSize));
		pCombo->SetCurSel(-1);

		((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_wndToolBarTextTool.SetDlgItemText(ID_EDIT_CELL,"");

		m_nCurEditCol=-1;
		m_nCurEditRow=-1;

		m_bFontFat=FALSE;
		m_bFontXt=FALSE;
		m_bFontUnderLine=FALSE;

		m_bCellFrmLeft=FALSE;
		m_bCellFrmRight=FALSE;
		m_bCellFrmTop=FALSE;
		m_bCellFrmBottom=FALSE;
		m_bCellFrmLT2RB=FALSE;
		m_bCellFrmLB2RT=FALSE;
	}
	CView::OnLButtonUp(nFlags, point);
}

void CCellView::OnEditInsertrow() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	int nRows,nCols,nRow,nCol;
	int nIndex=pDoc->GetSelectCellNum(&nRows,&nCols,&nRow,&nCol);
	if(nRows !=1)
		return;
	if(pDoc->InsertRow(nRow))
	{
		SetScrollRange(SB_VERT,0,pDoc->m_warrayRow.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}
}

void CCellView::OnUpdateEditInsertrow(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CCellView::OnEditInsertcol() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nRows,nCols,nRow,nCol;
	int nIndex=pDoc->GetSelectCellNum(&nRows,&nCols,&nRow,&nCol);
	if(nCols !=1)
		return;
	if(pDoc->InsertCol(nCol))
	{
		SetScrollRange(SB_HORZ,0,pDoc->m_warrayCol.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}
}

void CCellView::OnUpdateEditInsertcol(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CCellView::OnEditAddrow() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->InsertRow(-1))
	{
		SetScrollRange(SB_VERT,0,pDoc->m_ArrayRow.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}
}

void CCellView::OnUpdateEditAddrow(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CCellView::OnEditAddcol() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->InsertCol(-1))
	{
		SetScrollRange(SB_HORZ,0,pDoc->m_warrayCol.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}
}

void CCellView::OnUpdateEditAddcol(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CCellView::OnEditDelrow() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	int nRows,nCols,nRow,nCol;
	int nIndex=pDoc->GetSelectCellNum(&nRows,&nCols,&nRow,&nCol);
	if(nRows !=1)
		return;
	if(pDoc->DelRow(nRow))
	{
		SetScrollRange(SB_VERT,0,pDoc->m_warrayRow.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}
}

void CCellView::OnUpdateEditDelrow(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CCellView::OnEditDelcol() 
{
	// TODO: Add your command handler code here
	CCellDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nRows,nCols,nRow,nCol;
	int nIndex=pDoc->GetSelectCellNum(&nRows,&nCols,&nRow,&nCol);
	if(nCols !=1)
		return;
	if(pDoc->DelCol(nCol))
	{
		SetScrollRange(SB_HORZ,0,pDoc->m_warrayCol.GetSize());
		pDoc->UpdateAllViews(NULL);
		pDoc->SetModifiedFlag();
	}	
}

void CCellView::OnUpdateEditDelcol(CCmdUI* pCmdUI) 
{

⌨️ 快捷键说明

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