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 + -
显示快捷键?