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