⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simureport.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
			pDC->SelectObject( &penLocal2 );
			pDC->MoveTo( xMedium-m_nStepWeight, yStoreLast );
			pDC->LineTo( xMedium, yStoreNow );
			pDC->SelectObject( pOldPen );
		}
		yYieldLast		=	yYieldNow;
		yStoreLast		=	yStoreNow;
		bHasLast	=	TRUE;

		if( k > 0 )	//	Draw Date
		{
			CSPTime	tmLast(m_AssetSerial.ElementAt(k-1).time);
			CSPTime	tmNow(serial.time);

			CString	strText;
			if( tmLast.GetYear() != tmNow.GetYear()
				|| tmLast.GetMonth() != tmNow.GetMonth() )
				strText	=	tmNow.Format( "%y/%m/%d" );
			if( strText.GetLength() > 0 && xDateLast < xMedium && xMedium+pDC->GetTextExtent(strText).cx < rectDraw.right )
			{
				pDC->TextOut( xMedium+2, rectDraw.bottom+1, strText );
				xDateLast	=	xMedium+2 + pDC->GetTextExtent(strText).cx;

				CPen	penLocal( PS_SOLID, 1, clrBorder );
				CPen * pOldPen = pDC->SelectObject( &penLocal );
				pDC->MoveTo( xMedium, rectDraw.bottom );
				pDC->LineTo( xMedium, rectDraw.bottom+13 );
				pDC->SelectObject( pOldPen );
			}
		}
	}

	// Draw Text
	pDC->SetBkColor( clrBK );
	AfxSelectDCFont( pDC, 14 );
	CString	strText;
	strText.LoadString( IDS_SIMUREPORT_YIELDLINE );
	pDC->SetTextColor( clrLine1 );
	pDC->TextOut( rectDraw.left+rectDraw.Width()/10, rectDraw.bottom+17, strText );

	strText.LoadString( IDS_SIMUREPORT_STORELINE );
	pDC->SetTextColor( clrLine2 );
	pDC->TextOut( rectDraw.left+6*rectDraw.Width()/10, rectDraw.bottom+17, strText );
	pDC->SelectObject( pOldFont );

	return TRUE;
}

/***
	准备数据
*/
BOOL CCurveButton::PrepareDrawData(CRect rectClient, int nStart, int nWeight,
								   LPRECT prectDraw, int *pnStartNew, int *pnCount, double *pdMin, double *pdMax )
{
	// RectDraw
	CRect	rectDraw( rectClient.left+SRC_LEFTMARGIN, rectClient.top+SRC_TOPMARGIN, 
					rectClient.right-SRC_RIGHTMARGIN, rectClient.bottom-SRC_BOTTOMMARGIN );
	int		nStartNew = nStart, nCount = 0;
	double	dMin = 0, dMax = 0;
	
	// Start
	if( nWeight <= 0 || m_AssetSerial.GetSize() <= 0 )
		return FALSE;
	nCount	=	rectDraw.Width() / nWeight;
	if( nStartNew >= m_AssetSerial.GetSize() || nStartNew < 0 )
		nStartNew	=	-1;

	if( -1 == nStartNew )
	{
		nStartNew	=	m_AssetSerial.GetSize()-nCount;
		if( nStartNew < 0 )
			nStartNew	=	0;
	}
	if( nStartNew+nCount-1 >= m_AssetSerial.GetSize() )
		nCount	=	m_AssetSerial.GetSize() - nStartNew;
	if( nStartNew < 0 || nStartNew >= m_AssetSerial.GetSize() )
		return FALSE;

	// MinMax
	for( int i=0; i<m_AssetSerial.GetSize(); i++ )
	{
		if( m_AssetSerial.ElementAt(i).dAsset > dMax )
			dMax	=	m_AssetSerial.ElementAt(i).dAsset;
	}
	if( m_dStartAmount < 1e-4 )
		return FALSE;
	dMax	=	dMax / m_dStartAmount;

	if( prectDraw )	*prectDraw	=	rectDraw;
	if( pnStartNew )*pnStartNew	=	nStartNew;
	if( pnCount )	*pnCount	=	nCount;
	if( pdMin )		*pdMin		=	dMin;
	if( pdMax )		*pdMax		=	dMax;
	return TRUE;
}

