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

📄 simureport.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
// SimuReport.cpp : implementation file
//

#include "stdafx.h"

#include "SimuReport.h"

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

/////////////////////////////////////////////////////////////////////////////
// CReportListCtrl

/***
	获得策略报表ListCtrl的选中项
*/
int CReportListCtrl::GetSelected( )
{
	int	nSelected	=	-1;
	if( GetSelectedCount( ) > 0 )
	{
		for( int i=0; i<GetItemCount(); i++ )
		{
			if( LVIS_SELECTED == GetItemState(i,LVIS_SELECTED) )
			{
				nSelected	=	i;
				break;
			}
		}
	}
	return nSelected;
}

/***
	初始化策略报表ListCtrl成操作记录列表
*/
BOOL CReportListCtrl::InitOpRecordList( )
{
	SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
						| LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );

	while( DeleteColumn(0) );

	CString	strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
	strTime.LoadString( IDS_SIMUREPORT_TIME );
	strOp.LoadString( IDS_SIMUREPORT_OP );
	strStock.LoadString( IDS_SIMUREPORT_STOCK );
	strShare.LoadString( IDS_SIMUREPORT_SHARE );
	strSharePrice.LoadString( IDS_SIMUREPORT_SHAREPRICE );
	strAmount.LoadString( IDS_SIMUREPORT_AMOUNT );
	strRateCost.LoadString( IDS_SIMUREPORT_RATECOST );
	InsertColumn( 0, strTime, LVCFMT_CENTER, 70 );
	InsertColumn( 1, strOp, LVCFMT_CENTER, 60 );
	InsertColumn( 2, strStock, LVCFMT_CENTER, 70 );
	InsertColumn( 3, strShare, LVCFMT_CENTER, 60 );
	InsertColumn( 4, strSharePrice, LVCFMT_CENTER, 56 );
	InsertColumn( 5, strAmount, LVCFMT_CENTER, 70 );
	InsertColumn( 6, strRateCost, LVCFMT_CENTER, 60 );

	return TRUE;
}

/***
	初始化操作记录列表的数据
*/
BOOL CReportListCtrl::LoadOpRecordList( COpRecordContainer & container )
{
	DeleteAllItems();

	for( int i=0; i<container.GetSize(); i++ )
	{
		OPRECORD & record = container.ElementAt(i);
		CString	strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
		strTime	=	CSPTime(record.time).Format( "%Y/%m/%d" );
		strOp	=	AfxGetStrategyOpTypeString( record.lOpType );
		CStockInfo	info;
		strStock	=	record.szCode;
		if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) )
			strStock	=	info.GetStockName();
		strShare.Format( "%u", record.dwShare );
		strSharePrice.Format( "%.2f", record.dSharePrice );
		strAmount.Format( "%.2f", record.dwShare*record.dSharePrice );
		strRateCost.Format( "%.2f", record.dRateCost );

		InsertItem( i, strStock );
		SetItemText( i, 0, strTime );
		SetItemText( i, 1, strOp );
		SetItemText( i, 2, strStock );
		SetItemText( i, 3, strShare );
		SetItemText( i, 4, strSharePrice );
		SetItemText( i, 5, strAmount );
		SetItemText( i, 6, strRateCost );
		SetItemData( i, i );
	}

	if( GetItemCount() > 0 )
		SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );

	return TRUE;
}

/***
	初始化策略报表ListCtrl成下一步操作列表
*/
BOOL CReportListCtrl::InitNextOpList( )
{
	SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
						| LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );

	while( DeleteColumn(0) );

	CString	strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
	strOp.LoadString( IDS_SIMUREPORT_OP );
	strStock.LoadString( IDS_SIMUREPORT_STOCK );
	strShare.LoadString( IDS_SIMUREALOP_SHARE );
	strSharePrice.LoadString( IDS_SIMUREALOP_SHAREPRICE );
	strAmount.LoadString( IDS_SIMUREPORT_AMOUNT );
	strRateCost.LoadString( IDS_SIMUREPORT_RATECOST );
	InsertColumn( 0, strOp, LVCFMT_CENTER, 70 );
	InsertColumn( 1, strStock, LVCFMT_CENTER, 80 );
	InsertColumn( 2, strShare, LVCFMT_CENTER, 70 );
	InsertColumn( 3, strSharePrice, LVCFMT_CENTER, 70 );
	InsertColumn( 4, strAmount, LVCFMT_CENTER, 80 );
	InsertColumn( 5, strRateCost, LVCFMT_CENTER, 70 );
	
	return TRUE;
}

/***
	初始化下一步操作记录列表数据
*/
BOOL CReportListCtrl::LoadNextOpList( COpRecordContainer & container )
{
	DeleteAllItems();

	for( int i=0; i<container.GetSize(); i++ )
	{
		OPRECORD & record = container.ElementAt(i);
		CString	strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
		strOp	=	AfxGetStrategyOpTypeString( record.lOpType );
		CStockInfo	info;
		strStock	=	record.szCode;
		if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) )
			strStock	=	info.GetStockName();
		strShare.Format( "%u", record.dwShare );
		strSharePrice.Format( "%.2f", record.dSharePrice );
		strAmount.Format( "%.2f", record.dwShare*record.dSharePrice );
		strRateCost.Format( "%.2f", record.dRateCost );

		InsertItem( i, strStock );
		SetItemText( i, 0, strOp );
		SetItemText( i, 1, strStock );
		SetItemText( i, 2, strShare );
		SetItemText( i, 3, strSharePrice );
		SetItemText( i, 4, strAmount );
		SetItemText( i, 5, strRateCost );
		SetItemData( i, i );
	}

	if( GetItemCount() > 0 )
		SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );

	return TRUE;
}

/***
	初始化策略报表ListCtrl成拥有股票列表
*/
BOOL CReportListCtrl::InitStockOwnList( )
{
	SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
						| LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );

	while( DeleteColumn(0) );

	CString	strStock, strShare, strBuyPrice, strNowPrice;
	strStock.LoadString( IDS_SIMUREPORT_STOCK );
	strShare.LoadString( IDS_SIMUREPORT_OWNSHARE );
	strBuyPrice.LoadString( IDS_SIMUREPORT_BUYPRICE );
	strNowPrice.LoadString( IDS_SIMUREPORT_NOWPRICE );
	InsertColumn( 0, strStock, LVCFMT_CENTER, 100 );
	InsertColumn( 1, strShare, LVCFMT_CENTER, 100 );
	InsertColumn( 2, strBuyPrice, LVCFMT_CENTER, 100 );
	InsertColumn( 3, strNowPrice, LVCFMT_CENTER, 100 );
	return TRUE;
}

/***
	初始化拥有股票列表的数据
*/
BOOL CReportListCtrl::LoadStockOwnList( CStockOwnContainer & stockown, double dCash, CSPTime tmCur, double dAsset, CTechStockContainer & techstocks )
{
	DeleteAllItems();

	int i;
	for( i=0; i<stockown.GetSize(); i++ )
	{
		STOCKOWN & own = stockown.ElementAt(i);

		CString	strStock, strShare, strBuyPrice, strNowPrice;
		CStockInfo	info;
		strStock	=	own.szCode;
		if( AfxGetStockContainer().GetStockInfo( own.szCode, &info ) )
			strStock	=	info.GetStockName();
		strShare.Format( "%u", own.dwShare );
		strBuyPrice.Format( "%.2f", own.dBuyPrice );
		double	dNowPrice = 0;
		if( techstocks.GetClosePrice( own.szCode, tmCur.GetTime(), &dNowPrice ) )
			strNowPrice.Format( "%.2f", dNowPrice );

		InsertItem( i, strStock );
		SetItemText( i, 0, strStock );
		SetItemText( i, 1, strShare );
		SetItemText( i, 2, strBuyPrice );
		SetItemText( i, 3, strNowPrice );
		SetItemData( i, i );
	}

	CString	strCash;
	strCash.LoadString( IDS_SIMUREPORT_CASH );
	InsertItem( i, strCash );
	strCash.Format( "%.2f", dCash );
	SetItemText( i, 1, strCash );
	i++;

	CString	strAsset;
	strAsset.LoadString( IDS_SIMUREPORT_ASSET );
	InsertItem( i, strAsset );
	strAsset.Format( "%.2f", dAsset );
	SetItemText( i, 1, strAsset );

	if( GetItemCount() > 0 )
		SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );

	return TRUE;
}

/***
	拷贝列表到剪贴板
*/
void CReportListCtrl::Copy( )
{
	// Write to shared file (REMEBER: CF_TEXT is ANSI, not UNICODE, so we need to convert)
	CSharedFile sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);

	// Get a tab delimited string to copy to cache
	CString str;

	// Column
	CHeaderCtrl	* pHeader	=	GetHeaderCtrl();
	int	nColCount	=	pHeader ? pHeader->GetItemCount() : 0 ;

	str.Empty();
	char buffer[256];
	LVCOLUMN	column;
	memset( &column, 0, sizeof( column ) );
	column.mask	=	LVCF_TEXT;
	column.pszText	=	buffer;
	column.cchTextMax	=	255;
	int	nColumn	=	0;
	while( GetColumn( nColumn++, &column ) )
	{
		str	+=	buffer;
		str	+=	_T("\t");
	}
	str	+=	_T("\r\n");

	sf.Write(T2A(str.GetBuffer(1)), str.GetLength());
	str.ReleaseBuffer();

	// Data
	for( int nRow = 0; nRow <GetItemCount(); nRow ++ )
	{
		str.Empty();
		for( int nCol = 0; nCol <nColCount; nCol ++ )
		{
			CString	strTemp	=	GetItemText( nRow, nCol );
			str	+=	(strTemp.IsEmpty() ? _T(" ") : strTemp );
			if( nCol != nColCount-1 )
				str	+=	_T("\t");
		}
		if( nRow != GetItemCount()-1 )
			str += _T("\r\n");
		sf.Write(T2A(str.GetBuffer(1)), str.GetLength());
		str.ReleaseBuffer();
	}
	char c = '\0';
	sf.Write(&c, 1);

	DWORD dwLen = (DWORD)sf.GetLength();
	HGLOBAL hMem = sf.Detach();
	if (!hMem) 
		return;

	hMem = ::GlobalReAlloc(hMem, dwLen, GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
	if (!hMem) 
		return;

	// Cache data
	COleDataSource* pSource = new COleDataSource();
	pSource->CacheGlobalData(CF_TEXT, hMem);
	pSource->SetClipboard();
}

/////////////////////////////////////////////////////////////////////////////
// CCurveButton

#define	SRC_LEFTMARGIN		35
#define	SRC_RIGHTMARGIN		10
#define	SRC_TOPMARGIN		10
#define	SRC_BOTTOMMARGIN	35

#define	SRC_SCROLLBARHEIGHT	18

CCurveButton::CCurveButton( )
{
	m_dStartAmount	=	1000000;
	m_nStepWeight	=	2;
	m_nHScrollMax	=	0;
}

CCurveButton::~CCurveButton( )
{
}

/***
	设定曲线显示的资产数据序列
*/
void CCurveButton::SetAssetSerial( CAssetSerialContainer & src, double dStartAmount )
{
	m_AssetSerial.Copy( src );
	
	m_dStartAmount	=	dStartAmount;
	ASSERT( m_dStartAmount > 1e-4 );

	ResetScrollBars( );
}

