example_4view.cpp
来自「基于mfc的SQK数据库连接编程,并包含图形的报表的生成以及表格报表的底层建模」· C++ 代码 · 共 283 行
CPP
283 行
// Example_4View.cpp : implementation of the CExample_4View class
//
#include "stdafx.h"
#include "Example_4.h"
#include "Example_4Doc.h"
#include "Example_4View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExample_4View
IMPLEMENT_DYNCREATE(CExample_4View, CView)
BEGIN_MESSAGE_MAP(CExample_4View, CView)
//{{AFX_MSG_MAP(CExample_4View)
ON_COMMAND(ID_KLINE, OnKline)
//}}AFX_MSG_MAP
// Standard printing commands
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()
/////////////////////////////////////////////////////////////////////////////
// CExample_4View construction/destruction
CExample_4View::CExample_4View()
{
// TODO: add construction code here
}
CExample_4View::~CExample_4View()
{
}
BOOL CExample_4View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CExample_4View drawing
void CExample_4View::OnDraw(CDC* pDC)
{
CExample_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CExample_4View printing
BOOL CExample_4View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CExample_4View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CExample_4View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CExample_4View diagnostics
#ifdef _DEBUG
void CExample_4View::AssertValid() const
{
CView::AssertValid();
}
void CExample_4View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CExample_4Doc* CExample_4View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExample_4Doc)));
return (CExample_4Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExample_4View message handlers
void CExample_4View::OnKline()
{
// TODO: Add your command handler code here
CExample_4Doc* 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[3];
CPen Pen[3];
CBrush *PtrOldBrush;
CPen *PtrOldPen;
Pen[0].CreatePen(PS_SOLID,1,RGB(200,200,254));
Pen[1].CreatePen(PS_SOLID,1,RGB(255,0,0));
Pen[2].CreatePen(PS_SOLID,1,RGB(0,255,0));
Brush[0].CreateSolidBrush(RGB(254,234,234));
Brush[1].CreateSolidBrush(RGB(255,0,0));
Brush[2].CreateSolidBrush(RGB(0,255,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]);
ClientDC.TextOut(210,position,"上证指数日K线图");
ClientDC.Rectangle(92,55,517,310);
ClientDC.SelectObject(&font[1]);
int x0,ymin,ymax;//x0是k线中阴影的横坐标;ymin是最高价换算得出在视图窗口的纵坐标;ymax是最低价换算得出在视图窗口的纵坐标
int x1,x2,y1,y2;//画k线实体时传给函数Rectangle的参数(y1,y2的顺序按阴线,阳线有变化)
int recw=7;//k线实体宽度
int recwh=recw/2;
int xspc=5;//k线之间的间隔
int yl=185;//k线的最大纵坐标
float maxmaxp=(float)(1680.3);//记录集中最高价的最大值
float minminp=(float)(1529.35);//记录集中最低价的最小值
float scale;//单位价格对应的图形纵坐标的逻辑单位数((y1-k线图的最小纵坐标)/maxmaxp-minminp)
int loopn;
CString fsl;
COleDateTime fdt;
scale=(float)((yl-55)/(maxmaxp-minminp));
ClientDC.MoveTo(92,yl);
ClientDC.LineTo(517,yl);
fsl.Format("%g",1529.35);
ClientDC.TextOut(92-48,yl,fsl);
y1=(int)(yl-(1680.3-1529.35)/3*scale);
ClientDC.MoveTo(92,y1);
ClientDC.LineTo(517,y1);
fsl.Format("%g",1529.35+(1680.3-1529.35)/3);
ClientDC.TextOut(92-48,y1,fsl);
y1=(int)(yl-(1680.3-1529.35)/3*2*scale);
ClientDC.MoveTo(92,y1);
ClientDC.LineTo(517,y1);
fsl.Format("%g",1529.35+(1680.3-1529.35)/3*2);
ClientDC.TextOut(92-48,y1,fsl);
x0=92+xspc+recwh+1;
while(!pDoc->m_pRs->EndOfFile)//在图形的边框底边上标记日期刻度
{
ClientDC.MoveTo(x0,305);
ClientDC.LineTo(x0,310);
x0=x0+xspc+recw;
pDoc->m_pRs->MoveNext();
}
x0=92+xspc+recwh+1;
loopn=1;
pDoc->m_pRs->MoveFirst();
while(!pDoc->m_pRs->EndOfFile)//用于绘k线,其中分别对开盘价大于收盘价;开盘价等于收盘价;开盘价小于收盘价(价格已换算成图形的纵坐标)进行了不同处理;
{
ymin=(int)(yl-(pDoc->m_rsRecSet.m_Cf5-minminp)*scale);//Cf4是最高价,Cf5是最低价
ymax=(int)(yl-(pDoc->m_rsRecSet.m_Cf4-minminp)*scale);
x1=x0-recwh;
x2=x0+recwh;
y1=(int)(yl-(pDoc->m_rsRecSet.m_Cf1-minminp)*scale);//Cf1是开价,Cf2是收盘价
y2=(int)(yl-(pDoc->m_rsRecSet.m_Cf2-minminp)*scale);
if(y1>y2)
{
ClientDC.SelectObject(&Pen[1]);
ClientDC.SelectObject(&Brush[1]);
ClientDC.Rectangle(x1,y2,x2,y1);
ClientDC.MoveTo(x0,ymin);
ClientDC.LineTo(x0,ymax);
}
else
{
if(y1==y2)
{ ClientDC.SelectObject(&Pen[1]);
ClientDC.SelectObject(&Brush[1]);
ClientDC.MoveTo(x1,y1);
ClientDC.LineTo(x2,y1);
ClientDC.MoveTo(x0,ymin);
ClientDC.LineTo(x0,ymax);
}
else
{
ClientDC.SelectObject(&Pen[2]);
ClientDC.SelectObject(&Brush[2]);
ClientDC.Rectangle(x1,y1,x2,y2);
ClientDC.MoveTo(x0,ymin);
ClientDC.LineTo(x0,ymax);
}
}
if(loopn==1||fmod(loopn,8.0)==0)//用于在图形下边显示日期
{
fdt=pDoc->m_rsRecSet.m_Cfd;
ClientDC.TextOut(x0-20,310,fdt.Format(
LOCALE_NOUSEROVERRIDE,
LANG_USER_DEFAULT));
}
x0=x0+xspc+recw;
pDoc->m_pRs->MoveNext();
loopn=loopn+1;
}
ClientDC.SelectObject(PtrOldPen);
ClientDC.SelectObject(PtrOldBrush);
ClientDC.SelectObject(oldFont);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?