void CCurveButton::ResetScrollBars()
{
	if ( !::IsWindow(GetSafeHwnd()) )
		return;

	ASSERT( m_nStepWeight > 0 );
	if( m_nStepWeight <= 0 )
		return;

	CRect	rectClient;
	GetClientRect( &rectClient );
	int	nCountPerPage	=	(rectClient.Width()-SRC_LEFTMARGIN-SRC_RIGHTMARGIN)/m_nStepWeight;

	SCROLLINFO si;
	si.cbSize = sizeof(SCROLLINFO);
	si.fMask  = SIF_PAGE;
	si.nPage  = nCountPerPage;
	FlatSB_SetScrollInfo(GetSafeHwnd(),SB_HORZ, &si, FALSE); 

	m_nHScrollMax = 0;
	if( nCountPerPage < m_AssetSerial.GetSize() )
		m_nHScrollMax = m_AssetSerial.GetSize()-1;

	ASSERT( m_nHScrollMax < INT_MAX );
	ASSERT( m_nHScrollMax < SHRT_MAX );
	FlatSB_SetScrollRange(GetSafeHwnd(),SB_HORZ, 0, m_nHScrollMax, TRUE);
}

int CCurveButton::GetScrollPos32(int nBar, BOOL bGetTrackPos /* = FALSE */)
{
	SCROLLINFO si;
	si.cbSize = sizeof(SCROLLINFO);

	if (bGetTrackPos)
	{
		si.fMask	=	SIF_TRACKPOS;
		if (FlatSB_GetScrollInfo(GetSafeHwnd(),nBar, &si))
			return si.nTrackPos;
	}
	else 
	{
		si.fMask	=	SIF_POS;
		if (FlatSB_GetScrollInfo(GetSafeHwnd(),nBar, &si))
			return si.nPos;
	}
	return 0;
}

BOOL CCurveButton::SetScrollPos32(int nBar, int nPos, BOOL bRedraw /* = TRUE */)
{
	SCROLLINFO si;
	si.cbSize = sizeof(SCROLLINFO);
	si.fMask  = SIF_POS;
	si.nPos   = nPos;
	return FlatSB_SetScrollInfo(GetSafeHwnd(),nBar, &si, bRedraw);
}

int CCurveButton::GetScrollPage( int nBar )
{
	SCROLLINFO si;
	si.cbSize = sizeof(SCROLLINFO);
	si.fMask  = SIF_PAGE;
	if( FlatSB_GetScrollInfo(GetSafeHwnd(), nBar, &si ) )
		return si.nPage;
	return 10;
}

/***
	响应垂直滚动条消息
*/
void CCurveButton::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int scrollPos = GetScrollPos32(SB_HORZ);

	switch (nSBCode)
	{
		case SB_LINERIGHT:
			if( scrollPos < m_nHScrollMax )
			{
				SetScrollPos32(SB_HORZ, scrollPos + 1);
				if( GetScrollPos32(SB_HORZ) != scrollPos )
					Invalidate( );
			}
		break;

		case SB_LINELEFT:
			if( scrollPos > 0 )
			{
				SetScrollPos32(SB_HORZ, max(0,scrollPos - 1));
				Invalidate( );
			}
			break;

		case SB_PAGERIGHT:
			if( scrollPos < m_nHScrollMax )
			{
				int pos = min(m_nHScrollMax, scrollPos + GetScrollPage(SB_HORZ));
				SetScrollPos32( SB_HORZ, pos);
				Invalidate( );
			}
		break;

		case SB_PAGELEFT:
			if (scrollPos > 0)
			{
				int pos = max(0, scrollPos - GetScrollPage(SB_HORZ));
				SetScrollPos32(SB_HORZ, pos);
				Invalidate( );
			}
		break;

		case SB_THUMBPOSITION:
		case SB_THUMBTRACK:
			{
				SetScrollPos32(SB_HORZ, GetScrollPos32(SB_HORZ, TRUE));
				Invalidate( );
			}
		break;

		case SB_LEFT:
			if (scrollPos > 0)
			{
				SetScrollPos32(SB_HORZ, 0);
				Invalidate();
			}
		break;

		case SB_RIGHT:
		if (scrollPos < m_nHScrollMax)
			{
				SetScrollPos32(SB_HORZ, m_nHScrollMax);
				Invalidate();
			}
		break;

		default: break;
	}
}


