📄 example_2view.cpp
字号:
// Example_2View.cpp : implementation of the CExample_2View class
//
#include "stdafx.h"
#include "Example_2.h"
#include "Example_2Doc.h"
#include "Example_2View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExample_2View
IMPLEMENT_DYNCREATE(CExample_2View, CScrollView)
BEGIN_MESSAGE_MAP(CExample_2View, CScrollView)
//{{AFX_MSG_MAP(CExample_2View)
ON_COMMAND(ID_INDEX1, OnIndex1)
ON_COMMAND(ID_INDEX2, OnIndex2)
ON_COMMAND(ID_INDEX3, OnIndex3)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExample_2View construction/destruction
CExample_2View::CExample_2View()
{
// TODO: add construction code here
}
CExample_2View::~CExample_2View()
{
}
BOOL CExample_2View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CExample_2View drawing
void CExample_2View::OnDraw(CDC* pDC)
{
CExample_2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(m_option==1)
Dbar(n,fdn);
if(m_option==2)
{
pDoc->m_Exaset.MoveFirst();
if(pDoc->m_Exaset.IsEOF()||pDoc->m_Exaset.IsBOF())
return;
pDC->SetMapMode(MM_TWIPS);
LOGFONT logFont[2];
logFont[0].lfHeight=460;
logFont[0].lfWidth=0;
logFont[0].lfEscapement=0;
logFont[0].lfOrientation=0;
logFont[0].lfWeight=FW_NORMAL;
logFont[0].lfItalic=0;
logFont[0].lfUnderline=0;
logFont[0].lfStrikeOut=0;
logFont[0].lfCharSet=ANSI_CHARSET;
logFont[0].lfOutPrecision=OUT_DEFAULT_PRECIS;
logFont[0].lfClipPrecision=OUT_DEFAULT_PRECIS;
logFont[0].lfQuality=PROOF_QUALITY;
logFont[0].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont[0].lfFaceName,"Times New Roman");
logFont[1].lfHeight=360;
logFont[1].lfWidth=0;
logFont[1].lfEscapement=0;
logFont[1].lfOrientation=0;
logFont[1].lfWeight=FW_NORMAL;
logFont[1].lfItalic=0;
logFont[1].lfUnderline=0;
logFont[1].lfStrikeOut=0;
logFont[1].lfCharSet=ANSI_CHARSET;
logFont[1].lfClipPrecision=CLIP_DEFAULT_PRECIS;
logFont[1].lfQuality=PROOF_QUALITY;
logFont[1].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont[0].lfFaceName,"Times New Roman");
CFont font[2];
font[0].CreateFontIndirect(&logFont[0]);
font[1].CreateFontIndirect(&logFont[1]);
CFont *oldFont=pDC->SelectObject(&font[0]);
int vs1,vs2,vs3,vs4,vs;
int hs;//开始的横坐标
int rw;//列宽
int mlh;//max line height
int pn,ph,ph0;//ph 应该是paper height ,pn应该是paper number
int loopn;
vs1=-900;
vs2=-600;
vs3=-400;
vs4=-2400;
hs=1100;
rw=900;
// ph=0;
pn=0;
ph0=14031+2780;
RECT Rect0,Rect[11];
Rect0.left=hs;
Rect0.right=Rect0.left+rw*11;
Rect0.top=vs1;
Rect0.bottom=Rect0.top+vs2;
Rect[0].left=hs;
Rect[0].right=Rect[0].left+rw;
Rect[0].top=Rect0.bottom+vs3;
Rect[0].bottom=Rect[0].top+vs4;
loopn=0;
while(loopn<=9)
{
Rect[loopn+1].left=Rect[loopn].right;
Rect[loopn+1].right=Rect[loopn+1].left+rw;
Rect[loopn+1].top=Rect[0].top;
Rect[loopn+1].bottom=Rect[0].bottom;
loopn=loopn+1;
}
UINT nFormat1,nFormat2,nFormat3;
nFormat1=DT_CENTER;
nFormat2=DT_CENTER|DT_WORDBREAK;
nFormat3=DT_CENTER|DT_WORDBREAK|DT_CALCRECT;
CString Title,fth[11];
Title="某地区国内生产总值表(单位:亿元)";
fth[0]="年份";
fth[1]="国民生产总值";
fth[2]="国内生产总值";
fth[3]="第一产业";
fth[4]="第二产业";
fth[5]="工业";
fth[6]="建筑业";
fth[7]="第三产业";
fth[8]="交通运输仓储邮电通信业";
fth[9]="批发和零售贸易餐饮业";
fth[10]="人均国内生产总值(元)";
pDC->DrawText(Title,-1,&Rect0,nFormat1);//写第一页的表头
pDC->SelectObject(&font[1]);
vs=Rect[0].top+160;
pDC->MoveTo(Rect[0].left,vs);//这两句是画表头下的横线
pDC->LineTo(hs+rw*11,vs);
loopn=0;
while(loopn<=10)
{
pDC->DrawText(fth[loopn],-1,&Rect[loopn],nFormat2);
loopn=loopn+1;
}
mlh=2300;
CString fs[11];
while(! pDoc->m_Exaset.IsBOF()&&! pDoc->m_Exaset.IsEOF())
{
vs=vs-mlh-100;
pDC->MoveTo(Rect[0].left,vs);//这两句是画表的横线每行都画
pDC->LineTo(hs+rw*11,vs);
fs[0].Format("%1d",pDoc->m_Exaset.m_fy);
fs[1].Format("%1d",pDoc->m_Exaset.m_f1);
fs[2].Format("%1d",pDoc->m_Exaset.m_f2);
fs[3].Format("%1d",pDoc->m_Exaset.m_f3);
fs[4].Format("%1d",pDoc->m_Exaset.m_f4);
fs[5].Format("%1d",pDoc->m_Exaset.m_f5);
fs[6].Format("%1d",pDoc->m_Exaset.m_f6);
fs[7].Format("%1d",pDoc->m_Exaset.m_f7);
fs[8].Format("%1d",pDoc->m_Exaset.m_f8);
fs[9].Format("%1d",pDoc->m_Exaset.m_f9);
fs[10].Format("%1d",pDoc->m_Exaset.m_f10);
mlh=0;
loopn=0;
while(loopn<=10)
{
fs[loopn].TrimRight();
if(fs[loopn].GetLength()==0)
fs[loopn]=" ";
if(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat3))>=mlh)
mlh=int(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat3)));
loopn=loopn+1;
}
Rect[0].left=hs;
Rect[0].right=Rect[0].left+rw;
loopn=0;
while(loopn<=9)
{
Rect[loopn+1].left=Rect[loopn].right;
Rect[loopn+1].right=Rect[loopn+1].left+rw;
loopn=loopn+1;
}
ph=vs+pn*ph0-1300;
if(-ph>=ph0)
{
pn=pn+1;
loopn=0;
while(loopn<=9)
{
pDC->MoveTo(hs+(loopn+1)*rw-50,Rect0.bottom+vs3+160);
pDC->LineTo(hs+(loopn+1)*rw-50,vs);
loopn=loopn+1;
}
vs1=-900-ph0;
Rect0.top=vs1;
Rect0.bottom=Rect0.top+vs2;
Rect[0].top=Rect0.bottom+vs3;
Rect[0].bottom=Rect[0].top+vs4;
loopn=0;
while(loopn<=9)
{
Rect[loopn+1].top=Rect[0].top;
Rect[loopn+1].bottom=Rect[0].bottom;
loopn=loopn+1;
}
pDC->SelectObject(&font[0]);
pDC->DrawText(Title,-1,&Rect0,nFormat1);//写第二页的表头
pDC->SelectObject(&font[1]);
vs=Rect[0].top+160;
pDC->MoveTo(Rect[0].left,vs);
pDC->LineTo(hs+rw*11,vs);
loopn=0;
while(loopn<=10)//写第二页的表项
{
pDC->DrawText(fth[loopn],-1,&Rect[loopn],nFormat2);
loopn=loopn+1;
}
mlh=2300;
vs=vs-mlh-100;
pDC->MoveTo(Rect[0].left,vs);
pDC->LineTo(hs+rw*11,vs);
}//if到此为止
Rect[0].top=vs-80;
Rect[0].bottom=Rect[0].top+vs4;
loopn=1;
while(loopn<=10)
{
Rect[loopn].top=Rect[0].top;
Rect[loopn].bottom=Rect[0].bottom;
loopn=loopn+1;
}
mlh=0;
loopn=0;
while(loopn<=10)
{
fs[loopn].TrimRight();
if(fs[loopn].GetLength()==0)
fs[loopn]=" ";
if(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat2))>=mlh)
mlh=int(fabs(pDC->DrawText(fs[loopn],&Rect[loopn],nFormat2)));
loopn=loopn+1;
}
pDoc->m_Exaset.MoveNext();
}
vs=vs-mlh-100;
// pDC->MoveTo(Rect[0].left,vs);//这两句是画第一行数据下的横线
// pDC->LineTo(hs+rw*11,vs);
loopn=0;
while(loopn<=9)//此循环用于画第2页竖线
{
pDC->MoveTo(hs+(loopn+1)*rw-50,Rect0.bottom+vs3+160);
pDC->LineTo(hs+(loopn+1)*rw-50,vs);
loopn=loopn+1;
}
pDC->SelectObject(oldFont);
}
}
void CExample_2View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
SIZE Size={DRAWWIDTH,DRAWHEIGHT};
SetScrollSizes(MM_TEXT,Size);
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CExample_2View printing
BOOL CExample_2View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
m_option=2;
return DoPreparePrinting(pInfo);
}
void CExample_2View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: add extra initialization before printing
m_PageHeight=pDC->GetDeviceCaps(VERTRES);//设置打印页面的高度相素,取得打印页面的尺寸
m_PageHeight=pDC->GetDeviceCaps(HORZRES);//设置打印页面的款度相素
m_NumRows=DRAWHEIGHT/m_PageHeight+(DRAWHEIGHT%m_PageHeight>0);
m_NumCols=DRAWWIDTH/m_PageWidth+(DRAWWIDTH%m_PageWidth>0);
pInfo->SetMinPage(1);//设置最小打印页数即第一页的页号
pInfo->SetMaxPage(m_NumRows*m_NumCols);//设置最大页数即最后一页的页号
CScrollView::OnBeginPrinting(pDC,pInfo);
}
void CExample_2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CExample_2View diagnostics
#ifdef _DEBUG
void CExample_2View::AssertValid() const
{
CScrollView::AssertValid();
}
void CExample_2View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CExample_2Doc* CExample_2View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExample_2Doc)));
return (CExample_2Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExample_2View message handlers
void CExample_2View::Dbar(int n,CString fdn)
{
CExample_2Doc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_Exaset.MoveFirst();
if(pDoc->m_Exaset.IsBOF()||pDoc->m_Exaset.IsEOF())
return;
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
CBrush Brush[2],Brushc;
CPen Pen[2],Penc;
CBrush *PtrOldBrush;
CPen *PtrOldPen;
Pen[0].CreatePen(PS_SOLID,1,RGB(200,200,254));
Pen[1].CreatePen(PS_SOLID,1,RGB(0,0,0));
Brush[0].CreateSolidBrush(RGB(254,234,234));
Brush[1].CreateSolidBrush(RGB(0,255,0));
Brushc.CreateSolidBrush(ClientDC.GetBkColor());
Penc.CreatePen(PS_SOLID,1,ClientDC.GetBkColor());
PtrOldBrush=ClientDC.SelectObject(&Brushc);
PtrOldPen=ClientDC.SelectObject(&Penc);
RECT RClient;
GetClientRect(&RClient);
ClientDC.Rectangle(&RClient);
ClientDC.SelectObject(&Pen[0]);
ClientDC.SelectObject(&Brush[0]);
//PtrOldPen=ClientDC.SelectObject(&Pen[0]);
//PtrOldBrush=ClientDC.SelectObject(&Brush[0]);//这句是为了给背景添色
LOGFONT logFont[2];
logFont[0].lfHeight=24;
logFont[0].lfWidth=0;
logFont[0].lfEscapement=0;
logFont[0].lfOrientation=0;
logFont[0].lfWeight=FW_NORMAL;
logFont[0].lfItalic=0;
logFont[0].lfUnderline=0;
logFont[0].lfStrikeOut=0;
logFont[0].lfCharSet=ANSI_CHARSET;
logFont[0].lfOutPrecision=OUT_DEFAULT_PRECIS;
logFont[0].lfClipPrecision=OUT_DEFAULT_PRECIS;
logFont[0].lfQuality=PROOF_QUALITY;
logFont[0].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont[0].lfFaceName,"Times New Roman");
UINT position=20;
logFont[1].lfHeight=16;
logFont[1].lfWidth=6;
logFont[1].lfEscapement=0;
logFont[1].lfOrientation=0;
logFont[1].lfWeight=FW_NORMAL;
logFont[1].lfItalic=0;
logFont[1].lfUnderline=0;
logFont[1].lfStrikeOut=0;
logFont[1].lfCharSet=ANSI_CHARSET;
logFont[1].lfClipPrecision=CLIP_DEFAULT_PRECIS;
logFont[1].lfQuality=PROOF_QUALITY;
logFont[1].lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont[1].lfFaceName,"Times New Roman");
CFont font[2];
font[0].CreateFontIndirect(&logFont[0]);
font[1].CreateFontIndirect(&logFont[1]);
CFont *oldFont=ClientDC.SelectObject(&font[0]);
fdn="某地区"+fdn;
ClientDC.TextOut(285,position,fdn);//position已经在上边定义过了 为20
ClientDC.Rectangle(30,55,765,315);//绘制表格边界
ClientDC.SelectObject(&Pen[1]);//以下三条开始为绘制直条做准备
ClientDC.SelectObject(&Brush[1]);
ClientDC.SelectObject(&font[1]);
int x1,x2,y;//x1,x2分别是条形图中直条的左上角和右下角的x坐标;y是直条的左上角图标
int fld,age;//fld从记录集中读取选定的变量(即选定数据表中的某个字段)的值;age从记录集中读取的对应与数据表中字段fy的变量的值。
int rectw=15;//直条的宽度
int space=10;//相邻两直条之间的距离
float rectmaxh=140;//直条的最大高度
float scale;//与记录内字段的最大比值
int loopn;
CString fy;
switch(n)
{
case 1:scale=rectmaxh/6784;
break;
case 2:scale=rectmaxh/6877;
break;
case 10:scale=rectmaxh/544;
}
loopn=1;
x2=30;
while(!pDoc->m_Exaset.IsEOF())
{
age=pDoc->m_Exaset.m_fy;
switch(n)
{
case 1:fld=pDoc->m_Exaset.m_f1;
break;
case 2:fld=pDoc->m_Exaset.m_f2;
break;
case 10:fld=pDoc->m_Exaset.m_f10;
}
x1=x2+space;
x2=x1+rectw;
y=315-(int)(fld*scale);
ClientDC.Rectangle(x1,y,x2,315);
fy.Format("%1d",age);
if(fmod(loopn,2.0)!=0)
ClientDC.TextOut(x1-8,320,fy);
pDoc->m_Exaset.MoveNext();
loopn=loopn+1;
}
ClientDC.SelectObject(PtrOldPen);
ClientDC.SelectObject(PtrOldBrush);
ClientDC.SelectObject(oldFont);
}
void CExample_2View::OnIndex1()
{
// TODO: Add your command handler code here
n=1;
fdn="国民生产总值";
Dbar(n,fdn);
}
void CExample_2View::OnIndex2()
{
// TODO: Add your command handler code here
n=2;
fdn="国内生产总值";
Dbar(n,fdn);
}
void CExample_2View::OnIndex3()
{
// TODO: Add your command handler code here
n=10;
fdn="人均国内生产总值";
Dbar(n,fdn);
}
void CExample_2View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
CScrollView::OnPrepareDC(pDC, pInfo);
if(pInfo==NULL)
return;
int CurRow=pInfo->m_nCurPage/m_NumCols+(pInfo->m_nCurPage%m_NumCols>0);
int CurCol=(pInfo->m_nCurPage-1)%m_NumCols+1;
pDC->SetViewportOrg
(-m_PageWidth*(CurCol-1),
-m_PageHeight*(CurRow-1));
}
BOOL CExample_2View::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
m_option=0;
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -