亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? realtime.cpp

?? 股票軟件
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
// RealTime.cpp : implementation of the CRealTime class
//

#include "stdafx.h"
#include "RealTime.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


#define TOOLBARHIGHT 20

BOOL bShowReport = FALSE;


#define	RT_DETERMINE_COLOR(x,y)	((x)-(y)>1e-4?clrRise:((x)-(y)<1e-4?clrFall:clrPlane))

void DrawPriceAxisNumber(CDC * pDC, COLORREF clr, int nCount,
					int xStart, int yStart, int xEnd, int yEnd,
					double dLastClose, double fMin, double fMax, int nDotCount )
{
	int	nHeight	= yEnd - yStart;
	if( nHeight <= 0 )
		return;
	if( nCount <= 0 )
		return;
	ASSERT( nDotCount >= 0 );

	CString	strFmt;
	strFmt.Format( "%%.%df", nDotCount );

	pDC->SetTextColor( clr );
	CString	strText;
	CSize	sizeText;
	
	for( int k=0; k<=nCount; k++ )
	{
		double	dCur	= fMin+k*(fMax-fMin)/nCount;
		if( dCur < 0 && dCur > (0-0.6*pow((double)10,0-nDotCount)) )
			dCur	= 0;
		strText.Format( strFmt, dCur );
		sizeText	= pDC->GetTextExtent( strText );
		pDC->TextOut( xStart-sizeText.cx-1, yStart+(nCount-k)*nHeight/nCount-7, strText );
	}
}