/////////////////////////////////////////////////////////////////////////////
// CSimuReport

CSimuReport::CSimuReport(CWnd* pParent /*=NULL*/)
	: CXFDialog(CSimuReport::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSimuReport)
	//}}AFX_DATA_INIT
	m_pStrategy	=	NULL;
	SetTransparent( FALSE );
}

CSimuReport::~CSimuReport()
{
}

void CSimuReport::SetStrategy( CStrategy * pStrategy )
{
	m_pStrategy	=	pStrategy;
}

/***
	设定策略模拟报表统计数据
*/
BOOL CSimuReport::SetResults( )
{
	if( NULL == m_pStrategy )
		return FALSE;

	CString	strBuyTimes, strVictoryTimes, strYieldMax, strYieldMin, strYieldFin, strYieldIndex, strYieldStdDev, strXiapu;

	int nTimes = 0, nVictoryTimes = 0;
	double	dYieldMax = 0, dYieldMin = 0;
	COpRecordContainer & container = m_pStrategy->SimuGetOpRecord();
	container.StatResults( &nTimes, &nVictoryTimes, &dYieldMax, &dYieldMin );

	strBuyTimes.Format( "%u", nTimes );
	m_editBuyTimes.SetWindowText( strBuyTimes );

	strVictoryTimes.Format( "%u", nVictoryTimes );
	m_editVictoryTimes.SetWindowText( strVictoryTimes );

	strYieldMax.Format( "%.2f%%", dYieldMax*100 );
	m_editYieldMax.SetWindowText( strYieldMax );

	strYieldMin.Format( "%.2f%%", dYieldMin*100 );
	m_editYieldMin.SetWindowText( strYieldMin );

	strYieldFin.Format( "%.2f%%", m_pStrategy->SimuGetCurrentYieldPercent()*100 );
	m_editYieldFin.SetWindowText( strYieldFin );

	strYieldIndex.Format( "%.2f%%", m_pStrategy->SimuGetCurrentYieldIndexPercent()*100 );
	m_editYieldIndex.SetWindowText( strYieldIndex );

	double	dStdDev = 0, dXiapu = 0;
	CAssetSerialContainer & assetserial = m_pStrategy->SimuGetAssetSerial();
	if( assetserial.GetStdDev( &dStdDev, &dXiapu ) )
	{
		strYieldStdDev.Format( "%.2f%%", dStdDev*100 );
		strXiapu.Format( "%.2f%%", dXiapu*100 );
	}
	m_editYieldStdDev.SetWindowText( strYieldStdDev );
	m_editXiapu.SetWindowText( strXiapu );

	return TRUE;
}

