MFC_9.28_左边和刷新最新框

KlineView.cpp

  • 更改左右框的宽度

// KlineView.cpp : CKLineView 类的实现
//

#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


// CKLineView

IMPLEMENT_DYNCREATE(CKLineView, CView)

BEGIN_MESSAGE_MAP(CKLineView, CView)
    ON_WM_CREATE()
    ON_WM_SIZE()
END_MESSAGE_MAP()

// CKLineView 构造/析构

CKLineView::CKLineView()
{
    // TODO: 在此处添加构造代码

}

CKLineView::~CKLineView()
{
}

BOOL CKLineView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: 在此处通过修改
    //  CREATESTRUCT cs 来修改窗口类或样式

    return CView::PreCreateWindow(cs);
}

// CKLineView 绘制

void CKLineView::OnDraw(CDC* /*pDC*/)
{
    CClientDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
}


// CKLineView 诊断

#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 //_DEBUG


// CKLineView 消息处理程序

int CKLineView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此添加您专用的创建代码
    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;    //must >=4 ,拖动splitter时拖动条的宽度
    m_cySplitter = 0;    
    m_cxBorderShare = 0;   //按下鼠标时splitter拖动条的偏移量
    m_cyBorderShare = 0;  
    m_cxSplitterGap= 1;     //改成了一
    m_cySplitterGap= 1;     //splitter拖动条的宽度

}

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)
{       
    //跳过调用CSplitterWnd::OnMouseMove,因为他会引起光标的改变
    CWnd::OnMouseMove(nFlags, point);
}

BOOL CMySplitter::PreCreateWindow(CREATESTRUCT& cs)
{ 
       return CSplitterWnd::PreCreateWindow(cs);
}
void CMySplitter::OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rect)
{
    // TODO: 在此添加专用代码和/或调用基类
    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"

// KlineLeftView.cpp : 实现文件
//
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()


// CKlineLeftView 诊断

#ifdef _DEBUG
void CKlineLeftView::AssertValid() const
{
	CFormView::AssertValid();
}

#ifndef _WIN32_WCE
void CKlineLeftView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif
#endif //_DEBUG


// CKlineLeftView 消息处理程序

void CKlineLeftView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();

    // TODO: 在此添加专用代码和/或调用基类
}

void CKlineLeftView::OnDraw(CDC* pDC)
{
    // TODO: 在此添加专用代码和/或调用基类
    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);

	// TODO: 在此处添加消息处理程序代码
}

void CKlineLeftView::Updata(int IDpoint)
{
	//CDC* pDC;
	CRect rect;
	CClientDC pDC(Lv);
	//pDC = GetWindowDC();
	GetClientRect(&rect);
	pDC.FillSolidRect(&rect,RGB(20,32,52));//刷新整个左框

	CClientDoc* pDoc = (CClientDoc*)GetDocument(); //载入数据的结构体

	SetTextColor(pDC, RGB(255,255,255));
	//SetTextColor(pDC, RGB(43,277,54));

    SetBkMode(pDC, TRANSPARENT);
	//两行数字间隔加20,两个块之间加40
	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");

	//pDC->TextOut(0,15,pDoc->m_DataKLine[IDpoint].KLowestPrice); 
	//pDoc->m_DataKLine[IDpoint]
}

int CKlineLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	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*)
{
	// TODO: 在此添加专用代码和/或调用基类
	this->KlineDraw();
	SetFocus();
}

// KlineLeftView.cpp : 实现文件

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)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认
	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
	{
		//WNumber = m_Wheel - 50 ;
		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)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	LBDW=true;
	//CPoint p;
    //GetCursorPos(&p);
	LDx=point.x;
	LDy=point.y;
	
	CView::OnLButtonDown(nFlags, point);
}


void CKlineMiddleView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	LBDW=false;
	//CPoint p;
    //GetCursorPos(&p);
	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();//删除作用
			//以下用于十字线取消左端数据取消,没必要就不加了
			//CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
			//CKlineLeftView* pView = (CKlineLeftView*)pMainFrame->GetActiveView();
			//pView->RePaint();
		}
	}
	Xplus=0;

	CView::OnLButtonUp(nFlags, point);
}


