Visual Studio MFC c++代码块折叠(Code Folding / Outlining)

Published

 Visual Studio MFC/Win32 项目中,可以利用 代码块折叠(Code Folding / Outlining) 来管理长函数或区域,让代码更清晰。

使用 #pragma region / #pragma endregion

这是 Visual Studio 官方支持的 代码折叠指令,兼容 MFC/C++ 项目:

#pragma region  custom extend by stockso.com叠加指数分时线
void CHistoryRealTime::DrawPriceVolume2(CDC* pDC)
{
	DECLARE_COLOR_DEFINATION

	//获取当前股票的最大、最小值
	double	dMin = 0, dMax = 0, dMaxVolume = 0;
	double	dLastClose = m_CurStock.GetStockInfo().m_fLast;
	if (!GetMinMaxInfo(&dLastClose, &dMin, &dMax, &dMaxVolume, TRUE))//画分时线,获取昨天收盘价,当天最低价、最高价、最大量
		return;

	//从股票中获取选择的日K线日期
	DWORD date = 0;
	date = m_CurStock.GetStockInfo().m_dateHistoryReport;


	//读取指数数据
	CStockInfo	info;
	AfxGetStockContainer().GetStockInfo("399001", &info);

	CStock		m_CurStock2;

	//设置选择的日期,会读出历史分笔数据
	info.m_dateHistoryReport = date;
	m_CurStock2.SetStockInfo(&info);

	// Prepare Data
	// 读取本地文件
	m_CurStock2.SetDatabase(&AfxGetDB());

	//修改指数昨日收盘价

	m_CurStock2.PrepareData(CStock::dataK, CKData::ktypeDay, TRUE);
	CKData& kdata = m_CurStock2.GetKData(CKData::ktypeDay);

	//根据日期获取索引号
	int nIndexCurrent = kdata.GetIndexByDate(date);

	//取前一日索引
	nIndexCurrent -= 1;

	if (nIndexCurrent < 0)
		nIndexCurrent = 0;

	KDATA	kd;
	memset(&kd, 0, sizeof(kd));

	//根据索引获取日K线数据,再获取收盘价
	kd.m_fClose = kdata.ElementAt(nIndexCurrent).m_fClose;

	info.m_fLast = kd.m_fClose;

	//设置这只股票的昨日收盘价信息
	m_CurStock2.SetStockInfo(&info);


	// 从磁盘读取指数的历史分笔数据
	m_CurStock2.PrepareData(CStock::dataReport, CKData::ktypeDay, TRUE);
	m_CurStock2.PrepareData(CStock::dataMinute, CKData::ktypeDay, TRUE);


	// Draw Price 
	//CStockInfo& info = m_CurStock2.GetStockInfo();
	CMinute& aMinute = m_CurStock2.GetMinute();

	//----start开始计算指数的最大、最小值 GetMinMaxInfo----	
	double	dMinDJ2 = 0, dMaxDJ2 = 0;
	double	dLastCloseDJ2 = 0;

	dLastCloseDJ2 = m_CurStock2.GetStockInfo().m_fLast;//指数昨日收盘价

	dMinDJ2 = dLastCloseDJ2, dMaxDJ2 = dLastCloseDJ2;//天的指数最低价,当天的指数最高价初始化为指数昨日收盘价

	BOOL	bPriceOKDJ2 = FALSE;
	REPORT	reportDJ2;

	//初始化
	if (m_CurStock2.GetReport().GetSize() > 0)
	{
		reportDJ2 = m_CurStock2.GetReport().ElementAt(m_CurStock2.GetReport().GetSize() - 1);
		if (reportDJ2.m_fNew > 1e-4 && reportDJ2.m_fHigh > 1e-4 && reportDJ2.m_fLow > 1e-4)
		{
			dMinDJ2 = reportDJ2.m_fLow; //当天的指数最低价
			dMaxDJ2 = reportDJ2.m_fHigh;//当天的指数最高价
			bPriceOKDJ2 = TRUE;
		}
	}

	//计算指数分钟线最大值、最小值
	for (int i = 0; i < m_CurStock2.GetMinute().GetSize(); i++)
	{
		MINUTE& m = m_CurStock2.GetMinute().ElementAt(i);
		if (!bPriceOKDJ2 && dMin < 1e-4)
			dMinDJ2 = m.m_fNew;

		if (!bPriceOKDJ2 && m.m_fNew < dMinDJ2)
			dMinDJ2 = m.m_fNew;
		if (!bPriceOKDJ2 && m.m_fNew > dMaxDJ2)
			dMaxDJ2 = m.m_fNew;


	}

	//以昨日收盘价为基准,选幅度最大的那个方向的绝对值
	double dABS = 1.00 * max(fabs(dMaxDJ2 - dLastCloseDJ2), fabs(dMinDJ2 - dLastCloseDJ2));
	if (dABS < dLastCloseDJ2 * 0.001)
		dABS = dLastCloseDJ2 * 0.001;

	dMinDJ2 = dLastCloseDJ2 - dABS;
	dMaxDJ2 = dLastCloseDJ2 + dABS;

	//计算指数最大涨幅(绝对值)
	double  indexMaxDiffPercentDJ2 = (dMaxDJ2 - m_CurStock2.GetStockInfo().m_fLast) / m_CurStock2.GetStockInfo().m_fLast;

	//计算股票最大涨幅(绝对值)
	double  m_curentStockMaxDiffPercent = (dMax - m_CurStock.GetStockInfo().m_fLast) / m_CurStock.GetStockInfo().m_fLast;

	//放大百分比例
	double ratio = 1;

	if (indexMaxDiffPercentDJ2 > m_curentStockMaxDiffPercent)
	{
		ratio = m_curentStockMaxDiffPercent / indexMaxDiffPercentDJ2;
	}


	//----end 开始计算指数的最大、最小值----

	//开始画图
	DWORD	secNow = CSPTime::GetCurrentTime().ToStockTimeSecOrder();//获取当前时间
	DWORD	secStep = 60;

	//x Axis
	int	ptr = 0;
	int	xPos = m_rectPrice.left;

	int	yPosMid = m_rectPrice.top + m_rectPrice.Height() / 2;
	int yPos = yPosMid;

	int	yPosLast = yPos; //y 指向中间线
	//画线颜色
	COLORREF	clrLine5 = AfxGetProfile().GetColor(CColorClass::clrCW);

	DWORD	dwSeconds = CSPTime::GetTradeSecondsOfOneDay();
	//以60秒为步进,开始画指数分时线
	for (DWORD sec = 0; sec <= dwSeconds; sec += secStep)
	{
		BOOL bDrawed = FALSE;
		for (; ptr < aMinute.GetSize(); ptr++)  //指数分钟线
		{
			DWORD secTemp = CSPTime(aMinute[ptr].m_time).ToStockTimeSecOrder();
			//如果如果当前分钟线>显示的时间
			if (secTemp > sec)
				break;
			if ((long)secTemp <= (long)sec - (long)secStep)
				continue;
			if (aMinute[ptr].m_fNew < 1e-4)
				aMinute[ptr].m_fNew = m_CurStock2.GetStockInfo().m_fLast;//昨日收盘价

			int	xPosNew = m_rectPrice.left + m_rectPrice.Width() * secTemp / dwSeconds;
			yPosLast = yPos;

			// Draw Price Line
			CPen	pen1(PS_SOLID, 1, clrLine5);
			CPen* pOldPen = pDC->SelectObject(&pen1);
			pDC->MoveTo(xPos, yPos);

			//根据价格算Y抽
			double	dPriceNew = aMinute[ptr].m_fNew;
			//计算指数涨幅
			double  indexDiffPercent = (dPriceNew - m_CurStock2.GetStockInfo().m_fLast) / m_CurStock2.GetStockInfo().m_fLast;

			//换算成股票价格
			//dPriceNew = m_CurStock.GetStockInfo().m_fLast * (1 + indexDiffPercent)* ratio; // 放大百分比
			dPriceNew = m_CurStock.GetStockInfo().m_fLast * (1 + indexDiffPercent);

			//指数换算成股票价格后在股票最高价和最低价范围内,则画图
			if (dPriceNew <= dMax && dPriceNew >= dMin && dMax - dMin > 1e-4)
			{
				yPos = (int)(m_rectPrice.top + m_rectPrice.Height() * (dMax - dPriceNew) / (dMax - dMin));
				if (yPos <= m_rectPrice.top)		yPos = m_rectPrice.top + 1;
				if (yPos >= m_rectPrice.bottom)	yPos = m_rectPrice.bottom - 1;
				pDC->LineTo(xPosNew, yPos);
			}

			pDC->SelectObject(pOldPen);
			xPos = xPosNew;
			bDrawed = TRUE;
		}


	}




}

#pragma endregion

 

 

 

/////////////////////////////////////////////////////////////////////////////
//      函 数 名: 
//      功能说明:分时图画窗口顶部的时间 价格 成交量等信息 by freeman
//      入口参数:无入口数
//      出口参数:无出口数
//      返回参数:无返回数
////////////////////////////////////////////////////////////////////////////