void CSimuReport::DoDataExchange(CDataExchange* pDX)
{
	CXFDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSimuReport)
	DDX_Control(pDX, IDOK, m_btnOK);
	DDX_Control(pDX, IDC_XIAPU, m_editXiapu);
	DDX_Control(pDX, IDC_YIELDSTDDEV, m_editYieldStdDev);
	DDX_Control(pDX, IDC_STATICEXPLAIN, m_staticExplain);
	DDX_Control(pDX, IDC_CURVE, m_curve);
	DDX_Control(pDX, IDC_COPY, m_btnCopy);
	DDX_Control(pDX, IDC_YIELDINDEX, m_editYieldIndex);
	DDX_Control(pDX, IDC_YIELDFIN, m_editYieldFin);
	DDX_Control(pDX, IDC_YIELDMIN, m_editYieldMin);
	DDX_Control(pDX, IDC_YIELDMAX, m_editYieldMax);
	DDX_Control(pDX, IDC_VICTORYTIMES, m_editVictoryTimes);
	DDX_Control(pDX, IDC_BUYTIMES, m_editBuyTimes);
	DDX_Control(pDX, IDC_OPRECORD, m_listOpRecord);
	DDX_Control(pDX, IDC_STOCKOWN, m_listStockOwn);
	DDX_Control(pDX, IDC_TABCTRL, m_tabctrl);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSimuReport, CXFDialog)
	//{{AFX_MSG_MAP(CSimuReport)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL, OnSelchangeTabctrl)
	ON_BN_CLICKED(IDC_COPY, OnCopy)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSimuReport message handlers

BOOL CSimuReport::OnInitDialog()
{
	CXFDialog::OnInitDialog();

	// TODO: Add extra initialization here
	ASSERT( m_pStrategy );

	// Set Attr
	CString	strItem;
	strItem.LoadString( IDS_SIMUREPORT_OPRECORD );
	m_tabctrl.InsertItem( 0, strItem );
	strItem.LoadString( IDS_SIMUREPORT_CURVE );
	m_tabctrl.InsertItem( 1, strItem );
	strItem.LoadString( IDS_SIMUREPORT_STOCKOWN );
	m_tabctrl.InsertItem( 2, strItem );

	// Init
	m_listOpRecord.InitOpRecordList( );
	m_listStockOwn.InitStockOwnList( );
	m_listOpRecord.LoadOpRecordList( m_pStrategy->SimuGetOpRecord() );
	m_listStockOwn.LoadStockOwnList( m_pStrategy->SimuGetStockOwn(), m_pStrategy->SimuGetCurrentCash(), m_pStrategy->SimuGetCurrentTime().GetTime(),
						m_pStrategy->SimuGetAsset(m_pStrategy->SimuGetCurrentTime()), m_pStrategy->GetTechStockContainer() );

	SetResults( );

	// Curve Init
	m_curve.SetAssetSerial( m_pStrategy->SimuGetAssetSerial(), m_pStrategy->GetOpParam().m_nStartAmount );
	m_curve.Initialize( );

	// Tab Show
	m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
	m_curve.ShowWindow( SW_HIDE );
	m_listStockOwn.ShowWindow( SW_HIDE );
	m_btnCopy.EnableWindow( TRUE );
	CString	strExplain;
	m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
	strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
	m_staticExplain.SetWindowText( strExplain );
	
	UpdateData( FALSE );
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSimuReport::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int	nCurSel	=	m_tabctrl.GetCurSel();
	CString	strExplain;
	switch( nCurSel )
	{
	case	0:
		m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_curve.ShowWindow( SW_HIDE );
		m_listStockOwn.ShowWindow( SW_HIDE );
		m_btnCopy.EnableWindow( TRUE );
		m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
		m_staticExplain.SetWindowText( strExplain );
		break;
	case	1:
		m_listOpRecord.ShowWindow( SW_HIDE );
		m_curve.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_listStockOwn.ShowWindow( SW_HIDE );
		m_btnCopy.EnableWindow( FALSE );
		m_staticExplain.ShowWindow( SW_HIDE );
		break;
	case	2:
		m_listOpRecord.ShowWindow( SW_HIDE );
		m_curve.ShowWindow( SW_HIDE );
		m_listStockOwn.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
		m_btnCopy.EnableWindow( TRUE );
		m_staticExplain.ShowWindow( SW_HIDE );
		break;
	default:
		ASSERT( FALSE );
		break;
	}
	*pResult = 0;
}

void CSimuReport::OnCopy() 
{
	if( m_listOpRecord.IsWindowVisible() )
	{
		m_listOpRecord.Copy( );
	}
	else if( m_listStockOwn.IsWindowVisible() )
	{
		m_listStockOwn.Copy( );
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -