📄 example_3view.cpp
字号:
// Example_3View.cpp : implementation of the CExample_3View class
//
#include "stdafx.h"
#include "Example_3.h"
#include "Example_3Doc.h"
#include "Example_3View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExample_3View
IMPLEMENT_DYNCREATE(CExample_3View, CScrollView)
BEGIN_MESSAGE_MAP(CExample_3View, CScrollView)
//{{AFX_MSG_MAP(CExample_3View)
ON_COMMAND(ID_INDEX1, OnIndex1)
ON_COMMAND(ID_INDEX2, OnIndex2)
ON_COMMAND(ID_INDEX3, OnIndex3)
ON_COMMAND(ID_FILE_PRINT_DIRECTLY,OnFilePrintDirectly)
//}}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_3View construction/destruction
CExample_3View::CExample_3View()
{
// TODO: add construction code here
}
CExample_3View::~CExample_3View()
{
}
BOOL CExample_3View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CExample_3View drawing
void CExample_3View::OnDraw(CDC* pDC)
{
CExample_3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(m_option==1)
Dline(n,fdn);
if(m_option==2)
Ptable(pDC);
}
void CExample_3View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: calculate the total size of this view
SIZE Size={DRAWWIDTH,DRAWHEIGHT};
SetScrollSizes(MM_TEXT,Size);
}
/////////////////////////////////////////////////////////////////////////////
// CExample_3View printing
BOOL CExample_3View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
m_option=2;
return DoPreparePrinting(pInfo);
}
void CExample_3View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: add extra initialization before printing
m_PageHeight=pDC->GetDeviceCaps(VERTRES);//设置打印页面的高度相素,取得打印页面的尺寸
m_PageHeight=pDC->GetDeviceCaps(HORZRES);//设置打印页面的款度相素
int pl=(int)(Ptable(pDC)/1440*2.54*10*10);//开始动态分页
m_NumCols=1;
m_NumRows=pl/m_PageHeight+(pl%m_PageHeight>0);//上章pl处为DRAWHEIGHT,动态分页结束,以上三行也是原理同第2章唯一不同之处,也是所谓的动态分页
//调用Ptable返回整个打印图形的垂直高度,以此计算整个图形所需要的叶数,因为横向不用分页,所以总叶数就是m_NumRows
pInfo->SetMinPage(1);//设置最小打印页数即第一页的页号
pInfo->SetMaxPage(m_NumRows*m_NumCols);//设置最大页数即最后一页的页号
CScrollView::OnBeginPrinting(pDC,pInfo);
}
void CExample_3View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CExample_3View diagnostics
#ifdef _DEBUG
void CExample_3View::AssertValid() const
{
CScrollView::AssertValid();
}
void CExample_3View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CExample_3Doc* CExample_3View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExample_3Doc)));
return (CExample_3Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExample_3View message handlers
void CExample_3View::Dline(int n, CString fdn)
{
CExample_3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_pRs->MoveFirst();
if(pDoc->m_pRs->BOF||pDoc->m_pRs->EndOfFile)
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(255,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(180,position,fdn);//position已经在上边定义过了 为20
ClientDC.Rectangle(25,55,565,315);//绘制表格边界
ClientDC.SelectObject(&Pen[1]);//以下三条开始为绘制直条做准备
ClientDC.SelectObject(&Brush[1]);
ClientDC.SelectObject(&font[1]);
int x,y;//x,y分别是折线图上点的横纵坐标,为传给函数MoveTo,LineTo的参数
int recn=16;//记录集中的记录数目
int xspc;//每两点之间横坐标差的绝对值
float hl;//记录集中该种价格指数的最低值
int yl=185;//折线图在窗口内的最大纵坐标
float scale;//(折线图在窗口内的最大纵坐标-折线图在窗口内的最小纵坐标)/(记录集中该种价格指数的最大值-记录集中该种价格指数的最小值)
int loopn;
int age;
float fld;
CString fy;
xspc=(int)((565-25)/recn-1);
switch(n)
{
case 1:hl=(float)(99);
scale=(float)((yl-55)/(124.2-hl));
break;
case 2:hl=(float)(100.6);
scale=(float)((yl-55)/(126.6-hl));
break;
case 3:hl=(float)(100.7);
scale=(float)((yl-55)/(127.6-hl));
}
age=pDoc->m_rsRecSet.m_Cfy;
switch(n)
{
case 1:fld=pDoc->m_rsRecSet.m_Cf1;
break;
case 2:fld=pDoc->m_rsRecSet.m_Cf2;
break;
case 3:fld=pDoc->m_rsRecSet.m_Cf3;
break;
}
x=25;
pDoc->m_pRs->MoveNext();
ClientDC.MoveTo(x,315);
ClientDC.LineTo(x,309);
while(!pDoc->m_pRs->EndOfFile)
{
x=x+xspc;
pDoc->m_pRs->MoveNext();
ClientDC.MoveTo(x,315);
ClientDC.LineTo(x,309);
}
x=25;
y=(int)(yl-(fld-hl)*scale);
ClientDC.MoveTo(x,y);
pDoc->m_pRs->MoveFirst();
pDoc->m_pRs->MoveNext();
loopn=1;
while(!pDoc->m_pRs->EndOfFile)
{
fy.Format("%1d",age);
if(fmod(loopn,2.0)!=0)
ClientDC.TextOut(x-14,320,fy);
age=pDoc->m_rsRecSet.m_Cfy;
switch(n)
{
case 1:fld=pDoc->m_rsRecSet.m_Cf1;
break;
case 2:fld=pDoc->m_rsRecSet.m_Cf2;
break;
case 3:fld=pDoc->m_rsRecSet.m_Cf3;
break;
}
x=x+xspc;
y=(int)(yl-(fld-hl)*scale);
ClientDC.LineTo(x,y);
pDoc->m_pRs->MoveNext();
loopn=loopn+1;
}
ClientDC.SelectObject(PtrOldPen);
ClientDC.SelectObject(PtrOldBrush);
ClientDC.SelectObject(oldFont);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -