📄 cellview.cpp
字号:
// CellView.cpp : implementation of the CCellView class
//
#include "stdafx.h"
#include "Cell.h"
#include "MainFrm.h"
#include "CellDoc.h"
#include "CellView.h"
#include <math.h>
#include <stdlib.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void No2Abc(int nNo,CString &szTxt)
{
int ndiv;
ndiv=nNo;
char cc;
szTxt.Empty();
do
{
cc=(ndiv%26)+'A';
szTxt.Insert(0,cc);
ndiv/=26;
}while(ndiv!=0);
}
BOOL Abc2Int(LPCTSTR lpszAbc,int *pn)
{
CString szt=lpszAbc;
if(szt.IsEmpty())
return FALSE;
CString sztt="";
int i;
for(i=0;i<szt.GetLength();i++)
{
sztt.Insert(0,szt[i]);
if((szt[i] < 'A')||(szt[i]>'Z'))
return FALSE;
}
int n=0;
for(i=0;i<sztt.GetLength();i++)
{
int nttt=1;
for(int k=0;k<i;k++)
nttt*=26;
n+=int(sztt[i] -'A') * nttt;
}
*pn=n;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDlgMyColor
IMPLEMENT_DYNAMIC(CDlgMyColor, CColorDialog)
CDlgMyColor::CDlgMyColor(COLORREF clrInit, DWORD dwFlags, CWnd* pParentWnd) :
CColorDialog(clrInit, dwFlags, pParentWnd)
{
m_szTitle="颜色";
}
BEGIN_MESSAGE_MAP(CDlgMyColor, CColorDialog)
//{{AFX_MSG_MAP(CDlgMyColor)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CDlgMyColor::OnInitDialog()
{
CColorDialog::OnInitDialog();
// TODO: Add extra initialization here
SetWindowText(m_szTitle);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/////////////////////////////////////////////////////////////////////////////
// CCellView
IMPLEMENT_DYNCREATE(CCellView, CView)
BEGIN_MESSAGE_MAP(CCellView, CView)
//{{AFX_MSG_MAP(CCellView)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_EDIT_INSERTROW, OnEditInsertrow)
ON_UPDATE_COMMAND_UI(ID_EDIT_INSERTROW, OnUpdateEditInsertrow)
ON_COMMAND(ID_EDIT_INSERTCOL, OnEditInsertcol)
ON_UPDATE_COMMAND_UI(ID_EDIT_INSERTCOL, OnUpdateEditInsertcol)
ON_COMMAND(ID_EDIT_ADDROW, OnEditAddrow)
ON_UPDATE_COMMAND_UI(ID_EDIT_ADDROW, OnUpdateEditAddrow)
ON_COMMAND(ID_EDIT_ADDCOL, OnEditAddcol)
ON_UPDATE_COMMAND_UI(ID_EDIT_ADDCOL, OnUpdateEditAddcol)
ON_COMMAND(ID_EDIT_DELROW, OnEditDelrow)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELROW, OnUpdateEditDelrow)
ON_COMMAND(ID_EDIT_DELCOL, OnEditDelcol)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELCOL, OnUpdateEditDelcol)
ON_WM_CONTEXTMENU()
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_TXT_LEFT, OnTxtLeft)
ON_COMMAND(ID_TXT_RIGHT, OnTxtRight)
ON_COMMAND(ID_TXT_TOP, OnTxtTop)
ON_COMMAND(ID_TXT_VMIN, OnTxtVmin)
ON_COMMAND(ID_TXT_HMID, OnTxtHmid)
ON_COMMAND(ID_TXT_BOTTOM, OnTxtBottom)
ON_COMMAND(ID_TXT_AUTO, OnTxtAuto)
ON_COMMAND(ID_FONT_FAT, OnFontFat)
ON_UPDATE_COMMAND_UI(ID_FONT_FAT, OnUpdateFontFat)
ON_COMMAND(ID_FONT_UNDERLINE, OnFontUnderline)
ON_UPDATE_COMMAND_UI(ID_FONT_UNDERLINE, OnUpdateFontUnderline)
ON_COMMAND(ID_FONT_XT, OnFontXt)
ON_UPDATE_COMMAND_UI(ID_FONT_XT, OnUpdateFontXt)
ON_COMMAND(ID_CELLFRM_LEFT, OnCellfrmLeft)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_LEFT, OnUpdateCellfrmLeft)
ON_COMMAND(ID_CELLFRM_RIGHT, OnCellfrmRight)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_RIGHT, OnUpdateCellfrmRight)
ON_COMMAND(ID_CELLFRM_TOP, OnCellfrmTop)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_TOP, OnUpdateCellfrmTop)
ON_COMMAND(ID_CELLFRM_LT2RB, OnCellfrmLt2rb)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_LT2RB, OnUpdateCellfrmLt2rb)
ON_COMMAND(ID_CELLFRM_LB2RT, OnCellfrmLb2rt)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_LB2RT, OnUpdateCellfrmLb2rt)
ON_COMMAND(ID_CELLFRM_BOTTOM, OnCellfrmBottom)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_BOTTOM, OnUpdateCellfrmBottom)
ON_COMMAND(ID_CELLFRM_NONE, OnCellfrmNone)
ON_UPDATE_COMMAND_UI(ID_CELLFRM_NONE, OnUpdateCellfrmNone)
ON_COMMAND(ID_TXT_COLOR, OnTxtColor)
ON_COMMAND(ID_TXT_BKCOLOR, OnTxtBkcolor)
ON_COMMAND(ID_EDIT_CAL, OnEditCal)
ON_COMMAND(ID_CELL_DOTNUM0, OnCellDotnum0)
ON_COMMAND(ID_CELL_DOTNUM1, OnCellDotnum1)
ON_COMMAND(ID_CELL_DOTNUM2, OnCellDotnum2)
ON_COMMAND(ID_CELL_DOTNUM3, OnCellDotnum3)
ON_COMMAND(ID_CELL_DOTNUM4, OnCellDotnum4)
ON_COMMAND(ID_CELL_DOTNUM5, OnCellDotnum5)
//}}AFX_MSG_MAP
// Standard printing commands
ON_EN_CHANGE(ID_EDIT_CELL, OnChangeEdit)//编辑改变
ON_CBN_SELCHANGE(ID_COMBO_FONT, OnSelchangeComboFont)
ON_CBN_SELCHANGE(ID_COMBO_FONTSIZE, OnSelchangeComboFontsize)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCellView construction/destruction
CCellView::CCellView()
{
// TODO: add construction code here
m_nCurFixColNo=-1;
m_nCurFixRowNo=-1;//当前选中的固定行列
m_nCurEditRow=-1;
m_nCurEditCol=-1;
m_bFontFat=FALSE;
m_bFontUnderLine=FALSE;
m_bFontXt=FALSE;
m_bCellFrmLeft=FALSE;
m_bCellFrmRight=FALSE;
m_bCellFrmTop=FALSE;
m_bCellFrmBottom=FALSE;
m_bCellFrmLT2RB=FALSE;
m_bCellFrmLB2RT=FALSE;
}
CCellView::~CCellView()
{
}
BOOL CCellView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCellView drawing
//0:Normal,1:选中,2:反白
#define FIX_LEFT_WHITE 0X00000001
#define FIX_TOP_WHITE 0X00000002
#define FIX_HAS_SELECT 0X00000008
#define FIX_ALL_SELECT 0X00000010
void CCellView::DrawEditLine(CDC *pDC)//画编辑时网格线
{
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rctClient;
GetClientRect(&rctClient);
int nCol=pDoc->m_warrayCol.GetSize();
int nRow=pDoc->m_warrayRow.GetSize();
int nSCol,nSRow;
nSCol=pDoc->m_nTopLeftColNo;
nSRow=pDoc->m_nTopLeftRowNo;
int i;
//求日right
int nRight=pDoc->m_nTopX-1;
for(i=nSCol;(i<nCol)&&(nRight<rctClient.right);i++)
nRight+=(int)(pDoc->m_warrayCol[i]);
//求日bottom
int nBottom=pDoc->m_nTopY-1;
for(i=nSRow;(i<nRow)&&(nBottom<rctClient.bottom);i++)
nBottom+=(int)(pDoc->m_warrayRow[i]);
COLORREF clrLine=::GetSysColor(COLOR_3DLIGHT);
CPen pen(PS_SOLID,0,clrLine);
CPen *oldPen;
oldPen=pDC->SelectObject(&pen);
//画竖线
int nt=pDoc->m_nTopX-1;
for(i=nSCol;(i<nCol)&&(nt<rctClient.right);i++)
{
nt+=(int)(pDoc->m_warrayCol[i]);
pDC->MoveTo(nt,pDoc->m_nTopY-1);
pDC->LineTo(nt,nBottom);
}
nt=pDoc->m_nTopY-1;
for(i=nSRow;(i<nRow)&&(nt<rctClient.bottom);i++)
{
nt+=(int)(pDoc->m_warrayRow[i]);
pDC->MoveTo(pDoc->m_nTopX-1,nt);
pDC->LineTo(nRight,nt);
}
pDC->SelectObject(oldPen);
}
void CCellView::DrawFixCell(CDC *pDC,
LPCTSTR lpszText,
CRect &rctCell,
DWORD nStyle)//画固定CELL外框0-10 ROW,10-20COL
{
CFont fontTxt,*oldFont;
CBrush *oldBrush;
int oldbkMode;
int oldTxtColor;
int fntWeight=400;
if(((nStyle & FIX_HAS_SELECT)!=0)||((nStyle & FIX_ALL_SELECT)!=0))
fntWeight=800;
fontTxt.CreateFont(14,0,// int nHeight, int nWidth,
0,0,//int nEscapement, int nOrientation,
fntWeight,//int nWeight,
0,0,//BYTE bItalic, BYTE bUnderline,
0,GB2312_CHARSET,//BYTE cStrikeOut, BYTE nCharSet,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,//BYTE nOutPrecision, BYTE nClipPrecision,
1,2,//BYTE nQuality, BYTE nPitchAndFamily,
"宋体");//LPCTSTR lpszFacename
CPen pen1(PS_SOLID,0,RGB(128,128,128));
CPen pen2(PS_SOLID,0,RGB(255,255,255));
CPen pen3(PS_SOLID,0,RGB(0,0,0));
CPen *oldPen;
COLORREF bkColor=::GetSysColor(COLOR_3DLIGHT);
COLORREF txtColor=RGB(0,0,0);
if(nStyle & FIX_ALL_SELECT)
{
bkColor=RGB(0,0,0);
txtColor=RGB(255,255,255);
}
CBrush brhbk(bkColor);
oldbkMode=pDC->SetBkMode(TRANSPARENT);
oldPen=pDC->SelectObject(&pen1);
oldTxtColor=pDC->SetTextColor(RGB(0,0,0));
oldBrush=pDC->SelectObject(&brhbk);
pDC->FillSolidRect(rctCell,bkColor);
CString szt=lpszText;
oldFont=pDC->SelectObject(&fontTxt);
pDC->DrawText(szt,rctCell,DT_SINGLELINE|DT_CENTER |DT_VCENTER);
pDC->SelectObject(&pen2);
if(nStyle & FIX_TOP_WHITE)
{
pDC->MoveTo(rctCell.left,rctCell.top);
pDC->LineTo(rctCell.right,rctCell.top);
}
if(nStyle &FIX_LEFT_WHITE)
{
pDC->MoveTo(rctCell.left,rctCell.top);
pDC->LineTo(rctCell.left,rctCell.bottom);
}
pDC->SelectObject(&pen1);
if((nStyle & FIX_ALL_SELECT)==0)
{
pDC->MoveTo(rctCell.left,rctCell.bottom);
pDC->LineTo(rctCell.right,rctCell.bottom);
pDC->LineTo(rctCell.right,rctCell.top-1);
}
pDC->SetBkMode(oldbkMode);
pDC->SelectObject(oldPen);
pDC->SetTextColor(oldTxtColor);
pDC->SelectObject(oldBrush);
pDC->SelectObject(oldFont);
}
void CCellView::DrawFixRowCol(CDC *pDC)
{
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rctClient;
GetClientRect(&rctClient);
int nCol=pDoc->m_warrayCol.GetSize();
int nRow=pDoc->m_warrayRow.GetSize();
int i;
CRect rtCell;
CString szCellName;
rtCell.top=0;
rtCell.left=0;
rtCell.right=pDoc->m_nWidthFixCol;
rtCell.bottom=pDoc->m_nHigthFixRow;
DrawFixCell(pDC,
"",
rtCell,
FIX_LEFT_WHITE | FIX_TOP_WHITE );//画固定CELL外框0-10 ROW,10-20COL
int nLeft=pDoc->m_nWidthFixCol+1;
for(i=pDoc->m_nTopLeftColNo;i<nCol;i++)
{
rtCell.top=0;
rtCell.left=nLeft;
rtCell.right=nLeft+(int)(pDoc->m_warrayCol[i])-1;
rtCell.bottom=pDoc->m_nHigthFixRow;
if((rctClient & rtCell).IsRectNull())
break;
No2Abc(i,szCellName);
DrawFixCell(pDC,
szCellName,
rtCell,
FIX_LEFT_WHITE );//画固定CELL外框0-10 ROW,10-20COL
nLeft+=(int)(pDoc->m_warrayCol[i]);
}
int nTop=pDoc->m_nHigthFixRow+1;
for(i=pDoc->m_nTopLeftRowNo;i<nRow;i++)
{
rtCell.top=nTop;
rtCell.left=0;
rtCell.right=pDoc->m_nWidthFixCol;
rtCell.bottom=nTop+(int)(pDoc->m_warrayRow[i])-1;
if((rctClient & rtCell).IsRectNull())
break;
szCellName.Format("%d",i+1);
DrawFixCell(pDC,
szCellName,
rtCell,
FIX_TOP_WHITE );//画固定CELL外框0-10 ROW,10-20COL
nTop+=pDoc->m_warrayRow[i];
}
}
void CCellView::OnDraw(CDC* pDC)
{
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap;
// only paint the rect that needs repainting
CRect client;
pDC->GetClipBox(client);
CRect rect = client;
// DocToClient(rect);
if (!pDC->IsPrinting())
{
// draw to offscreen bitmap for fast looking repaints
if (dc.CreateCompatibleDC(pDC))
{
if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
{
OnPrepareDC(&dc, NULL);
pDrawDC = &dc;
// offset origin more because bitmap is just piece of the whole drawing
dc.OffsetViewportOrg(-rect.left, -rect.top);
pOldBitmap = dc.SelectObject(&bitmap);
dc.SetBrushOrg(rect.left % 8, rect.top % 8);
// might as well clip to the same rectangle
dc.IntersectClipRect(client);
}
}
}
if(!pDC->IsPrinting())
pDrawDC->FillSolidRect(client,RGB(255,255,255));
if(!pDC->IsPrinting())
DrawFixRowCol(pDrawDC);
if(!pDC->IsPrinting())
DrawEditLine(pDrawDC);//画编辑时网格线
if(!pDC->IsPrinting())
pDoc->DrawAllCell(pDrawDC,client);
else
pDoc->DrawAllCell(pDrawDC,client,TRUE);
if (pDrawDC != pDC)
{
pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dc.SetViewportOrg(0, 0);
dc.SetWindowOrg(0,0);
dc.SetMapMode(MM_TEXT);
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
}
}
/////////////////////////////////////////////////////////////////////////////
// CCellView printing
BOOL CCellView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
pInfo->SetMaxPage(1);
return DoPreparePrinting(pInfo);
}
void CCellView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCellView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCellView diagnostics
#ifdef _DEBUG
void CCellView::AssertValid() const
{
CView::AssertValid();
}
void CCellView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCellDoc* CCellView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCellDoc)));
return (CCellDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCellView message handlers
void CCellView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(nSBCode==SB_LINEDOWN)
{
if(pDoc->m_nTopLeftRowNo<pDoc->m_warrayRow.GetSize()-1)
{
pDoc->m_nTopLeftRowNo++;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
Invalidate();
}
return;
}
else if(nSBCode==SB_LINEUP)
{
if(pDoc->m_nTopLeftRowNo>0)
{
pDoc->m_nTopLeftRowNo--;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
Invalidate();
}
return;
}
else if(nSBCode==SB_PAGEUP)
{
if(pDoc->m_nTopLeftRowNo==0)
return;
if(pDoc->m_nTopLeftRowNo>=5)
pDoc->m_nTopLeftRowNo-=5;
else
pDoc->m_nTopLeftRowNo=0;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
Invalidate();
}
else if(nSBCode==SB_PAGEDOWN)
{
if(pDoc->m_nTopLeftRowNo==pDoc->m_warrayRow.GetSize())
return;
if(pDoc->m_warrayRow.GetSize() - pDoc->m_nTopLeftRowNo>5)
pDoc->m_nTopLeftRowNo+=5;
else
pDoc->m_nTopLeftRowNo=pDoc->m_warrayRow.GetSize();
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
Invalidate();
}
else if(nSBCode==SB_THUMBPOSITION)//SB_THUMBTRACK)
{
if(pDoc->m_nTopLeftRowNo == (INT)nPos)
return;
pDoc->m_nTopLeftRowNo = nPos;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
Invalidate();
}
else if(nSBCode==SB_BOTTOM)
{
if(pDoc->m_nTopLeftRowNo!=pDoc->m_warrayRow.GetSize() -1)
{
pDoc->m_nTopLeftRowNo=pDoc->m_warrayRow.GetSize() -1;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
}
Invalidate();
}
else if(nSBCode==SB_TOP)
{
if(pDoc->m_nTopLeftRowNo!=0)
{
pDoc->m_nTopLeftRowNo=0;
SetScrollPos(SB_VERT,pDoc->m_nTopLeftRowNo);
}
Invalidate();
}
// CView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CCellView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CCellDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(nSBCode==SB_LINERIGHT)
{
if(pDoc->m_nTopLeftColNo<pDoc->m_warrayCol.GetSize()-1)
{
pDoc->m_nTopLeftColNo++;
SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
Invalidate();
}
return;
}
else if(nSBCode==SB_LINELEFT)
{
if(pDoc->m_nTopLeftColNo>0)
{
pDoc->m_nTopLeftColNo--;
SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
Invalidate();
}
return;
}
else if(nSBCode==SB_PAGELEFT)
{
if(pDoc->m_nTopLeftColNo==0)
return;
if(pDoc->m_nTopLeftColNo>=5)
pDoc->m_nTopLeftColNo-=5;
else
pDoc->m_nTopLeftColNo=0;
SetScrollPos(SB_HORZ,pDoc->m_nTopLeftColNo);
Invalidate();
}
else if(nSBCode==SB_PAGERIGHT)
{
if(pDoc->m_nTopLeftColNo==pDoc->m_warrayCol.GetSize())
return;
if(pDoc->m_warrayCol.GetSize() - pDoc->m_nTopLeftColNo>5)
pDoc->m_nTopLeftColNo+=5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -