📄 simureport.cpp.svn-base
字号:
// 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 + -