BOOL DrawPriceVolumeAxis(	CDC * pDC, CRect rectPrice, CRect rectVolume,
							int nGapYAxis, double dLastClose, double * pdMin, double * pdMax, double dMaxVolume, int nDotCount )
{
	DECLARE_COLOR_DEFINATION

	ASSERT( pdMin && pdMax );
	if( NULL == pdMin || NULL == pdMax )
		return FALSE;
	if( rectPrice.Height() <= 0 || rectPrice.Width() <= 0 )
		return FALSE;
	if( rectVolume.Height() <= 0 || rectVolume.Width() <= 0 )
		return FALSE;
	ASSERT( rectPrice.left == rectVolume.left && rectPrice.right == rectVolume.right );
	ASSERT( nDotCount >= 0 );
	if( nGapYAxis <= 0 || nDotCount < 0 )
		return FALSE;
	if( dLastClose < 1e-4 )
		dLastClose	= (*pdMin+*pdMax)/2;
	
	// 重新修正 *pdMin, *pdMax
	int	nPriceLines		= 2*((rectPrice.Height()/2)/nGapYAxis);
	int	nVolumeLines	= 2*((rectVolume.Height()/2)/nGapYAxis);
	double dABS = max(fabs(*pdMax-dLastClose),fabs(*pdMin-dLastClose));
	double dPrecision = pow((double)10,0-nDotCount);
	if( dABS < dPrecision*nPriceLines )
		dABS	= dPrecision*nPriceLines;
	else if( dABS < 2*dPrecision*nPriceLines )
		dABS	= 2*dPrecision*nPriceLines;
	else if( dABS < 3*dPrecision*nPriceLines )
		dABS	= 3*dPrecision*nPriceLines;
	*pdMin	= dLastClose-dABS;
	*pdMax	= dLastClose+dABS;
	
	// Draw Border
	pDC->Draw3dRect( &rectPrice, clrBorder, clrBorder );
	pDC->Draw3dRect( &rectVolume, clrBorder, clrBorder );

	int k=0;
	// Draw Lines
	for(  k=0; k<nPriceLines; k++ )
		DrawLine( pDC, 1, clrBorder, rectPrice.left, rectPrice.top+k*rectPrice.Height()/nPriceLines, rectPrice.right, rectPrice.top+k*rectPrice.Height()/nPriceLines );
	DrawLine( pDC, 2, clrBorder, rectPrice.left, rectPrice.top+rectPrice.Height()/2, rectPrice.right, rectPrice.top+rectPrice.Height()/2 );
	for(  k=0; k<nVolumeLines; k++ )
		DrawLine( pDC, 1, clrBorder, rectVolume.left, rectVolume.top+k*rectVolume.Height()/nVolumeLines, rectVolume.right, rectVolume.top+k*rectVolume.Height()/nVolumeLines );

	// Draw Columns
	for(  k=1; k<=8; k++ )
	{
		if( k % 2 )
			DrawDashLine( pDC, 1, clrBorder, rectPrice.left+k*rectPrice.Width()/8, rectPrice.top, rectPrice.left+k*rectPrice.Width()/8, rectVolume.bottom );
		else
			DrawLine( pDC, 1, clrBorder, rectPrice.left+k*rectPrice.Width()/8, rectPrice.top, rectPrice.left+k*rectPrice.Width()/8, rectVolume.bottom );
	}

	// Draw Price Axis Number, Will Extent the rect
	CFont	* pOldFont	= AfxSelectDCFont( pDC, 12 );
	pDC->SetBkColor( clrBK );
	CSize	sizeText;
	CString	strFmt, strText;
	strFmt.Format( "%%.%df", nDotCount );
	double	dMinAxis = dLastClose-dABS;
	double	dMaxAxis = dLastClose+dABS;

	for(  k=0; k<=nPriceLines && nPriceLines>0; k++ )
	{
		double	dCur	= dMinAxis+k*(dMaxAxis-dMinAxis)/nPriceLines;
		COLORREF	clr	= clrPlane;
		if( dCur-dLastClose > 1e-4)
			clr	= clrRise;
		if( dCur-dLastClose < -1e-4 )
			clr	= clrFall;

		if( dCur < 0 && dCur > (-0.51*pow((double)10,0-nDotCount)) )
			dCur	= 0;
		strText.Format( strFmt, dCur );
		sizeText	= pDC->GetTextExtent( strText );
		pDC->SetTextColor(  clr );
		pDC->TextOut( rectPrice.left-sizeText.cx-1, rectPrice.top+(nPriceLines-k)*rectPrice.Height()/nPriceLines-7, strText );

		double	dCurPercent	= 0.00;
		if( dLastClose > 1e-4 )
			dCurPercent	= 100*fabs(dCur-dLastClose)/dLastClose;
		strText.Format( "%.2f%%", dCurPercent );
		pDC->TextOut( rectPrice.right+3, rectPrice.top+(nPriceLines-k)*rectPrice.Height()/nPriceLines-7, strText );
	}

	// Draw Volume Axis Number
	DrawAxisNumber(	pDC, clrPlane, nVolumeLines, rectVolume.left, rectVolume.top, rectVolume.right, rectVolume.bottom,
					0, dMaxVolume/100/*成交量手數*/, FALSE, FALSE, 0 );

	pDC->SelectObject( pOldFont );
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CRealTime

#define	RT_RDTITLE_HEIGHT	24
#define	RT_RDELEMENT_HEIGHT	16
#define	RT_RDCOLUMN_WIDTH	220

CRealTime::CRealTime( )
{
	m_pParent			= NULL;
	m_nDrawMode			= CRealTime::modePriceLine;
	m_nReportWhat		= CRealTime::reportQuote;
	m_nTechLine			= CRealTime::techNone;

	m_nIndexCurrent		= -1;

	m_nCurrentStartPos	= -1;
	m_nCurrentPageCount	= -1;
	m_nCurrentSelectPos	= -1;

	m_dMaxPrice			= 0;
	m_dMinPrice			= 0;
	
	ResetMargins( );
	ResetIndexCurrent( );
}

CRealTime::~CRealTime( )
{
	ClearCurStock();
}

void CRealTime::SetParent( CWnd * pParent )
{
	m_pParent	= pParent;
}

void CRealTime::ResetMargins(	int nMarginTop, int nMarginLeft,
								int nMarginCenter, int nMarginBottom,
								int nGapYAxis, int nWidthReport )
{
	ASSERT( nMarginTop >= 0 && nMarginLeft >= 0 );
	ASSERT( nMarginCenter >= 0 && nMarginBottom >= 0 );
	ASSERT( nGapYAxis > 0 );
	ASSERT( nWidthReport >= 0 );

	m_nMarginTop		= nMarginTop;
	m_nMarginLeft		= nMarginLeft;
	m_nMarginCenter		= nMarginCenter;
	m_nMarginBottom		= nMarginBottom;
	m_nGapYAxis		= nGapYAxis;
	m_nWidthReport	= nWidthReport;

	if( m_nGapYAxis <= 0 )
		m_nGapYAxis	= 18;
}

void CRealTime::ClearCurStock( )
{
	m_CurStock.Clear();
}

BOOL CRealTime::SetCurStock( const char * szCode )
{
	if( NULL == szCode || strlen(szCode) <= 0 )
	{
		ASSERT( FALSE );
		return FALSE;
	}

	CStockInfo	info;
	if( !AfxGetStockContainer().GetStockInfo( szCode, &info ) )
	{
		ASSERT( FALSE );
		return FALSE;
	}

	return SetCurStock( info );
}

BOOL CRealTime::SetCurStock( CStockInfo & info )
{
	if( m_CurStock.GetStockInfo().IsEqualTo( info.GetMarket(), info.GetStockCode() ) )
	{
		return TRUE;
	}

	ResetIndexCurrent( );
	ClearCurStock();
	m_CurStock.SetStockInfo( &info );
	
	return TRUE;
}

BOOL CRealTime::PrepareStockData( )
{
	m_CurStock.GetReport().RemoveAll();
	m_CurStock.GetMinute().RemoveAll();
	m_CurStock.GetOutline().RemoveAll();

	// 讀取本地文件
	m_CurStock.SetDatabase( &AfxGetDB() );

	// 取得最新行情
	m_CurStock.PrepareData( CStock::dataReport, CKData::ktypeDay, TRUE );
	m_CurStock.PrepareData( CStock::dataMinute, CKData::ktypeDay, TRUE );
	m_CurStock.PrepareData( CStock::dataOutline, CKData::ktypeDay, TRUE );

	AfxGetStkReceiver().GetReport( m_CurStock.GetStockInfo(), m_CurStock.GetReport() );

	int	nLen = m_CurStock.GetReport().GetSize();
	if( nLen > 0 )
		UpdateStockInfoByREPORT( m_CurStock.GetStockInfo(), &(m_CurStock.GetReport().ElementAt(nLen-1)) );
	return TRUE;
}

void CRealTime::SetDrawMode( int nDrawMode, int nTechLine, int nReportWhat )
{
	m_nDrawMode		= nDrawMode;
	m_nTechLine		= nTechLine;
	m_nReportWhat	= nReportWhat;

	m_nCurrentStartPos	= -1;
	m_nCurrentPageCount	= -1;
	m_nCurrentSelectPos	= -1;
}

int CRealTime::GetDrawMode( )
{
	return m_nDrawMode;
}

int CRealTime::GetDrawTechLine( )
{
	return m_nTechLine;
}

int CRealTime::GetReportWhat( )
{
	return m_nReportWhat;
}

LRESULT CRealTime::OnStkReceiverData( WPARAM wParam, LPARAM lParam )
{
	PCOMMPACKET	pCommPacket	= (PCOMMPACKET)lParam;

	switch( wParam )
	{
	case CStock::dataReport:
		if( pCommPacket && CStock::dataReport == pCommPacket->m_dwDataType )
		{
			BOOL	bInv = FALSE;
			for(DWORD i=0; i<pCommPacket->m_dwCount; i++)
			{
				if( m_CurStock.GetStockInfo().IsEqualTo( pCommPacket->m_pReport[i].m_dwMarket, pCommPacket->m_pReport[i].m_szCode ) )
				{
					UpdateStockInfoByREPORT( m_CurStock.GetStockInfo(), &(pCommPacket->m_pReport[i]) );
					if( -1 != m_CurStock.GetReport().InsertReportSort( pCommPacket->m_pReport[i] ) )
					{
						MINUTE	minute;
						if( convert_REPORT_to_MINUTE( &(pCommPacket->m_pReport[i]), &minute ) )
							m_CurStock.GetMinute().InsertMinuteSort( minute );
						m_nCurrentStartPos	= -1;
						bInv = TRUE;
					}
				}
			}
			if( bInv && m_pParent && ::IsWindow(m_pParent->GetSafeHwnd()) )
				m_pParent->Invalidate();
		}
		break;
	case CStock::dataMinute:
		if( pCommPacket && CStock::dataMinute == pCommPacket->m_dwDataType )
		{
			int	nOldSize	= m_CurStock.GetMinute().GetSize();
			for(DWORD i=0; i<pCommPacket->m_dwCount; i++)
			{
				if( m_CurStock.GetStockInfo().IsEqualTo( pCommPacket->m_pMinute[i].m_dwMarket, pCommPacket->m_pMinute[i].m_szCode ) )
					m_CurStock.GetMinute().InsertMinuteSort( pCommPacket->m_pMinute[i] );
			}
			if( nOldSize != m_CurStock.GetMinute().GetSize() && m_pParent && ::IsWindow(m_pParent->GetSafeHwnd()) )
			{
				m_nCurrentStartPos	= -1;
				m_pParent->Invalidate();
			}
		}
		break;
	}
	return 0L;
}

void CRealTime::Redraw( CDC * pDC, CRect rectAll )
{
	ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
	if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
		return;

	CClientDC	dc(m_pParent);
	if( NULL == pDC )
		pDC		= &dc;

	ResetClient( rectAll );
	pDC->FillSolidRect( &rectAll, AfxGetProfile().GetColor(CColorClass::clrGraphBK) );

	if( CRealTime::modePriceLine == m_nDrawMode )
	{
		DrawPriceVolume( pDC );
		DrawLBDK( pDC );
		DrawMMLD( pDC );
		DrawReportRegion( pDC );
			
		DrawSelectionLine( pDC, TRUE );
		OnIndexCurrentChanged( );
	}
	else if( CRealTime::modeReportDetail == m_nDrawMode )
	{
		DrawReportDetail( pDC );
	}
	else if( CRealTime::modeMinuteDetail == m_nDrawMode )
	{
		DrawMinuteDetail( pDC );
	}
	else if( CRealTime::modeBigTradeDetail == m_nDrawMode )
	{
		DrawBigTradeDetail( pDC );
	}
}

void CRealTime::DrawReportRegion( CDC * pDC )
{
	ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
	if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
		return;

	CClientDC	dc(m_pParent);
	if( NULL == pDC )
		pDC		= &dc;

	if( CRealTime::modePriceLine == m_nDrawMode )
	{
		switch( m_nReportWhat )
		{
		case CRealTime::reportQuote:		DrawReportQuote( pDC );			break;
		case CRealTime::reportPrice:		DrawReportPrice( pDC );			break;
		case CRealTime::reportMinute:		DrawReportMinute( pDC );		break;
		case CRealTime::reportBuySellEx:	DrawReportBuySellEx( pDC );		break;
		case CRealTime::reportValue:		DrawReportValue( pDC );			break;
		case CRealTime::reportDistribute:	DrawReportDistribute( pDC );	break;
		case CRealTime::reportBigTrade:		DrawReportBigTrade( pDC );		break;
		}
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// 以下為分時價格線使用 modePriceLine

void CRealTime::MoveLeft( BOOL bShiftPressed )
{
	if( CRealTime::modePriceLine != m_nDrawMode )
		return;
	Move( -1, bShiftPressed, FALSE );
}

void CRealTime::MoveRight( BOOL bShiftPressed )
{
	if( CRealTime::modePriceLine != m_nDrawMode )
		return;
	Move( 1, bShiftPressed, FALSE );
}

void CRealTime::MoveUp( BOOL bShiftPressed )
{
	if( CRealTime::modePriceLine == m_nDrawMode )
	{
		int	nTotalSize = 0;
		if( CRealTime::reportQuote == m_nReportWhat )
			nTotalSize	= m_CurStock.GetReport().GetSize();
//		else if( CRealTime::reportPrice == m_nReportWhat )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人亚洲精品青草天美| 欧美亚洲免费在线一区| 99国产麻豆精品| 777午夜精品视频在线播放| 国产欧美一区二区精品久导航| 亚洲男人的天堂网| 国产精品一区二区在线观看网站| 欧美卡1卡2卡| 亚洲素人一区二区| 国产精品一二一区| 日韩女同互慰一区二区| 亚洲最新在线观看| 97精品国产97久久久久久久久久久久| 欧美一区二区大片| 日日夜夜一区二区| 日本韩国欧美一区二区三区| 国产欧美日韩精品一区| 看国产成人h片视频| 欧美亚洲愉拍一区二区| 中文字幕永久在线不卡| 国产aⅴ综合色| xfplay精品久久| 老司机午夜精品99久久| 欧美精品在线一区二区| 亚洲综合色网站| 在线观看91视频| 一区二区高清在线| 色婷婷亚洲精品| 一区二区三区日本| 色婷婷国产精品| 一区二区三区免费| 91高清视频在线| 亚洲一区电影777| 欧美日韩精品一区二区在线播放| 一区二区三区91| 欧美日韩一卡二卡| 天堂一区二区在线| 欧美日韩大陆在线| 奇米精品一区二区三区四区| 538在线一区二区精品国产| 日韩中文字幕亚洲一区二区va在线| 欧美性猛片aaaaaaa做受| 亚洲黄色免费网站| 欧美日韩国产天堂| 麻豆国产一区二区| 2023国产精华国产精品| 国产成人精品亚洲午夜麻豆| 国产日韩精品一区| 色综合视频一区二区三区高清| 亚洲综合免费观看高清完整版在线| 欧美日韩一区小说| 美女在线一区二区| 国产精品视频一二三| 日本精品视频一区二区三区| 婷婷亚洲久悠悠色悠在线播放| 欧美精品日韩综合在线| 麻豆91精品91久久久的内涵| 久久久久久久久97黄色工厂| 成人av影视在线观看| 亚洲精品成人少妇| 日韩视频免费直播| 成人激情开心网| 亚洲成人第一页| 精品久久久久久久久久久久包黑料 | 337p日本欧洲亚洲大胆精品| 国产ts人妖一区二区| 伊人一区二区三区| 欧美videossexotv100| 成人黄色av网站在线| 亚洲高清免费视频| 国产人久久人人人人爽| 在线影院国内精品| 国产精品一区二区在线播放| 亚洲女女做受ⅹxx高潮| 日韩免费看的电影| 91日韩在线专区| 麻豆国产一区二区| 亚洲精品老司机| 精品国产网站在线观看| 日本道在线观看一区二区| 久久成人免费网站| 亚洲午夜久久久久久久久久久| 久久久久久黄色| 欧美日韩高清影院| aa级大片欧美| 国产精品资源网站| 蜜臀国产一区二区三区在线播放| 亚洲柠檬福利资源导航| 久久久夜色精品亚洲| 欧美日韩国产综合久久| 成人永久aaa| 捆绑调教一区二区三区| 亚洲国产日韩一级| 亚洲欧美偷拍卡通变态| 国产亚洲精品7777| 欧美电视剧在线看免费| 欧美日韩精品一区二区天天拍小说| 成人app在线| 国产成人午夜片在线观看高清观看| 日本成人中文字幕在线视频| 亚洲三级在线免费观看| 国产精品女主播在线观看| 精品美女被调教视频大全网站| 欧美丝袜丝交足nylons| 色成年激情久久综合| 成人黄色免费短视频| 国产精品主播直播| 国产精品一区二区在线观看网站| 免费在线观看精品| 天天亚洲美女在线视频| 亚洲成人av一区二区| 亚洲精品一卡二卡| 亚洲欧美日本在线| 依依成人精品视频| 亚洲精品少妇30p| 亚洲欧洲精品一区二区三区| 国产欧美一区二区三区在线老狼| 国产色综合一区| 久久久美女艺术照精彩视频福利播放| 日韩一区二区不卡| 精品国产伦一区二区三区免费| 欧美一区二区在线免费观看| 欧美卡1卡2卡| 日韩欧美成人午夜| 久久精品水蜜桃av综合天堂| 欧美精品一区二区在线播放| 精品国产凹凸成av人网站| 久久精品欧美日韩精品 | 7777精品伊人久久久大香线蕉 | 99re成人在线| 97精品电影院| 91国偷自产一区二区三区成为亚洲经典 | 91久久一区二区| 欧美在线综合视频| 7799精品视频| 精品av久久707| 国产精品视频第一区| 亚洲毛片av在线| 亚洲大片一区二区三区| 奇米影视在线99精品| 国产精品一区三区| 97成人超碰视| 91精品欧美一区二区三区综合在 | 国产精品三级电影| 一区二区三区日韩精品| 蜜桃传媒麻豆第一区在线观看| 久久精品国产免费| 丁香天五香天堂综合| 色噜噜狠狠色综合中国| 678五月天丁香亚洲综合网| 久久综合九色综合97_久久久| 欧美极品少妇xxxxⅹ高跟鞋| 一二三四区精品视频| 麻豆成人av在线| 97久久超碰国产精品电影| 欧美日韩中字一区| 久久精品网站免费观看| 亚洲在线观看免费视频| 国产一区二区网址| 91尤物视频在线观看| 日韩欧美高清一区| 亚洲免费观看高清在线观看| 精品亚洲欧美一区| 欧美性欧美巨大黑白大战| 中文字幕精品一区二区精品绿巨人| 亚洲成人激情av| 99在线视频精品| 久久尤物电影视频在线观看| 一区二区日韩电影| 风间由美一区二区三区在线观看| 欧美体内she精高潮| 中文字幕成人av| 久久www免费人成看片高清| 日本二三区不卡| 国产精品国产精品国产专区不片| 青青青伊人色综合久久| 91丨porny丨最新| 欧美激情在线一区二区三区| 青青草国产精品97视觉盛宴| 99久久精品费精品国产一区二区| 欧美电影免费观看高清完整版在线 | 日韩小视频在线观看专区| 日韩伦理av电影| 国产精品中文字幕欧美| 日韩欧美国产综合| 首页国产欧美日韩丝袜| 91黄视频在线观看| 亚洲欧美色图小说| 成人开心网精品视频| 久久久99精品免费观看| 久久不见久久见免费视频1| 欧美日韩高清一区二区三区| 一级日本不卡的影视| 99免费精品视频| 亚洲欧洲三级电影| 99久久精品免费看国产免费软件| 久久九九久精品国产免费直播| 久久er精品视频| 久久亚洲精精品中文字幕早川悠里 | 成人免费三级在线|