SimuReport.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:24k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // SimuReport.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SimuReport.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CReportListCtrl
  12. /***
  13. 获得策略报表ListCtrl的选中项
  14. */
  15. int CReportListCtrl::GetSelected( )
  16. {
  17. int nSelected = -1;
  18. if( GetSelectedCount( ) > 0 )
  19. {
  20. for( int i=0; i<GetItemCount(); i++ )
  21. {
  22. if( LVIS_SELECTED == GetItemState(i,LVIS_SELECTED) )
  23. {
  24. nSelected = i;
  25. break;
  26. }
  27. }
  28. }
  29. return nSelected;
  30. }
  31. /***
  32. 初始化策略报表ListCtrl成操作记录列表
  33. */
  34. BOOL CReportListCtrl::InitOpRecordList( )
  35. {
  36. SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
  37. | LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );
  38. while( DeleteColumn(0) );
  39. CString strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
  40. strTime.LoadString( IDS_SIMUREPORT_TIME );
  41. strOp.LoadString( IDS_SIMUREPORT_OP );
  42. strStock.LoadString( IDS_SIMUREPORT_STOCK );
  43. strShare.LoadString( IDS_SIMUREPORT_SHARE );
  44. strSharePrice.LoadString( IDS_SIMUREPORT_SHAREPRICE );
  45. strAmount.LoadString( IDS_SIMUREPORT_AMOUNT );
  46. strRateCost.LoadString( IDS_SIMUREPORT_RATECOST );
  47. InsertColumn( 0, strTime, LVCFMT_CENTER, 70 );
  48. InsertColumn( 1, strOp, LVCFMT_CENTER, 60 );
  49. InsertColumn( 2, strStock, LVCFMT_CENTER, 70 );
  50. InsertColumn( 3, strShare, LVCFMT_CENTER, 60 );
  51. InsertColumn( 4, strSharePrice, LVCFMT_CENTER, 56 );
  52. InsertColumn( 5, strAmount, LVCFMT_CENTER, 70 );
  53. InsertColumn( 6, strRateCost, LVCFMT_CENTER, 60 );
  54. return TRUE;
  55. }
  56. /***
  57. 初始化操作记录列表的数据
  58. */
  59. BOOL CReportListCtrl::LoadOpRecordList( COpRecordContainer & container )
  60. {
  61. DeleteAllItems();
  62. for( int i=0; i<container.GetSize(); i++ )
  63. {
  64. OPRECORD & record = container.ElementAt(i);
  65. CString strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
  66. strTime = CSPTime(record.time).Format( "%Y/%m/%d" );
  67. strOp = AfxGetStrategyOpTypeString( record.lOpType );
  68. CStockInfo info;
  69. strStock = record.szCode;
  70. if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) )
  71. strStock = info.GetStockName();
  72. strShare.Format( "%u", record.dwShare );
  73. strSharePrice.Format( "%.2f", record.dSharePrice );
  74. strAmount.Format( "%.2f", record.dwShare*record.dSharePrice );
  75. strRateCost.Format( "%.2f", record.dRateCost );
  76. InsertItem( i, strStock );
  77. SetItemText( i, 0, strTime );
  78. SetItemText( i, 1, strOp );
  79. SetItemText( i, 2, strStock );
  80. SetItemText( i, 3, strShare );
  81. SetItemText( i, 4, strSharePrice );
  82. SetItemText( i, 5, strAmount );
  83. SetItemText( i, 6, strRateCost );
  84. SetItemData( i, i );
  85. }
  86. if( GetItemCount() > 0 )
  87. SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );
  88. return TRUE;
  89. }
  90. /***
  91. 初始化策略报表ListCtrl成下一步操作列表
  92. */
  93. BOOL CReportListCtrl::InitNextOpList( )
  94. {
  95. SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
  96. | LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );
  97. while( DeleteColumn(0) );
  98. CString strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
  99. strOp.LoadString( IDS_SIMUREPORT_OP );
  100. strStock.LoadString( IDS_SIMUREPORT_STOCK );
  101. strShare.LoadString( IDS_SIMUREALOP_SHARE );
  102. strSharePrice.LoadString( IDS_SIMUREALOP_SHAREPRICE );
  103. strAmount.LoadString( IDS_SIMUREPORT_AMOUNT );
  104. strRateCost.LoadString( IDS_SIMUREPORT_RATECOST );
  105. InsertColumn( 0, strOp, LVCFMT_CENTER, 70 );
  106. InsertColumn( 1, strStock, LVCFMT_CENTER, 80 );
  107. InsertColumn( 2, strShare, LVCFMT_CENTER, 70 );
  108. InsertColumn( 3, strSharePrice, LVCFMT_CENTER, 70 );
  109. InsertColumn( 4, strAmount, LVCFMT_CENTER, 80 );
  110. InsertColumn( 5, strRateCost, LVCFMT_CENTER, 70 );
  111. return TRUE;
  112. }
  113. /***
  114. 初始化下一步操作记录列表数据
  115. */
  116. BOOL CReportListCtrl::LoadNextOpList( COpRecordContainer & container )
  117. {
  118. DeleteAllItems();
  119. for( int i=0; i<container.GetSize(); i++ )
  120. {
  121. OPRECORD & record = container.ElementAt(i);
  122. CString strOp, strStock, strShare, strSharePrice, strAmount, strRateCost;
  123. strOp = AfxGetStrategyOpTypeString( record.lOpType );
  124. CStockInfo info;
  125. strStock = record.szCode;
  126. if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) )
  127. strStock = info.GetStockName();
  128. strShare.Format( "%u", record.dwShare );
  129. strSharePrice.Format( "%.2f", record.dSharePrice );
  130. strAmount.Format( "%.2f", record.dwShare*record.dSharePrice );
  131. strRateCost.Format( "%.2f", record.dRateCost );
  132. InsertItem( i, strStock );
  133. SetItemText( i, 0, strOp );
  134. SetItemText( i, 1, strStock );
  135. SetItemText( i, 2, strShare );
  136. SetItemText( i, 3, strSharePrice );
  137. SetItemText( i, 4, strAmount );
  138. SetItemText( i, 5, strRateCost );
  139. SetItemData( i, i );
  140. }
  141. if( GetItemCount() > 0 )
  142. SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );
  143. return TRUE;
  144. }
  145. /***
  146. 初始化策略报表ListCtrl成拥有股票列表
  147. */
  148. BOOL CReportListCtrl::InitStockOwnList( )
  149. {
  150. SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP
  151. | LVS_EX_FLATSB | LVS_EX_REGIONAL | LVS_EX_INFOTIP | LVS_EX_UNDERLINEHOT );
  152. while( DeleteColumn(0) );
  153. CString strStock, strShare, strBuyPrice, strNowPrice;
  154. strStock.LoadString( IDS_SIMUREPORT_STOCK );
  155. strShare.LoadString( IDS_SIMUREPORT_OWNSHARE );
  156. strBuyPrice.LoadString( IDS_SIMUREPORT_BUYPRICE );
  157. strNowPrice.LoadString( IDS_SIMUREPORT_NOWPRICE );
  158. InsertColumn( 0, strStock, LVCFMT_CENTER, 100 );
  159. InsertColumn( 1, strShare, LVCFMT_CENTER, 100 );
  160. InsertColumn( 2, strBuyPrice, LVCFMT_CENTER, 100 );
  161. InsertColumn( 3, strNowPrice, LVCFMT_CENTER, 100 );
  162. return TRUE;
  163. }
  164. /***
  165. 初始化拥有股票列表的数据
  166. */
  167. BOOL CReportListCtrl::LoadStockOwnList( CStockOwnContainer & stockown, double dCash, CSPTime tmCur, double dAsset, CTechStockContainer & techstocks )
  168. {
  169. DeleteAllItems();
  170. for( int i=0; i<stockown.GetSize(); i++ )
  171. {
  172. STOCKOWN & own = stockown.ElementAt(i);
  173. CString strStock, strShare, strBuyPrice, strNowPrice;
  174. CStockInfo info;
  175. strStock = own.szCode;
  176. if( AfxGetStockContainer().GetStockInfo( own.szCode, &info ) )
  177. strStock = info.GetStockName();
  178. strShare.Format( "%u", own.dwShare );
  179. strBuyPrice.Format( "%.2f", own.dBuyPrice );
  180. double dNowPrice = 0;
  181. if( techstocks.GetClosePrice( own.szCode, tmCur.GetTime(), &dNowPrice ) )
  182. strNowPrice.Format( "%.2f", dNowPrice );
  183. InsertItem( i, strStock );
  184. SetItemText( i, 0, strStock );
  185. SetItemText( i, 1, strShare );
  186. SetItemText( i, 2, strBuyPrice );
  187. SetItemText( i, 3, strNowPrice );
  188. SetItemData( i, i );
  189. }
  190. CString strCash;
  191. strCash.LoadString( IDS_SIMUREPORT_CASH );
  192. InsertItem( i, strCash );
  193. strCash.Format( "%.2f", dCash );
  194. SetItemText( i, 1, strCash );
  195. i++;
  196. CString strAsset;
  197. strAsset.LoadString( IDS_SIMUREPORT_ASSET );
  198. InsertItem( i, strAsset );
  199. strAsset.Format( "%.2f", dAsset );
  200. SetItemText( i, 1, strAsset );
  201. if( GetItemCount() > 0 )
  202. SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED );
  203. return TRUE;
  204. }
  205. /***
  206. 拷贝列表到剪贴板
  207. */
  208. void CReportListCtrl::Copy( )
  209. {
  210. // Write to shared file (REMEBER: CF_TEXT is ANSI, not UNICODE, so we need to convert)
  211. CSharedFile sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
  212. // Get a tab delimited string to copy to cache
  213. CString str;
  214. // Column
  215. CHeaderCtrl * pHeader = GetHeaderCtrl();
  216. int nColCount = pHeader ? pHeader->GetItemCount() : 0 ;
  217. str.Empty();
  218. char buffer[256];
  219. LVCOLUMN column;
  220. memset( &column, 0, sizeof( column ) );
  221. column.mask = LVCF_TEXT;
  222. column.pszText = buffer;
  223. column.cchTextMax = 255;
  224. int nColumn = 0;
  225. while( GetColumn( nColumn++, &column ) )
  226. {
  227. str += buffer;
  228. str += _T("t");
  229. }
  230. str += _T("rn");
  231. sf.Write(T2A(str.GetBuffer(1)), str.GetLength());
  232. str.ReleaseBuffer();
  233. // Data
  234. for( int nRow = 0; nRow <GetItemCount(); nRow ++ )
  235. {
  236. str.Empty();
  237. for( int nCol = 0; nCol <nColCount; nCol ++ )
  238. {
  239. CString strTemp = GetItemText( nRow, nCol );
  240. str += (strTemp.IsEmpty() ? _T(" ") : strTemp );
  241. if( nCol != nColCount-1 )
  242. str += _T("t");
  243. }
  244. if( nRow != GetItemCount()-1 )
  245. str += _T("rn");
  246. sf.Write(T2A(str.GetBuffer(1)), str.GetLength());
  247. str.ReleaseBuffer();
  248. }
  249. char c = '';
  250. sf.Write(&c, 1);
  251. DWORD dwLen = (DWORD)sf.GetLength();
  252. HGLOBAL hMem = sf.Detach();
  253. if (!hMem) 
  254. return;
  255. hMem = ::GlobalReAlloc(hMem, dwLen, GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
  256. if (!hMem) 
  257. return;
  258. // Cache data
  259. COleDataSource* pSource = new COleDataSource();
  260. pSource->CacheGlobalData(CF_TEXT, hMem);
  261. pSource->SetClipboard();
  262. }
  263. /////////////////////////////////////////////////////////////////////////////
  264. // CCurveButton
  265. #define SRC_LEFTMARGIN 35
  266. #define SRC_RIGHTMARGIN 10
  267. #define SRC_TOPMARGIN 10
  268. #define SRC_BOTTOMMARGIN 35
  269. #define SRC_SCROLLBARHEIGHT 18
  270. CCurveButton::CCurveButton( )
  271. {
  272. m_dStartAmount = 1000000;
  273. m_nStepWeight = 2;
  274. m_nHScrollMax = 0;
  275. }
  276. CCurveButton::~CCurveButton( )
  277. {
  278. }
  279. /***
  280. 设定曲线显示的资产数据序列
  281. */
  282. void CCurveButton::SetAssetSerial( CAssetSerialContainer & src, double dStartAmount )
  283. {
  284. m_AssetSerial.Copy( src );
  285. m_dStartAmount = dStartAmount;
  286. ASSERT( m_dStartAmount > 1e-4 );
  287. ResetScrollBars( );
  288. }
  289. BOOL CCurveButton::Initialize( )
  290. {
  291. InitializeFlatSB(GetSafeHwnd());
  292. ResetScrollBars( );
  293. return TRUE;
  294. }
  295. BEGIN_MESSAGE_MAP(CCurveButton, CButton)
  296.     //{{AFX_MSG_MAP(CCurveButton)
  297. ON_WM_HSCROLL()
  298. //}}AFX_MSG_MAP
  299. END_MESSAGE_MAP()
  300. void CCurveButton::PreSubclassWindow() 
  301. {
  302. // Switch to owner-draw
  303. ModifyStyle(SS_TYPEMASK, BS_OWNERDRAW, SWP_FRAMECHANGED);
  304. CButton::PreSubclassWindow();
  305. }
  306. void CCurveButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  307. {
  308. CDC * pDC = GetDC();
  309. if( NULL == pDC )
  310. return;
  311. CRect rectClient;
  312. GetClientRect( &rectClient );
  313. pDC->FillSolidRect( rectClient, AfxGetProfile().GetColor(CColorClass::clrGraphBK) );
  314. int scrollpos = GetScrollPos32( SB_HORZ );
  315. DrawCurve( pDC, rectClient, scrollpos );
  316. }
  317. /***
  318. 画曲线
  319. */
  320. BOOL CCurveButton::DrawCurve( CDC * pDC, CRect rectClient, int nStart )
  321. {
  322. CRect rectDraw;
  323. int nCount;
  324. double dMin, dMax;
  325. if( !PrepareDrawData( rectClient, nStart, m_nStepWeight, &rectDraw, &nStart, &nCount, &dMin, &dMax ) )
  326. return FALSE;
  327. DrawAxis( pDC, rectDraw, 15, 5, dMin, dMax, FALSE, TRUE, 2 );
  328. COLORREF clrBK = AfxGetProfile().GetColor(CColorClass::clrGraphBK);
  329. COLORREF clrLine1 = AfxGetProfile().GetColor(CColorClass::clrLine1);
  330. COLORREF clrLine2 = AfxGetProfile().GetColor(CColorClass::clrLine3);
  331. COLORREF clrBorder = AfxGetProfile().GetColor(CColorClass::clrBorder);
  332. COLORREF clrText = AfxGetProfile().GetColor(CColorClass::clrText);
  333. int yYieldLast, yYieldNow, yStoreLast, yStoreNow;
  334. int xDateLast = 0;
  335. int xMedium = rectDraw.left;
  336. BOOL bHasLast = FALSE;
  337. double dYield = 1, dStore = 0;
  338. CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
  339. pDC->SetBkColor( clrBK );
  340. pDC->SetTextColor( clrText );
  341. for( int k=nStart; k<nStart+nCount && k<m_AssetSerial.GetSize(); k++ )
  342. {
  343. ASSETSERIAL & serial = m_AssetSerial.ElementAt(k);
  344. dYield = serial.dAsset / m_dStartAmount;
  345. if( serial.dAsset > 1e-4 )
  346. dStore = (serial.dAsset - serial.dCash) / serial.dAsset;
  347. xMedium += m_nStepWeight;
  348. // Draw
  349. yYieldNow = int( rectDraw.bottom - (rectDraw.Height()-2) * (dYield - dMin) / (dMax-dMin) );
  350. yStoreNow = int( rectDraw.bottom - (rectDraw.Height()-2) * (dStore - dMin) / (dMax-dMin) );
  351. if( bHasLast )
  352. {
  353. if( yYieldLast > rectDraw.bottom || yYieldLast < rectDraw.top
  354. || yYieldNow > rectDraw.bottom || yYieldNow < rectDraw.top )
  355. continue;
  356. if( yStoreLast > rectDraw.bottom || yStoreLast < rectDraw.top
  357. || yStoreNow > rectDraw.bottom || yStoreNow < rectDraw.top )
  358. continue;
  359. CPen penLocal1( PS_SOLID, 1, clrLine1 );
  360. CPen * pOldPen = pDC->SelectObject( &penLocal1 );
  361. pDC->MoveTo( xMedium-m_nStepWeight, yYieldLast );
  362. pDC->LineTo( xMedium, yYieldNow );
  363. CPen penLocal2( PS_SOLID, 1, clrLine2 );
  364. pDC->SelectObject( &penLocal2 );
  365. pDC->MoveTo( xMedium-m_nStepWeight, yStoreLast );
  366. pDC->LineTo( xMedium, yStoreNow );
  367. pDC->SelectObject( pOldPen );
  368. }
  369. yYieldLast = yYieldNow;
  370. yStoreLast = yStoreNow;
  371. bHasLast = TRUE;
  372. if( k > 0 ) // Draw Date
  373. {
  374. CSPTime tmLast(m_AssetSerial.ElementAt(k-1).time);
  375. CSPTime tmNow(serial.time);
  376. CString strText;
  377. if( tmLast.GetYear() != tmNow.GetYear()
  378. || tmLast.GetMonth() != tmNow.GetMonth() )
  379. strText = tmNow.Format( "%y/%m/%d" );
  380. if( strText.GetLength() > 0 && xDateLast < xMedium && xMedium+pDC->GetTextExtent(strText).cx < rectDraw.right )
  381. {
  382. pDC->TextOut( xMedium+2, rectDraw.bottom+1, strText );
  383. xDateLast = xMedium+2 + pDC->GetTextExtent(strText).cx;
  384. CPen penLocal( PS_SOLID, 1, clrBorder );
  385. CPen * pOldPen = pDC->SelectObject( &penLocal );
  386. pDC->MoveTo( xMedium, rectDraw.bottom );
  387. pDC->LineTo( xMedium, rectDraw.bottom+13 );
  388. pDC->SelectObject( pOldPen );
  389. }
  390. }
  391. }
  392. // Draw Text
  393. pDC->SetBkColor( clrBK );
  394. AfxSelectDCFont( pDC, 14 );
  395. CString strText;
  396. strText.LoadString( IDS_SIMUREPORT_YIELDLINE );
  397. pDC->SetTextColor( clrLine1 );
  398. pDC->TextOut( rectDraw.left+rectDraw.Width()/10, rectDraw.bottom+17, strText );
  399. strText.LoadString( IDS_SIMUREPORT_STORELINE );
  400. pDC->SetTextColor( clrLine2 );
  401. pDC->TextOut( rectDraw.left+6*rectDraw.Width()/10, rectDraw.bottom+17, strText );
  402. pDC->SelectObject( pOldFont );
  403. return TRUE;
  404. }
  405. /***
  406. 准备数据
  407. */
  408. BOOL CCurveButton::PrepareDrawData(CRect rectClient, int nStart, int nWeight,
  409.    LPRECT prectDraw, int *pnStartNew, int *pnCount, double *pdMin, double *pdMax )
  410. {
  411. // RectDraw
  412. CRect rectDraw( rectClient.left+SRC_LEFTMARGIN, rectClient.top+SRC_TOPMARGIN, 
  413. rectClient.right-SRC_RIGHTMARGIN, rectClient.bottom-SRC_BOTTOMMARGIN );
  414. int nStartNew = nStart, nCount = 0;
  415. double dMin = 0, dMax = 0;
  416. // Start
  417. if( nWeight <= 0 || m_AssetSerial.GetSize() <= 0 )
  418. return FALSE;
  419. nCount = rectDraw.Width() / nWeight;
  420. if( nStartNew >= m_AssetSerial.GetSize() || nStartNew < 0 )
  421. nStartNew = -1;
  422. if( -1 == nStartNew )
  423. {
  424. nStartNew = m_AssetSerial.GetSize()-nCount;
  425. if( nStartNew < 0 )
  426. nStartNew = 0;
  427. }
  428. if( nStartNew+nCount-1 >= m_AssetSerial.GetSize() )
  429. nCount = m_AssetSerial.GetSize() - nStartNew;
  430. if( nStartNew < 0 || nStartNew >= m_AssetSerial.GetSize() )
  431. return FALSE;
  432. // MinMax
  433. for( int i=0; i<m_AssetSerial.GetSize(); i++ )
  434. {
  435. if( m_AssetSerial.ElementAt(i).dAsset > dMax )
  436. dMax = m_AssetSerial.ElementAt(i).dAsset;
  437. }
  438. if( m_dStartAmount < 1e-4 )
  439. return FALSE;
  440. dMax = dMax / m_dStartAmount;
  441. if( prectDraw ) *prectDraw = rectDraw;
  442. if( pnStartNew )*pnStartNew = nStartNew;
  443. if( pnCount ) *pnCount = nCount;
  444. if( pdMin ) *pdMin = dMin;
  445. if( pdMax ) *pdMax = dMax;
  446. return TRUE;
  447. }
  448. void CCurveButton::ResetScrollBars()
  449. {
  450. if ( !::IsWindow(GetSafeHwnd()) )
  451. return;
  452. ASSERT( m_nStepWeight > 0 );
  453. if( m_nStepWeight <= 0 )
  454. return;
  455. CRect rectClient;
  456. GetClientRect( &rectClient );
  457. int nCountPerPage = (rectClient.Width()-SRC_LEFTMARGIN-SRC_RIGHTMARGIN)/m_nStepWeight;
  458. SCROLLINFO si;
  459. si.cbSize = sizeof(SCROLLINFO);
  460. si.fMask  = SIF_PAGE;
  461. si.nPage  = nCountPerPage;
  462. FlatSB_SetScrollInfo(GetSafeHwnd(),SB_HORZ, &si, FALSE); 
  463. m_nHScrollMax = 0;
  464. if( nCountPerPage < m_AssetSerial.GetSize() )
  465. m_nHScrollMax = m_AssetSerial.GetSize()-1;
  466. ASSERT( m_nHScrollMax < INT_MAX );
  467. ASSERT( m_nHScrollMax < SHRT_MAX );
  468. FlatSB_SetScrollRange(GetSafeHwnd(),SB_HORZ, 0, m_nHScrollMax, TRUE);
  469. }
  470. int CCurveButton::GetScrollPos32(int nBar, BOOL bGetTrackPos /* = FALSE */)
  471. {
  472. SCROLLINFO si;
  473. si.cbSize = sizeof(SCROLLINFO);
  474. if (bGetTrackPos)
  475. {
  476. si.fMask = SIF_TRACKPOS;
  477. if (FlatSB_GetScrollInfo(GetSafeHwnd(),nBar, &si))
  478. return si.nTrackPos;
  479. }
  480. else 
  481. {
  482. si.fMask = SIF_POS;
  483. if (FlatSB_GetScrollInfo(GetSafeHwnd(),nBar, &si))
  484. return si.nPos;
  485. }
  486. return 0;
  487. }
  488. BOOL CCurveButton::SetScrollPos32(int nBar, int nPos, BOOL bRedraw /* = TRUE */)
  489. {
  490. SCROLLINFO si;
  491. si.cbSize = sizeof(SCROLLINFO);
  492. si.fMask  = SIF_POS;
  493. si.nPos   = nPos;
  494. return FlatSB_SetScrollInfo(GetSafeHwnd(),nBar, &si, bRedraw);
  495. }
  496. int CCurveButton::GetScrollPage( int nBar )
  497. {
  498. SCROLLINFO si;
  499. si.cbSize = sizeof(SCROLLINFO);
  500. si.fMask  = SIF_PAGE;
  501. if( FlatSB_GetScrollInfo(GetSafeHwnd(), nBar, &si ) )
  502. return si.nPage;
  503. return 10;
  504. }
  505. /***
  506. 响应垂直滚动条消息
  507. */
  508. void CCurveButton::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  509. {
  510. int scrollPos = GetScrollPos32(SB_HORZ);
  511. switch (nSBCode)
  512. {
  513. case SB_LINERIGHT:
  514. if( scrollPos < m_nHScrollMax )
  515. {
  516. SetScrollPos32(SB_HORZ, scrollPos + 1);
  517. if( GetScrollPos32(SB_HORZ) != scrollPos )
  518. Invalidate( );
  519. }
  520. break;
  521. case SB_LINELEFT:
  522. if( scrollPos > 0 )
  523. {
  524. SetScrollPos32(SB_HORZ, max(0,scrollPos - 1));
  525. Invalidate( );
  526. }
  527. break;
  528. case SB_PAGERIGHT:
  529. if( scrollPos < m_nHScrollMax )
  530. {
  531. int pos = min(m_nHScrollMax, scrollPos + GetScrollPage(SB_HORZ));
  532. SetScrollPos32( SB_HORZ, pos);
  533. Invalidate( );
  534. }
  535. break;
  536. case SB_PAGELEFT:
  537. if (scrollPos > 0)
  538. {
  539. int pos = max(0, scrollPos - GetScrollPage(SB_HORZ));
  540. SetScrollPos32(SB_HORZ, pos);
  541. Invalidate( );
  542. }
  543. break;
  544. case SB_THUMBPOSITION:
  545. case SB_THUMBTRACK:
  546. {
  547. SetScrollPos32(SB_HORZ, GetScrollPos32(SB_HORZ, TRUE));
  548. Invalidate( );
  549. }
  550. break;
  551. case SB_LEFT:
  552. if (scrollPos > 0)
  553. {
  554. SetScrollPos32(SB_HORZ, 0);
  555. Invalidate();
  556. }
  557. break;
  558. case SB_RIGHT:
  559. if (scrollPos < m_nHScrollMax)
  560. {
  561. SetScrollPos32(SB_HORZ, m_nHScrollMax);
  562. Invalidate();
  563. }
  564. break;
  565. default: break;
  566. }
  567. }
  568. /////////////////////////////////////////////////////////////////////////////
  569. // CSimuReport
  570. CSimuReport::CSimuReport(CWnd* pParent /*=NULL*/)
  571. : CDialog(CSimuReport::IDD, pParent)
  572. {
  573. //{{AFX_DATA_INIT(CSimuReport)
  574. //}}AFX_DATA_INIT
  575. m_pStrategy = NULL;
  576. //SetTransparent( FALSE );
  577. }
  578. CSimuReport::~CSimuReport()
  579. {
  580. }
  581. void CSimuReport::SetStrategy( CStrategy * pStrategy )
  582. {
  583. m_pStrategy = pStrategy;
  584. }
  585. /***
  586. 设定策略模拟报表统计数据
  587. */
  588. BOOL CSimuReport::SetResults( )
  589. {
  590. if( NULL == m_pStrategy )
  591. return FALSE;
  592. CString strBuyTimes, strVictoryTimes, strYieldMax, strYieldMin, strYieldFin, strYieldIndex, strYieldStdDev, strXiapu;
  593. int nTimes = 0, nVictoryTimes = 0;
  594. double dYieldMax = 0, dYieldMin = 0;
  595. COpRecordContainer & container = m_pStrategy->SimuGetOpRecord();
  596. container.StatResults( &nTimes, &nVictoryTimes, &dYieldMax, &dYieldMin );
  597. strBuyTimes.Format( "%u", nTimes );
  598. m_editBuyTimes.SetWindowText( strBuyTimes );
  599. strVictoryTimes.Format( "%u", nVictoryTimes );
  600. m_editVictoryTimes.SetWindowText( strVictoryTimes );
  601. strYieldMax.Format( "%.2f%%", dYieldMax*100 );
  602. m_editYieldMax.SetWindowText( strYieldMax );
  603. strYieldMin.Format( "%.2f%%", dYieldMin*100 );
  604. m_editYieldMin.SetWindowText( strYieldMin );
  605. strYieldFin.Format( "%.2f%%", m_pStrategy->SimuGetCurrentYieldPercent()*100 );
  606. m_editYieldFin.SetWindowText( strYieldFin );
  607. strYieldIndex.Format( "%.2f%%", m_pStrategy->SimuGetCurrentYieldIndexPercent()*100 );
  608. m_editYieldIndex.SetWindowText( strYieldIndex );
  609. double dStdDev = 0, dXiapu = 0;
  610. CAssetSerialContainer & assetserial = m_pStrategy->SimuGetAssetSerial();
  611. if( assetserial.GetStdDev( &dStdDev, &dXiapu ) )
  612. {
  613. strYieldStdDev.Format( "%.2f%%", dStdDev*100 );
  614. strXiapu.Format( "%.2f%%", dXiapu*100 );
  615. }
  616. m_editYieldStdDev.SetWindowText( strYieldStdDev );
  617. m_editXiapu.SetWindowText( strXiapu );
  618. return TRUE;
  619. }
  620. void CSimuReport::DoDataExchange(CDataExchange* pDX)
  621. {
  622. CDialog::DoDataExchange(pDX);
  623. //{{AFX_DATA_MAP(CSimuReport)
  624. DDX_Control(pDX, IDOK, m_btnOK);
  625. DDX_Control(pDX, IDC_XIAPU, m_editXiapu);
  626. DDX_Control(pDX, IDC_YIELDSTDDEV, m_editYieldStdDev);
  627. DDX_Control(pDX, IDC_STATICEXPLAIN, m_staticExplain);
  628. DDX_Control(pDX, IDC_CURVE, m_curve);
  629. DDX_Control(pDX, IDC_COPY, m_btnCopy);
  630. DDX_Control(pDX, IDC_YIELDINDEX, m_editYieldIndex);
  631. DDX_Control(pDX, IDC_YIELDFIN, m_editYieldFin);
  632. DDX_Control(pDX, IDC_YIELDMIN, m_editYieldMin);
  633. DDX_Control(pDX, IDC_YIELDMAX, m_editYieldMax);
  634. DDX_Control(pDX, IDC_VICTORYTIMES, m_editVictoryTimes);
  635. DDX_Control(pDX, IDC_BUYTIMES, m_editBuyTimes);
  636. DDX_Control(pDX, IDC_OPRECORD, m_listOpRecord);
  637. DDX_Control(pDX, IDC_STOCKOWN, m_listStockOwn);
  638. DDX_Control(pDX, IDC_TABCTRL, m_tabctrl);
  639. //}}AFX_DATA_MAP
  640. }
  641. BEGIN_MESSAGE_MAP(CSimuReport, CDialog)
  642. //{{AFX_MSG_MAP(CSimuReport)
  643. ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL, OnSelchangeTabctrl)
  644. ON_BN_CLICKED(IDC_COPY, OnCopy)
  645. //}}AFX_MSG_MAP
  646. END_MESSAGE_MAP()
  647. /////////////////////////////////////////////////////////////////////////////
  648. // CSimuReport message handlers
  649. BOOL CSimuReport::OnInitDialog()
  650. {
  651. CDialog::OnInitDialog();
  652. // TODO: Add extra initialization here
  653. ASSERT( m_pStrategy );
  654. // Set Attr
  655. CString strItem;
  656. strItem.LoadString( IDS_SIMUREPORT_OPRECORD );
  657. m_tabctrl.InsertItem( 0, strItem );
  658. strItem.LoadString( IDS_SIMUREPORT_CURVE );
  659. m_tabctrl.InsertItem( 1, strItem );
  660. strItem.LoadString( IDS_SIMUREPORT_STOCKOWN );
  661. m_tabctrl.InsertItem( 2, strItem );
  662. // Init
  663. m_listOpRecord.InitOpRecordList( );
  664. m_listStockOwn.InitStockOwnList( );
  665. m_listOpRecord.LoadOpRecordList( m_pStrategy->SimuGetOpRecord() );
  666. m_listStockOwn.LoadStockOwnList( m_pStrategy->SimuGetStockOwn(), m_pStrategy->SimuGetCurrentCash(), m_pStrategy->SimuGetCurrentTime().GetTime(),
  667. m_pStrategy->SimuGetAsset(m_pStrategy->SimuGetCurrentTime()), m_pStrategy->GetTechStockContainer() );
  668. SetResults( );
  669. // Curve Init
  670. m_curve.SetAssetSerial( m_pStrategy->SimuGetAssetSerial(), m_pStrategy->GetOpParam().m_nStartAmount );
  671. m_curve.Initialize( );
  672. // Tab Show
  673. m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  674. m_curve.ShowWindow( SW_HIDE );
  675. m_listStockOwn.ShowWindow( SW_HIDE );
  676. m_btnCopy.EnableWindow( TRUE );
  677. CString strExplain;
  678. m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  679. strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
  680. m_staticExplain.SetWindowText( strExplain );
  681. UpdateData( FALSE );
  682. return TRUE;  // return TRUE unless you set the focus to a control
  683.               // EXCEPTION: OCX Property Pages should return FALSE
  684. }
  685. void CSimuReport::OnSelchangeTabctrl(NMHDR* pNMHDR, LRESULT* pResult) 
  686. {
  687. // TODO: Add your control notification handler code here
  688. int nCurSel = m_tabctrl.GetCurSel();
  689. CString strExplain;
  690. switch( nCurSel )
  691. {
  692. case 0:
  693. m_listOpRecord.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  694. m_curve.ShowWindow( SW_HIDE );
  695. m_listStockOwn.ShowWindow( SW_HIDE );
  696. m_btnCopy.EnableWindow( TRUE );
  697. m_staticExplain.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  698. strExplain.LoadString( IDS_SIMUREALOP_EXPLAINOPRECORD );
  699. m_staticExplain.SetWindowText( strExplain );
  700. break;
  701. case 1:
  702. m_listOpRecord.ShowWindow( SW_HIDE );
  703. m_curve.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  704. m_listStockOwn.ShowWindow( SW_HIDE );
  705. m_btnCopy.EnableWindow( FALSE );
  706. m_staticExplain.ShowWindow( SW_HIDE );
  707. break;
  708. case 2:
  709. m_listOpRecord.ShowWindow( SW_HIDE );
  710. m_curve.ShowWindow( SW_HIDE );
  711. m_listStockOwn.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
  712. m_btnCopy.EnableWindow( TRUE );
  713. m_staticExplain.ShowWindow( SW_HIDE );
  714. break;
  715. default:
  716. ASSERT( FALSE );
  717. break;
  718. }
  719. *pResult = 0;
  720. }
  721. void CSimuReport::OnCopy() 
  722. {
  723. if( m_listOpRecord.IsWindowVisible() )
  724. {
  725. m_listOpRecord.Copy( );
  726. }
  727. else if( m_listStockOwn.IsWindowVisible() )
  728. {
  729. m_listStockOwn.Copy( );
  730. }
  731. }