MFC_9.25_k线上下固定

本文介绍了一种使用C++实现K线图表绘制的方法,通过全局变量和函数如OnMouseWheel()和KlineDraw()实现图表的动态更新和鼠标滚轮缩放功能。详细讲解了如何根据K线数据动态调整图表显示范围和比例,以及如何通过鼠标滚轮改变显示的K线数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局变量

CDC* pDC;
CRect rect;
CDC MemDC; //首先定义一个显示设备对象 
CBitmap MemBitmap;//定义一个位图对象 
BITMAP bm;
int m_Wheel=100;
int px,py,pxf,pxy = 0;
int ScreenHeight,ScreenWidth;

int WNumber = 50;
int WNS = 0; //下张图和上张图开始的位置;


OnMouseWheel()

BOOL CKlineMiddleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认
	m_Wheel -= zDelta* 0.01;
	//if( zDelta > 0 ) m_Wheel -= 1;
	//else m_Wheel += 5;
	if(m_Wheel >= 150) m_Wheel= 150;   //方块数量多
	else if(m_Wheel <=65) m_Wheel=65;   //数量少
	else
	{
		WNumber = m_Wheel - 50 ;
		this -> KlineDraw ();
	}
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}

KlineDraw()

void CKlineMiddleView::KlineDraw()
{
	pDC = GetWindowDC();
    pDC->GetClipBox(&rect);
	GetClientRect(&rect);
	pDC->FillSolidRect(rect, RGB(0,0,0));    //设背景为黑色
	ScreenHeight = rect.Height()-20;
	ScreenWidth = rect.Width();
	CClientDoc* pDoc = (CClientDoc*)GetDocument(); //载入数据的结构体

	//建立一个与屏幕显示兼容的位图
	MemBitmap.DeleteObject(); 
    MemDC.DeleteDC();         //清除上一次位图
	MemDC.CreateCompatibleDC(NULL); 
	MemBitmap.CreateCompatibleBitmap(pDC,ScreenWidth,ScreenHeight); 
	CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); 
	MemDC.FillSolidRect(0,0,ScreenWidth,ScreenHeight,RGB(0,0,0)); 

	WNS = 150 - m_Wheel ;
	if( WNS < 0)
		WNS = 0 ;

	float KWidth = (float)(ScreenWidth - 30)/WNumber;

	int maxh = 0;
	int minh = 100000;
	int newh = 0;
	for(int i = WNS ; i < 100 ; 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;
	}

	for(int i = WNS ; i < 100 ; 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;

		//取出开盘价收盘价中的高低值
		int maxOC = max(kopen,kclose); 
		int minOC = min(kopen,kclose);

		//缩减代码,提前计算FillSolidRect的前四个参数
		int mainHigh = maxOC - minOC;
		float multiple = (float)ScreenHeight/newh;   //每个放缩的倍数

		int xleftTop = KWidth*(i-WNS);
		float yleftTop = rect.bottom-10 - (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));
			CPen PenBlue(PS_SOLID,1,RGB(39,176,216));
			CPen *oldPenx = MemDC.SelectObject(&PenBlue);
			MemDC.MoveTo( xleftTop + xWidth/2 , rect.bottom-10 - (khigh-minh)*multiple);
		    MemDC.LineTo( xleftTop + xWidth/2 , rect.bottom-10 - (klow-minh)*multiple);

		}
		else if(pDoc->m_DataKLine[i].KOpenPrice < pDoc->m_DataKLine[i].KClosePrice)
		{
			CBrush br;
			CPen pen;
			pen.CreatePen(PS_SOLID,1,RGB(255,74,102));
			br.CreateStockObject(NULL_BRUSH);
			MemDC.SelectObject(&pen);
			MemDC.SelectObject(&br);
			MemDC.Rectangle(xleftTop,yleftTop,xleftTop+xWidth,yleftTop+yHeight);
           
            CPen PenRed(PS_SOLID,1,RGB(255,74,102));
			CPen *oldPenx = MemDC.SelectObject(&PenRed);

			MemDC.MoveTo( xleftTop + xWidth/2 , rect.bottom-10 - (khigh-minh)*multiple);
		    MemDC.LineTo( xleftTop + xWidth/2 , yleftTop);
			MemDC.MoveTo( xleftTop + xWidth/2 , yleftTop+yHeight);
		    MemDC.LineTo( xleftTop + xWidth/2 , rect.bottom-10 - (klow-minh)*multiple);

		}
		else
		{
			int yleftTop = rect.bottom-10 - (maxOC-minh)*multiple;
			int yHeight = 1;
			MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(255,255,255));
			CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
			CPen *oldPenx = MemDC.SelectObject(&PenWhite);
			MemDC.MoveTo( xleftTop + xWidth/2 , rect.bottom-10 - (khigh-minh)*multiple);
		    MemDC.LineTo( xleftTop + xWidth/2 , rect.bottom-10 - (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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值