BOOL CCurveButton::Initialize( )
{
	InitializeFlatSB(GetSafeHwnd());
	ResetScrollBars( );
	return TRUE;
}

BEGIN_MESSAGE_MAP(CCurveButton, CButton)
    //{{AFX_MSG_MAP(CCurveButton)
	ON_WM_HSCROLL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CCurveButton::PreSubclassWindow() 
{
	// Switch to owner-draw
	ModifyStyle(SS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);

	CButton::PreSubclassWindow();
}

void CCurveButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC * pDC	=	GetDC();
	if( NULL == pDC )
		return;

	CRect	rectClient;
	GetClientRect( &rectClient );

	pDC->FillSolidRect( rectClient, AfxGetProfile().GetColor(CColorClass::clrGraphBK) );
	
	int scrollpos	=	GetScrollPos32( SB_HORZ );
	DrawCurve( pDC, rectClient, scrollpos );
}

/***
	画曲线
*/
BOOL CCurveButton::DrawCurve( CDC * pDC, CRect rectClient, int nStart )
{
	CRect	rectDraw;
	int nCount;
	double	dMin, dMax;
	if( !PrepareDrawData( rectClient, nStart, m_nStepWeight, &rectDraw, &nStart, &nCount, &dMin, &dMax ) )
		return FALSE;

	DrawAxis( pDC, rectDraw, 15, 5, dMin, dMax, FALSE, TRUE, 2 );

	COLORREF	clrBK		=	AfxGetProfile().GetColor(CColorClass::clrGraphBK);
	COLORREF	clrLine1	=	AfxGetProfile().GetColor(CColorClass::clrLine1);
	COLORREF	clrLine2	=	AfxGetProfile().GetColor(CColorClass::clrLine3);
	COLORREF	clrBorder	=	AfxGetProfile().GetColor(CColorClass::clrBorder);
	COLORREF	clrText		=	AfxGetProfile().GetColor(CColorClass::clrText);
	int	yYieldLast, yYieldNow, yStoreLast, yStoreNow;
	int	xDateLast = 0;
	int	xMedium	= rectDraw.left;
	BOOL	bHasLast = FALSE;
	double	dYield = 1, dStore = 0;

	CFont	* pOldFont	=	AfxSelectDCFont( pDC, 12 );
	pDC->SetBkColor( clrBK );
	pDC->SetTextColor( clrText );
	for( int k=nStart; k<nStart+nCount && k<m_AssetSerial.GetSize(); k++ )
	{
		ASSETSERIAL	&	serial	=	m_AssetSerial.ElementAt(k);
		dYield	=	serial.dAsset / m_dStartAmount;
		if( serial.dAsset > 1e-4 )
			dStore	=	(serial.dAsset - serial.dCash) / serial.dAsset;

		xMedium	+=	m_nStepWeight;

		// Draw
		yYieldNow	=	int( rectDraw.bottom - (rectDraw.Height()-2) * (dYield - dMin) / (dMax-dMin) );
		yStoreNow	=	int( rectDraw.bottom - (rectDraw.Height()-2) * (dStore - dMin) / (dMax-dMin) );
		if( bHasLast )
		{
			if( yYieldLast > rectDraw.bottom || yYieldLast < rectDraw.top
				|| yYieldNow > rectDraw.bottom || yYieldNow < rectDraw.top )
				continue;
			if( yStoreLast > rectDraw.bottom || yStoreLast < rectDraw.top
				|| yStoreNow > rectDraw.bottom || yStoreNow < rectDraw.top )
				continue;
			CPen	penLocal1( PS_SOLID, 1, clrLine1 );
			CPen * pOldPen = pDC->SelectObject( &penLocal1 );
			pDC->MoveTo( xMedium-m_nStepWeight, yYieldLast );
			pDC->LineTo( xMedium, yYieldNow );

			CPen	penLocal2( PS_SOLID, 1, clrLine2 );

⌨️ 快捷键说明

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