void CKlineMiddleView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect rect;
	GetClientRect(&rect);
	//CClientDoc* pDoc = (CClientDoc*)GetDocument(); //载入数据的结构体

	//left显示数据
	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 ;

	/*
	rebot = ScreenHeight - 30;       //30是下方空出的高度
	multiple = (float)(rebot-10)/newh;  //10是上方空出的高度

	MemDC.SelectObject(&PenRedPoint);
	MemDC.MoveTo( 0 , rebot- (1000-minh)*multiple);
    float yleftTop = rebot- (maxOC-minh)*multiple;//i对应的open和close最大值减去屏幕最低值

	*/
	//ScreenToClient(&point);
	//int XR_F=(rebot-point.y-rect.top)/multiple + minh;
	//XlineR.Format("%d",(rect.bottom-point.y)/multiple + minh);
	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;//定义一个位图对象 
	//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);
	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); 
	//CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); 
	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;

	//float KWidth = (float)(ScreenWidth - 60)/WNumber;
	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;       //30是下方空出的高度
	multiple = (float)(rebot-10)/newh;  //10是上方空出的高度

	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);

		//缩减代码,提前计算FillSolidRect的前四个参数
		float mainHigh = maxOC - minOC;

		int xleftTop = KWidth*(i-WNS);
		float yleftTop = rebot- (maxOC-minh)*multiple;//i对应的open和close最大值减去屏幕最低值
		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);
			
			//MemDC.FillSolidRect(xleftTop+1,yleftTop+1,xWidth-2,yHeight-2,RGB(0,0,0));
		}
		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->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.Detach();
	//MemDC.Detach();

	MemBitmap.DeleteObject(); 
    MemDC.DeleteDC();         //清除上一次位图

	//ReleaseDC(&MemDC);
	//pDC->DeleteDC();
	//ReleaseDC(pDC);

}

void CKlineMiddleView::XlinePaint(void)
{
	CDC* pDC;
	CRect rect;
	pDC = GetWindowDC();
	GetClientRect(&rect);

	//刷新右边和底部的黑条
	//pDC->FillSolidRect(rect.right-50,rect.top,50,rect.Height(), RGB(0,0,0));
	//pDC->FillSolidRect(0,rect.bottom-15,rect.right,15, RGB(0,0,0));
	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-50,rect.top,50,rect.Height(), RGB(0,0,0));
	//pDC->FillSolidRect(0,rect.bottom-15,rect.right,15, RGB(0,0,0));
	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));
	//pDC->DeleteDC();
	//ReleaseDC(pDC);

}



BOOL CKlineMiddleView::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	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;  		//不在rect区域内

		//if(pt.x<50) LBDW=false;
	}

	return CView::PreTranslateMessage(pMsg);
}

void CKlineMiddleView::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	

	switch (nIDEvent)   
	{  
	case 1:   //定时器1,显示右下角倒计时
		{
			//MessageBox("aaa");
			//CDC* pDC;
			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:   //定时器2,实时更新最后一个K方块的数据
		{
			CDC* pDC;
			pDC = GetWindowDC();
			CClientDoc* pDoc = (CClientDoc*)GetDocument(); //载入数据的结构体
			if(WNF==maxNum)
			{
				int i=WNF-1;
				//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);

				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;
					//newh = maxh - minh;
				}
				if( ONE_ALL)
					this->KlineDraw();
				else this->Kline_One();

			}

			break;
		}

	case 3:   //定时器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); 
	//CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); 
	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;

	//float KWidth = (float)(ScreenWidth - 60)/WNumber;
	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;       //30是下方空出的高度
	multiple = (float)(rebot-10)/newh;  //10是上方空出的高度
	/*//未解决跳线的问题
	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);
*/

	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);
	//缩减代码,提前计算FillSolidRect的前四个参数
	float mainHigh = maxOC - minOC;
	int xleftTop = KWidth*(i-WNS);
	float yleftTop = rebot- (maxOC-minh)*multiple;//i对应的open和close最大值减去屏幕最低值
	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();         //清除上一次位图

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值