KlineView.cpp
#include "stdafx.h"
#include "Client.h"
#include "ClientDoc.h"
#include "KlineView.h"
#include "KlineRightView.h"
#include "KlineLeftView.h"
#include "KlineMiddleView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CKLineView, CView)
BEGIN_MESSAGE_MAP(CKLineView, CView)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
CKLineView::CKLineView()
{
}
CKLineView::~CKLineView()
{
}
BOOL CKLineView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
void CKLineView::OnDraw(CDC* )
{
CClientDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
}
#ifdef _DEBUG
void CKLineView::AssertValid() const
{
CView::AssertValid();
}
void CKLineView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CClientDoc* CKLineView::GetDocument() const
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClientDoc)));
return (CClientDoc*)m_pDocument;
}
#endif
int CKLineView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CCreateContext context;
context.m_pCurrentDoc = GetDocument();
context.m_pCurrentFrame = GetTopLevelFrame();
context.m_pLastView = this;
context.m_pNewDocTemplate = NULL;
if (!m_wndSplitter1.CreateStatic(this,1,3))
{
return FALSE;
}
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CKlineLeftView),CSize(100,100),&context);
m_wndSplitter1.CreateView(0,1,RUNTIME_CLASS(CKlineMiddleView),CSize(100,100),&context);
m_wndSplitter1.CreateView(0,2,RUNTIME_CLASS(CKlineRightView),CSize(100,100),&context);
m_wndSplitter1.RecalcLayout();
return 0;
}
void CKLineView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
CRect rect;
GetClientRect(&rect);
if (m_wndSplitter1.GetSafeHwnd())
{
m_wndSplitter1.MoveWindow(&rect);
m_wndSplitter1.SetColumnInfo(0,60,50);
if (rect.Width()-250>0)
{
m_wndSplitter1.SetColumnInfo(1,rect.Width()-250,1);
}
m_wndSplitter1.RecalcLayout();
}
}
MySplitter.cpp
#include "StdAfx.h"
#include "MySplitter.h"
IMPLEMENT_DYNCREATE(CMySplitter, CSplitterWnd)
CMySplitter::CMySplitter()
{
m_cxSplitter = 0;
m_cySplitter = 0;
m_cxBorderShare = 0;
m_cyBorderShare = 0;
m_cxSplitterGap= 1;
m_cySplitterGap= 1;
}
CMySplitter::~CMySplitter()
{
}
BEGIN_MESSAGE_MAP(CMySplitter, CSplitterWnd)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
void CMySplitter::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd::OnLButtonDown(nFlags,point);
}
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd::OnMouseMove(nFlags, point);
}
BOOL CMySplitter::PreCreateWindow(CREATESTRUCT& cs)
{
return CSplitterWnd::PreCreateWindow(cs);
}
void CMySplitter::OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rect)
{
if (pDC == NULL)
{
RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
return;
}
ASSERT_VALID(pDC);
pDC->FillSolidRect(rect,RGB(0,0,0));
}
KlineLeftView.cpp
#include "stdafx.h"
#include "Client.h"
#include "KlineLeftView.h"
CKlineLeftView* Lv;
IMPLEMENT_DYNCREATE(CKlineLeftView, CFormView)
CKlineLeftView::CKlineLeftView()
: CFormView(CKlineLeftView::IDD)
{
}
CKlineLeftView::~CKlineLeftView()
{
}
void CKlineLeftView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CKlineLeftView, CFormView)
ON_WM_SIZE()
ON_WM_CREATE()
END_MESSAGE_MAP()
#ifdef _DEBUG
void CKlineLeftView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CKlineLeftView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif
void CKlineLeftView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
}
void CKlineLeftView::OnDraw(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(&rect,RGB(20,32,52));
this->RePaint();
}
void CKlineLeftView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
}
void CKlineLeftView::Updata(int IDpoint)
{
CRect rect;
CClientDC pDC(Lv);
GetClientRect(&rect);
pDC.FillSolidRect(&rect,RGB(20,32,52));
CClientDoc* pDoc = (CClientDoc*)GetDocument();
SetTextColor(pDC, RGB(255,255,255));
SetBkMode(pDC, TRANSPARENT);
pDC.TextOut(rect.left+3,rect.top+20,"开盘价");
pDC.TextOut(rect.left+3,rect.top+80,"最高价");
pDC.TextOut(rect.left+3,rect.top+140,"最低价");
pDC.TextOut(rect.left+3,rect.top+200,"收盘价");
pDC.TextOut(rect.left+3,rect.top+300,"成交量");
pDC.TextOut(rect.left+3,rect.top+380,"持仓量");
pDC.TextOut(rect.left+3,rect.top+460,"结算");
CString KH,KL,KO,KC,MCO,PCent;
KH.Format("%.2f",pDoc->m_DataKLine[IDpoint].KHighestPrice);
KL.Format("%.2f",pDoc->m_DataKLine[IDpoint].KLowestPrice);
KO.Format("%.2f",pDoc->m_DataKLine[IDpoint].KOpenPrice);
KC.Format("%.2f",pDoc->m_DataKLine[IDpoint].KClosePrice);
if(IDpoint==0)
SetTextColor(pDC, RGB(255,74,102));
else if(pDoc->m_DataKLine[IDpoint].KOpenPrice>=pDoc->m_DataKLine[IDpoint-1].KOpenPrice)
SetTextColor(pDC, RGB(255,74,102));
else
SetTextColor(pDC, RGB(34,177,54));
pDC.TextOut(rect.left+3,rect.top+40,KO);
if(pDoc->m_DataKLine[IDpoint].KHighestPrice>=pDoc->m_DataKLine[IDpoint].KOpenPrice)
SetTextColor(pDC, RGB(255,74,102));
else
SetTextColor(pDC, RGB(34,177,54));
pDC.TextOut(rect.left+3,rect.top+100,KH);
if(pDoc->m_DataKLine[IDpoint].KLowestPrice>=pDoc->m_DataKLine[IDpoint].KOpenPrice)
SetTextColor(pDC, RGB(255,74,102));
else
SetTextColor(pDC, RGB(34,177,54));
pDC.TextOut(rect.left+3,rect.top+160,KL);
if(pDoc->m_DataKLine[IDpoint].KClosePrice>=pDoc->m_DataKLine[IDpoint].KOpenPrice)
SetTextColor(pDC, RGB(255,74,102));
else
SetTextColor(pDC, RGB(34,177,54));
pDC.TextOut(rect.left+3,rect.top+220,KC);
float MinusCO = pDoc->m_DataKLine[IDpoint].KClosePrice - pDoc->m_DataKLine[IDpoint].KOpenPrice;
MCO.Format("%.2f",MinusCO);
PCent.Format("%.2f%%",MinusCO/pDoc->m_DataKLine[IDpoint].KOpenPrice);
pDC.TextOut(rect.left+3,rect.top+240,MCO);
pDC.TextOut(rect.left+3,rect.top+260,PCent);
SetTextColor(pDC, RGB(255,242,0));
pDC.TextOut(rect.left+3,rect.top+320,"65");
pDC.TextOut(rect.left+3,rect.top+340,"8");
pDC.TextOut(rect.left+3,rect.top+400,"31891");
pDC.TextOut(rect.left+3,rect.top+420,"24");
pDC.TextOut(rect.left+3,rect.top+480,"3434.0");
}
int CKlineLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
Lv = this;
return 0;
}
void CKlineLeftView::RePaint(void)
{
CRect rect;
CClientDC pDC(Lv);
GetClientRect(&rect);
pDC.FillSolidRect(&rect,RGB(20,32,52));
CClientDoc* pDoc = (CClientDoc*)GetDocument();
SetTextColor(pDC, RGB(255,255,255));
SetBkMode(pDC, TRANSPARENT);
pDC.TextOut(rect.left+3,rect.top+20,"开盘价");
pDC.TextOut(rect.left+3,rect.top+80,"最高价");
pDC.TextOut(rect.left+3,rect.top+140,"最低价");
pDC.TextOut(rect.left+3,rect.top+200,"收盘价");
pDC.TextOut(rect.left+3,rect.top+300,"成交量");
pDC.TextOut(rect.left+3,rect.top+380,"持仓量");
pDC.TextOut(rect.left+3,rect.top+460,"结算");
}
KlineMiddleView.cpp
#include "StdAfx.h"
#include "Client.h"
#include "MainFrm.h"
#include <math.h>
#include "KlineMiddleView.h"
#include "KlineLeftView.h"
IMPLEMENT_DYNCREATE(CKlineMiddleView , CView)
int maxNum = 300;
int m_Wheel=100;
int px,py=0;
int XLine_x,XLine_y = 0;
int ScreenHeight,ScreenWidth;
float KWidth;
float maxh = 0;
float minh = 100000;
float newh = 0;
int WNumber = 100;
int WNS = 200;
int WNF = maxNum;
float Xplus=0;
float multiple=0;
float rebot=0;
int IDP=0;
int flag=1;
int LDx=0,LDy=0;
bool LBDW=false;
CString XlineR;
CString XlineB;
int second=0;
CKlineMiddleView::CKlineMiddleView(void){}
CKlineMiddleView::~CKlineMiddleView(void){}
void CKlineMiddleView::OnDraw(CDC*)
{
this->KlineDraw();
SetFocus();
}
BEGIN_MESSAGE_MAP(CKlineMiddleView, CView)
ON_WM_MOUSEWHEEL()
ON_WM_LBUTTONDOWN()
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
int CKlineMiddleView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDoc* pDoc = (CClientDoc*)GetDocument();
int Num=1000;
pDoc->m_DataKLine=new KLINEDATA[Num];
for(int i=0;i<Num;i++)
{
pDoc->m_DataKLine[i].KOpenPrice = (float)(sin((double)i*0.05)+2)*150 + rand()%300 - 100;
pDoc->m_DataKLine[i].KClosePrice = (float)(sin((double)i*0.05)+2)*150 + rand()%300 - 100;
pDoc->m_DataKLine[i].KHighestPrice = max(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice)*(1+(float)(rand()%20)/100);
pDoc->m_DataKLine[i].KLowestPrice = min(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice)*(1-(float)(rand()%20)/100);
}
for(int i=0;i<50;i++)
{
int xWhite = rand()%Num;
pDoc->m_DataKLine[xWhite].KClosePrice = pDoc->m_DataKLine[xWhite].KOpenPrice;
pDoc->m_DataKLine[xWhite].KHighestPrice = max(pDoc->m_DataKLine[xWhite].KOpenPrice,pDoc->m_DataKLine[xWhite].KClosePrice)*(1+(float)(rand()%20)/100);
pDoc->m_DataKLine[xWhite].KLowestPrice = min(pDoc->m_DataKLine[xWhite].KOpenPrice,pDoc->m_DataKLine[xWhite].KClosePrice)*(1-(float)(rand()%20)/100);
}
SetTimer(1,1000,NULL);
SetTimer(2,1500,NULL);
SetTimer(3,9000,NULL);
return 0;
}
BOOL CKlineMiddleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
CRect rect;
GetClientRect(&rect);
m_Wheel -= (int)(zDelta* 0.1);
if(m_Wheel >= (maxNum+50)) m_Wheel= maxNum+50;
else if(m_Wheel <=65) m_Wheel=65;
else
{
CPoint p;
GetCursorPos(&p);
WNS +=(int)( (float)WNumber/2 -(float)(m_Wheel-50)/2);
WNF = WNS + m_Wheel - 50;
if((WNS>=0)&&(WNF<=maxNum))
this -> KlineDraw ();
if(flag%2==0)
this->XlinePaint();
}
return CView::OnMouseWheel(nFlags, zDelta, pt);
}
void CKlineMiddleView::OnLButtonDown(UINT nFlags, CPoint point)
{
LBDW=true;
LDx=point.x;
LDy=point.y;
CView::OnLButtonDown(nFlags, point);
}
void CKlineMiddleView::OnLButtonUp(UINT nFlags, CPoint point)
{
LBDW=false;
if(LDx<(point.x+10)&&LDx>(point.x-10)&&LDy>(point.y-10)&&LDy<(point.y+10))
{
flag++;
if(flag%2==0)
this->XlinePaint();
else if(flag > 2)
{
this->XlineDel();
}
}
Xplus=0;
CView::OnLButtonUp(nFlags, point);
}
void CKlineMiddleView::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rect;
GetClientRect(&rect);
int IDpoint = WNS + (px-rect.left)*WNumber/(float)(rect.Width() - 60);
if((IDpoint<maxNum)&&(IDpoint>0))
{
if(IDP!=IDpoint)
{
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CKlineLeftView* pView = (CKlineLeftView*)pMainFrame->GetActiveView();
pView->Updata(IDpoint);
IDP=IDpoint;
}
}
if(flag%2==0)
this->XlineDel();
if((LBDW==true)&&(flag%2))
{
if(px < point.x)
{
Xplus += (point.x-px)*0.5/KWidth;
if( (WNS > 0 )&&(Xplus>=1))
{
WNS -=Xplus;
WNF -=Xplus;
this->KlineDraw();
Xplus=0;
}
}
if(px > point.x)
{
Xplus += (px-point.x)*1/KWidth;
if((WNF < maxNum)&&(Xplus>=1))
{
WNS +=Xplus;
WNF +=Xplus;
this->KlineDraw();
Xplus=0;
}
}
}
px = point.x ;
py = point.y ;
float XRValue=minh;
for(XRValue=minh;XRValue< maxh;XRValue++)
{
if((int)(rebot- (XRValue-minh)*multiple)==(py-rect.top))
XlineR.Format("%.2f",XRValue);
}
SYSTEMTIME st;
GetLocalTime(&st);
XlineB.Format("%4d/%2d/%2d %2d:%2d:%2d %2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wDayOfWeek);
if(flag%2==0)
this->XlinePaint();
CView::OnMouseMove(nFlags, point);
}
void CKlineMiddleView::KlineDraw()
{
CDC* pDC;
CRect rect;
CDC MemDC;
CBitmap MemBitmap;
CPen PenBlue(PS_SOLID,1,RGB(39,176,216));
CPen PenRed(PS_SOLID,1,RGB(255,74,102));
CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
CPen PenRedPoint(PS_DOT, 1, RGB(255,74,102));
pDC = GetWindowDC();
GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(0,0,0));
ScreenHeight = rect.Height();
ScreenWidth = rect.Width();
CClientDoc* pDoc = (CClientDoc*)GetDocument();
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,ScreenWidth,ScreenHeight);
MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,ScreenWidth,ScreenHeight,RGB(0,0,0));
if( WNS < 0) WNS = 0 ;
if( WNF > maxNum ) WNF = maxNum ;
WNumber=WNF-WNS;
KWidth = (float)(ScreenWidth - 60)/WNumber;
maxh = 0;
minh = 100000;
newh = 0;
for(int i = WNS ; i < WNF ; i++)
{
if( maxh < pDoc->m_DataKLine[i].KHighestPrice)
maxh = pDoc->m_DataKLine[i].KHighestPrice;
if( minh > pDoc->m_DataKLine[i].KLowestPrice)
minh = pDoc->m_DataKLine[i].KLowestPrice;
newh = maxh - minh;
}
rebot = ScreenHeight - 30;
multiple = (float)(rebot-10)/newh;
MemDC.SelectObject(&PenRedPoint);
MemDC.MoveTo( 0 , rebot- (100.00-minh)*multiple);
MemDC.LineTo( rect.Width(), rebot-(100.00-minh)*multiple);
MemDC.MoveTo( 0 , rebot- (600.00-minh)*multiple);
MemDC.LineTo( rect.Width(), rebot-(600.00-minh)*multiple);
for(int i = WNS ; i < WNF ; i++)
{
int khigh = pDoc->m_DataKLine[i].KHighestPrice;
int klow = pDoc->m_DataKLine[i].KLowestPrice;
int kopen = pDoc->m_DataKLine[i].KOpenPrice;
int kclose = pDoc->m_DataKLine[i].KClosePrice;
float maxOC = max(kopen,kclose);
float minOC = min(kopen,kclose);
float mainHigh = maxOC - minOC;
int xleftTop = KWidth*(i-WNS);
float yleftTop = rebot- (maxOC-minh)*multiple;
int xWidth = KWidth*0.9;
double yHeight = (double)mainHigh*multiple;
if(pDoc->m_DataKLine[i].KOpenPrice > pDoc->m_DataKLine[i].KClosePrice)
{
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(39,176,216));
MemDC.SelectObject(&PenBlue);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , rebot - (klow-minh)*multiple);
}
else if(pDoc->m_DataKLine[i].KOpenPrice < pDoc->m_DataKLine[i].KClosePrice)
{
MemDC.SelectObject(&PenRed);
MemDC.MoveTo(xleftTop,yleftTop);
MemDC.LineTo(xleftTop+xWidth, yleftTop);
MemDC.LineTo(xleftTop+xWidth, yleftTop+yHeight);
MemDC.LineTo(xleftTop, yleftTop+yHeight);
MemDC.LineTo(xleftTop, yleftTop);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , yleftTop);
MemDC.MoveTo( xleftTop + xWidth/2 , yleftTop+yHeight);
MemDC.LineTo( xleftTop + xWidth/2 , rebot- (klow-minh)*multiple);
}
else
{
int yleftTop = rebot - (maxOC-minh)*multiple;
int yHeight = 1;
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(255,255,255));
MemDC.SelectObject(&PenWhite);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , rebot - (klow-minh)*multiple);
}
}
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
void CKlineMiddleView::XlinePaint(void)
{
CDC* pDC;
CRect rect;
pDC = GetWindowDC();
GetClientRect(&rect);
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if (rect.PtInRect(pt))
{
pDC->FillSolidRect(rect.right-52,py-16,52,17, RGB(0,0,0));
pDC->FillSolidRect(px,rect.bottom-16,202,17, RGB(0,0,0));
}
CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
pDC->SelectObject(&PenWhite);
pDC->SetROP2(R2_NOT);
pDC->MoveTo(0,py);
pDC->LineTo(rect.right,py);
pDC->MoveTo(px,0);
pDC->LineTo(px,rect.bottom);
pDC->MoveTo(rect.right-50,py);
pDC->LineTo(rect.right-50,py-15);
pDC->LineTo(rect.right,py-15);
pDC->LineTo(rect.right,py);
pDC->MoveTo(px,rect.bottom-15);
pDC->LineTo(px+200,rect.bottom-15);
pDC->LineTo(px+200,rect.bottom);
SetTextColor(*pDC, RGB(255,255,255));
SetBkMode(*pDC, TRANSPARENT);
pDC->TextOut(rect.right-45,py-15,XlineR);
pDC->TextOut(px+10,rect.bottom-15,XlineB);
XLine_x=px;
XLine_y=py;
}
void CKlineMiddleView::XlineDel(void)
{
CDC* pDC;
CRect rect;
pDC = GetWindowDC();
GetClientRect(&rect);
CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
pDC->SelectObject(&PenWhite);
pDC->SetROP2(R2_NOT);
pDC->MoveTo(0,py);
pDC->LineTo(rect.right,py);
pDC->MoveTo(px,0);
pDC->LineTo(px,rect.bottom);
pDC->FillSolidRect(rect.right-52,XLine_y-16,52,17, RGB(0,0,0));
pDC->FillSolidRect(XLine_x-1,rect.bottom-16,202,17, RGB(0,0,0));
}
BOOL CKlineMiddleView::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
CRect rect;
GetClientRect(&rect);
rect.DeflateRect(50,50,100,50);
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if (!rect.PtInRect(pt))
LBDW=false;
}
return CView::PreTranslateMessage(pMsg);
}
void CKlineMiddleView::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
{
CRect rect;
CClientDC pDC(this);
GetClientRect(&rect);
pDC.FillSolidRect(rect.right-32,rect.bottom-32,20,20, RGB(0,0,0));
SetTextColor(pDC, RGB(255,255,255));
SetBkMode(pDC, TRANSPARENT);
CString Se;
if(second==59) second=1;
else second++;
Se.Format("%d",second);
pDC.TextOut(rect.right-30,rect.bottom-30,Se);
break;
}
case 2:
{
CDC* pDC;
pDC = GetWindowDC();
CClientDoc* pDoc = (CClientDoc*)GetDocument();
if(WNF==maxNum)
{
int i=WNF-1;
pDoc->m_DataKLine[i].KClosePrice = (float)(sin((double)i*0.05)+2)*150 + rand()%300 - 100;
pDoc->m_DataKLine[i].KHighestPrice = max(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice)*(1+(float)(rand()%20)/100);
pDoc->m_DataKLine[i].KLowestPrice = min(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice)*(1-(float)(rand()%20)/100);
bool ONE_ALL=false;
for(int i = WNS ; i < WNF ; i++)
{
if( maxh < pDoc->m_DataKLine[i].KHighestPrice)
ONE_ALL=true;
if( minh > pDoc->m_DataKLine[i].KLowestPrice)
ONE_ALL=true;
}
if( ONE_ALL)
this->KlineDraw();
else this->Kline_One();
}
break;
}
case 3:
{
if(WNF==maxNum)
{
if(maxNum<1000) maxNum++;
WNS++;
WNF++;
this->KlineDraw();
}
else
{
if(maxNum<1000) maxNum++;
}
break;
}
}
CView::OnTimer(nIDEvent);
}
void CKlineMiddleView::Kline_One(void)
{
CDC* pDC;
CRect rect;
CDC MemDC;
CBitmap MemBitmap;
BITMAP bm;
CPen PenBlue(PS_SOLID,1,RGB(39,176,216));
CPen PenRed(PS_SOLID,1,RGB(255,74,102));
CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
CPen PenRedPoint(PS_DOT, 1, RGB(255,74,102));
pDC = GetWindowDC();
GetClientRect(&rect);
ScreenHeight = rect.Height();
ScreenWidth = rect.Width();
CClientDoc* pDoc = (CClientDoc*)GetDocument();
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,ScreenWidth,ScreenHeight);
MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,ScreenWidth,ScreenHeight,RGB(0,0,0));
if( WNS < 0) WNS = 0 ;
if( WNF > maxNum ) WNF = maxNum ;
WNumber=WNF-WNS;
KWidth = (float)(ScreenWidth - 60)/WNumber;
maxh = 0;
minh = 100000;
newh = 0;
for(int i = WNS ; i < WNF ; i++)
{
if( maxh < pDoc->m_DataKLine[i].KHighestPrice)
maxh = pDoc->m_DataKLine[i].KHighestPrice;
if( minh > pDoc->m_DataKLine[i].KLowestPrice)
minh = pDoc->m_DataKLine[i].KLowestPrice;
newh = maxh - minh;
}
rebot = ScreenHeight - 30;
multiple = (float)(rebot-10)/newh;
int i = WNF-1;
int khigh = pDoc->m_DataKLine[i].KHighestPrice;
int klow = pDoc->m_DataKLine[i].KLowestPrice;
int kopen = pDoc->m_DataKLine[i].KOpenPrice;
int kclose = pDoc->m_DataKLine[i].KClosePrice;
float maxOC = max(kopen,kclose);
float minOC = min(kopen,kclose);
float mainHigh = maxOC - minOC;
int xleftTop = KWidth*(i-WNS);
float yleftTop = rebot- (maxOC-minh)*multiple;
int xWidth = KWidth*0.9;
double yHeight = (double)mainHigh*multiple;
if(pDoc->m_DataKLine[i].KOpenPrice > pDoc->m_DataKLine[i].KClosePrice)
{
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(39,176,216));
MemDC.SelectObject(&PenBlue);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , rebot - (klow-minh)*multiple);
}
else if(pDoc->m_DataKLine[i].KOpenPrice < pDoc->m_DataKLine[i].KClosePrice)
{
MemDC.SelectObject(&PenRed);
MemDC.MoveTo(xleftTop,yleftTop);
MemDC.LineTo(xleftTop+xWidth, yleftTop);
MemDC.LineTo(xleftTop+xWidth, yleftTop+yHeight);
MemDC.LineTo(xleftTop, yleftTop+yHeight);
MemDC.LineTo(xleftTop, yleftTop);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , yleftTop);
MemDC.MoveTo( xleftTop + xWidth/2 , yleftTop+yHeight);
MemDC.LineTo( xleftTop + xWidth/2 , rebot- (klow-minh)*multiple);
}
else
{
int yleftTop = rebot - (maxOC-minh)*multiple;
int yHeight = 1;
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(255,255,255));
MemDC.SelectObject(&PenWhite);
MemDC.MoveTo( xleftTop + xWidth/2 , rebot - (khigh-minh)*multiple);
MemDC.LineTo( xleftTop + xWidth/2 , rebot - (klow-minh)*multiple);
}
MemBitmap.GetBitmap(&bm);
pDC->StretchBlt(KWidth*(i-WNS),0, KWidth, rect.Height(),
&MemDC, KWidth*(i-WNS), 0, KWidth, rect.Height(), SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}