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

金融证券系统

开发平台:

Visual C++

  1. // MultiSort.cpp : implementation of the CMultiSort class
  2. //
  3. #include "stdafx.h"
  4. #include "MultiSort.h"
  5. #include "../Dialog/EditKDATADlg.h"
  6. #include <math.h>
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CMultiSort
  14. CMultiSort::CMultiSort( )
  15. {
  16. m_pParent = NULL;
  17. m_lMultiSortClass = CStock::typeshA;
  18. m_nSelectArea = areaNone;
  19. m_nSelectPos = -1;
  20. m_nRefreshMode = modeSort;
  21. }
  22. CMultiSort::~CMultiSort( )
  23. {
  24. }
  25. void CMultiSort::SetParent( CWnd * pParent )
  26. {
  27. m_pParent = pParent;
  28. }
  29. void CMultiSort::SetMultiSortClass( LONG type )
  30. {
  31. m_lMultiSortClass = type;
  32. if( modeDirect == m_nRefreshMode )
  33. {
  34. CStockInfo info;
  35. info.SetType( GetMultiSortClass( ) );
  36. AfxGetStkReceiver().RequestStockData( CStock::dataMultisort, &info, 1, 0, 0 );
  37. }
  38. else
  39. {
  40. RecalculateSortID( TRUE, TRUE );
  41. }
  42. }
  43. LONG CMultiSort::GetMultiSortClass( )
  44. {
  45. return m_lMultiSortClass;
  46. }
  47. BOOL CMultiSort::RecalculateSortID( BOOL bReloadMinute, BOOL bUpdateWindow )
  48. {
  49. BOOL bModified = FALSE;
  50. // 备份,以判断是否改变
  51. CSPDWordArray aRise, aFall, aDiff, aRiseMin5, aFallMin5, aVolRatio, aBSRatioAsc, aBSRatioDesc, aAmount;
  52. aRise.Copy( m_adwRise );
  53. aFall.Copy( m_adwFall );
  54. aDiff.Copy( m_adwDiff );
  55. aRiseMin5.Copy( m_adwRiseMin5 );
  56. aFallMin5.Copy( m_adwFallMin5 );
  57. aVolRatio.Copy( m_adwVolRatio );
  58. aBSRatioAsc.Copy( m_adwBSRatioAsc );
  59. aBSRatioDesc.Copy( m_adwBSRatioDesc );
  60. aAmount.Copy( m_adwAmount );
  61. BOOL bOK = TRUE;
  62. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwRise, m_lMultiSortClass, SLH_DIFFPERCENT, FALSE, 6 ) )
  63. bOK = FALSE;
  64. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwFall, m_lMultiSortClass, SLH_DIFFPERCENT, TRUE, 6 ) )
  65. bOK = FALSE;
  66. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwDiff, m_lMultiSortClass, SLH_SCOPE, FALSE, 6 ) )
  67. bOK = FALSE;
  68. if( bReloadMinute )
  69. {
  70. AfxRefreshStockContainerMinute( AfxGetStockContainer(), m_lMultiSortClass, 1000 );
  71. }
  72. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwRiseMin5, m_lMultiSortClass, SLH_DIFFPERCENT_MIN5, FALSE, 6 ) )
  73. bOK = FALSE;
  74. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwFallMin5, m_lMultiSortClass, SLH_DIFFPERCENT_MIN5, TRUE, 6 ) )
  75. bOK = FALSE;
  76. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwVolRatio, m_lMultiSortClass, SLH_RATIO_VOLUME, FALSE, 6 ) )
  77. bOK = FALSE;
  78. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwBSRatioAsc, m_lMultiSortClass, SLH_SELLBUYRATIO, FALSE, 6 ) )
  79. bOK = FALSE;
  80. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwBSRatioDesc, m_lMultiSortClass, SLH_SELLBUYRATIO, TRUE, 6 ) )
  81. bOK = FALSE;
  82. if( !AfxGetStockContainer().GetMultiSortIDArray( m_adwAmount, m_lMultiSortClass, SLH_AMOUNT, FALSE, 6 ) )
  83. bOK = FALSE;
  84. if( !bUpdateWindow )
  85. return TRUE;
  86. if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
  87. return TRUE;
  88. if( !aRise.IsEqualTo( m_adwRise ) )
  89. m_pParent->InvalidateRect( m_rectRise );
  90. if( !aFall.IsEqualTo( m_adwFall ) )
  91. m_pParent->InvalidateRect( m_rectFall );
  92. if( !aDiff.IsEqualTo( m_adwDiff ) )
  93. m_pParent->InvalidateRect( m_rectDiff );
  94. if( !aRiseMin5.IsEqualTo( m_adwRiseMin5 ) )
  95. m_pParent->InvalidateRect( m_rectRiseMin5 );
  96. if( !aFallMin5.IsEqualTo( m_adwFallMin5 ) )
  97. m_pParent->InvalidateRect( m_rectFallMin5 );
  98. if( !aVolRatio.IsEqualTo( m_adwVolRatio ) )
  99. m_pParent->InvalidateRect( m_rectVolRatio );
  100. if( !aBSRatioAsc.IsEqualTo( m_adwBSRatioAsc ) )
  101. m_pParent->InvalidateRect( m_rectBSRatioAsc );
  102. if( !aBSRatioDesc.IsEqualTo( m_adwBSRatioDesc ) )
  103. m_pParent->InvalidateRect( m_rectBSRatioDesc );
  104. if( !aAmount.IsEqualTo( m_adwAmount ) )
  105. m_pParent->InvalidateRect( m_rectAmount );
  106. return bModified;
  107. }
  108. BOOL CMultiSort::RecalculateSortID( PCOMMPACKET pPacket )
  109. {
  110. // 备份,以判断是否改变
  111. MULTISORT msRise, msFall, msDiff, msRiseMin5, msFallMin5, msVolRatio, msBSRatioAsc, msBSRatioDesc, msAmount;
  112. msRise = m_msRise;
  113. msFall = m_msFall;
  114. msDiff = m_msDiff;
  115. msRiseMin5 = m_msRiseMin5;
  116. msFallMin5 = m_msFallMin5;
  117. msVolRatio = m_msVolRatio;
  118. msBSRatioAsc = m_msBSRatioAsc;
  119. msBSRatioDesc = m_msBSRatioDesc;
  120. msAmount = m_msAmount;
  121. size_t i;
  122. for( i=0; i<pPacket->m_dwCount; i++ )
  123. {
  124. switch( pPacket->m_pMultisort[i].m_class )
  125. {
  126. case CStock::classRise:
  127. memcpy( &m_msRise, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  128. break;
  129. case CStock::classFall:
  130. memcpy( &m_msFall, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  131. break;
  132. case CStock::claddRiseMin5:
  133. memcpy( &m_msRiseMin5, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  134. break;
  135. case CStock::classFallMin5:
  136. memcpy( &m_msFallMin5, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  137. break;
  138. case CStock::classBSRatioAsc:
  139. memcpy( &m_msBSRatioAsc, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  140. break;
  141. case CStock::classBSRatioDesc:
  142. memcpy( &m_msBSRatioDesc, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  143. break;
  144. case CStock::classDiff:
  145. memcpy( &m_msDiff, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  146. break;
  147. case CStock::classVolRatio:
  148. memcpy( &m_msVolRatio, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  149. break;
  150. case CStock::classAmount:
  151. memcpy( &m_msAmount, &(pPacket->m_pMultisort[i]), sizeof(MULTISORT) );
  152. break;
  153. default:;
  154. }
  155. }
  156. if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
  157. return TRUE;
  158. if( 0 != memcmp(&msRise, &m_msRise,sizeof(MULTISORT)) )
  159. m_pParent->InvalidateRect( m_rectRise );
  160. if( 0 != memcmp(&msFall,&m_msFall,sizeof(MULTISORT)) )
  161. m_pParent->InvalidateRect( m_rectFall );
  162. if( 0 != memcmp(&msDiff,&m_msDiff,sizeof(MULTISORT)) )
  163. m_pParent->InvalidateRect( m_rectDiff );
  164. if( 0 != memcmp(&msRiseMin5,&m_msRiseMin5,sizeof(MULTISORT)) )
  165. m_pParent->InvalidateRect( m_rectRiseMin5 );
  166. if( 0 != memcmp(&msFallMin5,&m_msFallMin5,sizeof(MULTISORT)) )
  167. m_pParent->InvalidateRect( m_rectFallMin5 );
  168. if( 0 != memcmp(&msVolRatio,&m_msVolRatio,sizeof(MULTISORT)) )
  169. m_pParent->InvalidateRect( m_rectVolRatio );
  170. if( 0 != memcmp(&msBSRatioAsc,&m_msBSRatioAsc,sizeof(MULTISORT)) )
  171. m_pParent->InvalidateRect( m_rectBSRatioAsc );
  172. if( 0 != memcmp(&msBSRatioDesc,&m_msBSRatioDesc,sizeof(MULTISORT)) )
  173. m_pParent->InvalidateRect( m_rectBSRatioDesc );
  174. if( 0 != memcmp(&msAmount,&m_msAmount,sizeof(MULTISORT)) )
  175. m_pParent->InvalidateRect( m_rectAmount );
  176. return TRUE;
  177. }
  178. void CMultiSort::Redraw( CDC * pDC, CRect rectAll )
  179. {
  180. ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
  181. if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
  182. return;
  183. ResetClient( rectAll );
  184. CClientDC dc(m_pParent);
  185. if( NULL == pDC )
  186. pDC = &dc;
  187. DrawRise( pDC, m_rectRise );
  188. DrawFall( pDC, m_rectFall );
  189. DrawDiff( pDC, m_rectDiff );
  190. DrawRiseMin5( pDC, m_rectRiseMin5 );
  191. DrawFallMin5( pDC, m_rectFallMin5 );
  192. DrawVolRatio( pDC, m_rectVolRatio );
  193. DrawBSRatioAsc( pDC, m_rectBSRatioAsc );
  194. DrawBSRatioDesc( pDC, m_rectBSRatioDesc );
  195. DrawAmount( pDC, m_rectAmount );
  196. }
  197. LRESULT CMultiSort::OnStkReceiverData( WPARAM wParam, LPARAM lParam )
  198. {
  199. PCOMMPACKET pCommPacket = (PCOMMPACKET)lParam;
  200. switch( wParam )
  201. {
  202. case CStock::dataMultisort:
  203. m_nRefreshMode = modeDirect;
  204. RecalculateSortID( pCommPacket );
  205. break;
  206. }
  207. return 0L;
  208. }
  209. void CMultiSort::OnLButtonDown( UINT nFlags, CPoint point, BOOL bShiftPressed, BOOL bCtrlPressed )
  210. {
  211. DECLARE_COLOR_DEFINATION
  212. CClientDC dc(m_pParent);
  213. DrawSelection( &dc, m_nSelectArea, m_nSelectPos, clrBK );
  214. if( -1 != (m_nSelectPos=GetClickPos(m_rectRise,point)) )
  215. {
  216. m_nSelectArea = areaRise;
  217. }
  218. else if( -1 != (m_nSelectPos=GetClickPos(m_rectFall,point)) )
  219. {
  220. m_nSelectArea = areaFall;
  221. }
  222. else if( -1 != (m_nSelectPos=GetClickPos(m_rectDiff,point)) )
  223. {
  224. m_nSelectArea = areaDiff;
  225. }
  226. else if( -1 != (m_nSelectPos=GetClickPos(m_rectRiseMin5,point)) )
  227. {
  228. m_nSelectArea = areaRiseMin5;
  229. }
  230. else if( -1 != (m_nSelectPos=GetClickPos(m_rectFallMin5,point)) )
  231. {
  232. m_nSelectArea = areaFallMin5;
  233. }
  234. else if( -1 != (m_nSelectPos=GetClickPos(m_rectVolRatio,point)) )
  235. {
  236. m_nSelectArea = areaVolRatio;
  237. }
  238. else if( -1 != (m_nSelectPos=GetClickPos(m_rectBSRatioAsc,point)) )
  239. {
  240. m_nSelectArea = areaBSRatioAsc;
  241. }
  242. else if( -1 != (m_nSelectPos=GetClickPos(m_rectBSRatioDesc,point)) )
  243. {
  244. m_nSelectArea = areaBSRatioDesc;
  245. }
  246. else if( -1 != (m_nSelectPos=GetClickPos(m_rectAmount,point)) )
  247. {
  248. m_nSelectArea = areaAmount;
  249. }
  250. DrawSelection( &dc, m_nSelectArea, m_nSelectPos, clrBorder );
  251. }
  252. void CMultiSort::OnLButtonDblClk( UINT nFlags, CPoint point )
  253. {
  254. OnLButtonDown( nFlags, point, FALSE, FALSE );
  255. if( m_nSelectPos < 0 )
  256. return;
  257. int nSelectID = -1;
  258. if( modeDirect == m_nRefreshMode )
  259. {
  260. int size = sizeof(m_msRise.m_stocks)/sizeof(m_msRise.m_stocks[0]);
  261. char buf_code[sizeof(m_msRise.m_stocks[0].m_code)+1];
  262. memset( buf_code, 0, sizeof(buf_code) );
  263. if( areaRise == m_nSelectArea && m_nSelectPos < size )
  264. memcpy( buf_code, m_msRise.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  265. else if( areaFall == m_nSelectArea && m_nSelectPos < size )
  266. memcpy( buf_code, m_msFall.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  267. else if( areaDiff == m_nSelectArea && m_nSelectPos < size )
  268. memcpy( buf_code, m_msDiff.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  269. else if( areaRiseMin5 == m_nSelectArea && m_nSelectPos < size )
  270. memcpy( buf_code, m_msRiseMin5.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  271. else if( areaFallMin5 == m_nSelectArea && m_nSelectPos < size )
  272. memcpy( buf_code, m_msFallMin5.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  273. else if( areaVolRatio == m_nSelectArea && m_nSelectPos < size )
  274. memcpy( buf_code, m_msVolRatio.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  275. else if( areaBSRatioAsc == m_nSelectArea && m_nSelectPos < size )
  276. memcpy( buf_code, m_msBSRatioAsc.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  277. else if( areaBSRatioDesc == m_nSelectArea && m_nSelectPos < size )
  278. memcpy( buf_code, m_msBSRatioDesc.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  279. else if( areaAmount == m_nSelectArea && m_nSelectPos < size )
  280. memcpy( buf_code, m_msAmount.m_stocks[m_nSelectPos].m_code, sizeof(m_msRise.m_stocks[0].m_code) );
  281. else
  282. return;
  283. if( strlen(buf_code) > 0 )
  284. AfxGetStockContainer().GetStockInfo( buf_code, NULL, &nSelectID );
  285. }
  286. else
  287. {
  288. if( areaRise == m_nSelectArea && m_nSelectPos < m_adwRise.GetSize() )
  289. nSelectID = m_adwRise[m_nSelectPos];
  290. else if( areaFall == m_nSelectArea && m_nSelectPos < m_adwFall.GetSize() )
  291. nSelectID = m_adwFall[m_nSelectPos];
  292. else if( areaDiff == m_nSelectArea && m_nSelectPos < m_adwDiff.GetSize() )
  293. nSelectID = m_adwDiff[m_nSelectPos];
  294. else if( areaRiseMin5 == m_nSelectArea && m_nSelectPos < m_adwRiseMin5.GetSize() )
  295. nSelectID = m_adwRiseMin5[m_nSelectPos];
  296. else if( areaFallMin5 == m_nSelectArea && m_nSelectPos < m_adwFallMin5.GetSize() )
  297. nSelectID = m_adwFallMin5[m_nSelectPos];
  298. else if( areaVolRatio == m_nSelectArea && m_nSelectPos < m_adwVolRatio.GetSize() )
  299. nSelectID = m_adwVolRatio[m_nSelectPos];
  300. else if( areaBSRatioAsc == m_nSelectArea && m_nSelectPos < m_adwBSRatioAsc.GetSize() )
  301. nSelectID = m_adwBSRatioAsc[m_nSelectPos];
  302. else if( areaBSRatioDesc == m_nSelectArea && m_nSelectPos < m_adwBSRatioDesc.GetSize() )
  303. nSelectID = m_adwBSRatioDesc[m_nSelectPos];
  304. else if( areaAmount == m_nSelectArea && m_nSelectPos < m_adwAmount.GetSize() )
  305. nSelectID = m_adwAmount[m_nSelectPos];
  306. else
  307. return;
  308. }
  309. // 选中股票
  310. if( nSelectID >= 0 && nSelectID < AfxGetStockContainer().GetSize() )
  311. {
  312. AfxShowStockRealTime( nSelectID, FALSE );
  313. }
  314. }
  315. void CMultiSort::ResetClient( CRect rectAll )
  316. {
  317. m_rectAll = rectAll;
  318. int x = m_rectAll.left;
  319. int y = m_rectAll.top;
  320. int width = m_rectAll.Width();
  321. int height = m_rectAll.Height();
  322. // 今日涨幅排名区域
  323. m_rectRise = CRect( x, y, x+width/3, y+height/3 );
  324. // 今日跌幅排名区域
  325. m_rectFall = CRect( x, y+height/3, x+width/3, y+2*height/3 );
  326. // 今日震幅排名区域
  327. m_rectDiff = CRect( x, y+2*height/3, x+width/3, m_rectAll.bottom );
  328. // 5分钟涨幅排名区域
  329. m_rectRiseMin5 = CRect( x+width/3, y, x+2*width/3, y+height/3 );
  330. // 5分钟跌幅排名区域
  331. m_rectFallMin5 = CRect( x+width/3, y+height/3, x+2*width/3, y+2*height/3 );
  332. // 5分钟震幅排名区域
  333. m_rectVolRatio = CRect( x+width/3, y+2*height/3, x+2*width/3, m_rectAll.bottom );
  334. // 今日委比前六名区域
  335. m_rectBSRatioAsc = CRect( x+2*width/3, y, m_rectAll.right, y+height/3 );
  336. // 今日委比后六名区域
  337. m_rectBSRatioDesc = CRect( x+2*width/3, y+height/3, m_rectAll.right, y+2*height/3 );
  338. // 今日总金额排名区域
  339. m_rectAmount = CRect( x+2*width/3, y+2*height/3, m_rectAll.right, m_rectAll.bottom );
  340. }
  341. int CMultiSort::GetClickPos( CRect rect, CPoint point )
  342. {
  343. if( !rect.PtInRect(point) )
  344. return -1;
  345. int y = rect.top+20;
  346. int yStep = (rect.Height()-23) / 6 ;
  347. if( yStep <= 0 )
  348. return -1;
  349. int nClickPos = -1;
  350. for( int nIndex=0; nIndex<6; nIndex ++ )
  351. {
  352. CRect rectElement = rect;
  353. rectElement.top = y + yStep * nIndex;
  354. rectElement.bottom = y + yStep * (nIndex+1);
  355. if( rectElement.PtInRect(point) )
  356. {
  357. nClickPos = nIndex;
  358. break;
  359. }
  360. }
  361. return nClickPos;
  362. }
  363. void CMultiSort::DrawSelection( CDC * pDC, int nSelectArea, int nSelectPos, COLORREF clr )
  364. {
  365. CRect rect(0,0,0,0);
  366. if( -1 == nSelectPos )
  367. return;
  368. if( areaRise == nSelectArea )
  369. rect = m_rectRise;
  370. else if( areaFall == nSelectArea )
  371. rect = m_rectFall;
  372. else if( areaDiff == nSelectArea )
  373. rect = m_rectDiff;
  374. else if( areaRiseMin5 == nSelectArea )
  375. rect = m_rectRiseMin5;
  376. else if( areaFallMin5 == nSelectArea )
  377. rect = m_rectFallMin5;
  378. else if( areaVolRatio == nSelectArea )
  379. rect = m_rectVolRatio;
  380. else if( areaBSRatioAsc == nSelectArea )
  381. rect = m_rectBSRatioAsc;
  382. else if( areaBSRatioDesc == nSelectArea )
  383. rect = m_rectBSRatioDesc;
  384. else if( areaAmount == nSelectArea )
  385. rect = m_rectAmount;
  386. else
  387. return;
  388. int y = rect.top+20;
  389. int yStep = (rect.Height()-23) / 6 ;
  390. if( yStep <= 0 )
  391. return;
  392. int ySel = y + yStep*nSelectPos + 16;
  393. if( ySel > rect.top && ySel < rect.bottom )
  394. DrawLine( pDC, 2, clr, rect.left+5, ySel, rect.right-5, ySel );
  395. }
  396. void DrawBorderAndTitle( CDC * pDC, CRect rect, LPCTSTR lpszTitle )
  397. {
  398. DECLARE_COLOR_DEFINATION
  399. // Draw Border
  400. CRect rectTitle = CRect( rect.left, rect.top, rect.right, rect.top+18 );
  401. pDC->Draw3dRect( &rect, clrBorder, clrBorder );
  402. pDC->Draw3dRect( &rectTitle, clrBorder, clrBorder );
  403. // Draw Title
  404. CFont * pOldFont = AfxSelectDCFont( pDC, 14 );
  405. pDC->SetBkColor( clrBK );
  406. pDC->SetTextColor( clrText );
  407. pDC->DrawText( lpszTitle, rectTitle, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
  408. pDC->SelectObject( pOldFont );
  409. }
  410. void CMultiSort::DrawMultiSort( CDC * pDC, CSPDWordArray &adwSortID, CRect rect, UINT nSLH, int nSelectPos )
  411. {
  412. DECLARE_COLOR_DEFINATION
  413. int x = rect.left+8;
  414. int x2 = (int)( rect.left+0.56*rect.Width() );
  415. int x3 = rect.right-8;
  416. int y = rect.top+20;
  417. int yStep = (rect.Height()-23) / 6 ;
  418. if( yStep <= 0 )
  419. return;
  420. CFont * pOldFont = AfxSelectDCFont( pDC, 14 );
  421. pDC->SetBkColor( clrBK );
  422. for( int i=0; i<adwSortID.GetSize(); i++ )
  423. {
  424. if( (int)adwSortID[i] < 0 || (int)adwSortID[i] >= AfxGetStockContainer().GetSize() )
  425. continue;
  426. CStockInfo & info = AfxGetStockContainer().ElementAt(adwSortID[i]);
  427. pDC->SetTextColor( clrText );
  428. //#ifdef CLKLAN_ENGLISH_US
  429. // pDC->TextOut( x, y, info.GetStockCode() );
  430. //#else
  431. pDC->TextOut( x, y, info.GetStockName() );
  432. //#endif
  433. UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
  434. pDC->SetTextColor( AfxGetVariantColor(SLH_CLOSE,info) );
  435. pDC->TextOut( x2, y, (LPCTSTR)AfxGetVariantDispString(SLH_CLOSE,info,NULL) );
  436. pDC->SetTextColor( AfxGetVariantColor(nSLH,info) );
  437. if( SLH_RATIO_VOLUME == nSLH )
  438. {
  439. double dVolRatio = 1;
  440. CSPTime tTrade;
  441. if( AfxGetVariantValue(nSLH,info,&dVolRatio,NULL)
  442. && tTrade.FromStockTimeDay( info.m_datetech ) )
  443. dVolRatio = dVolRatio / CSPTime::GetTimeTradeRatioOfOneDay( tTrade, CSPTime::GetCurrentTime() );
  444. CString strTemp;
  445. strTemp.Format( "%.2f", dVolRatio );
  446. pDC->TextOut( x3, y, strTemp );
  447. }
  448. else
  449. {
  450. pDC->TextOut( x3, y, (LPCTSTR)AfxGetVariantDispString(nSLH,info,NULL) );
  451. }
  452. y += yStep;
  453. pDC->SetTextAlign( nOldAlign );
  454. // 选中股票
  455. if( nSelectPos == i )
  456. {
  457. int ySel = y-yStep+16;
  458. if( ySel > rect.top && ySel < rect.bottom )
  459. DrawLine( pDC, 2, clrBorder, rect.left+5, ySel, rect.right-5, ySel );
  460. }
  461. }
  462. // 补足股票排名
  463. for( i=adwSortID.GetSize(); i<6; i++ )
  464. {
  465. pDC->SetTextColor( clrText );
  466. pDC->TextOut( x, y, "-" );
  467. UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
  468. pDC->TextOut( x2, y, "-" );
  469. pDC->TextOut( x3, y, "-" );
  470. y += yStep;
  471. pDC->SetTextAlign( nOldAlign );
  472. }
  473. pDC->SelectObject( pOldFont );
  474. }
  475. void CMultiSort::DrawMultiSort( CDC * pDC, MULTISORT &ms, CRect rect, UINT nSLH, int nSelectPos )
  476. {
  477. DECLARE_COLOR_DEFINATION
  478. int x = rect.left+8;
  479. int x2 = (int)( rect.left+0.56*rect.Width() );
  480. int x3 = rect.right-8;
  481. int y = rect.top+20;
  482. int yStep = (rect.Height()-23) / 6 ;
  483. if( yStep <= 0 )
  484. return;
  485. CFont * pOldFont = AfxSelectDCFont( pDC, 14 );
  486. pDC->SetBkColor( clrBK );
  487. int size = sizeof(m_msRise.m_stocks)/sizeof(m_msRise.m_stocks[0]);
  488. for( int i=0; i<size; i++ )
  489. {
  490. CStockInfo info;
  491. char buf_code[sizeof(ms.m_stocks[i].m_code)+1];
  492. memset( buf_code, 0, sizeof(buf_code) );
  493. memcpy( buf_code, ms.m_stocks[i].m_code, sizeof(ms.m_stocks[i].m_code) );
  494. if( !AfxGetStockContainer().GetStockInfo(buf_code, &info) )
  495. continue;
  496. info.m_fClose = float(0.001*ms.m_stocks[i].m_data1);
  497. pDC->SetTextColor( clrText );
  498. //#ifdef CLKLAN_ENGLISH_US
  499. // pDC->TextOut( x, y, info.GetStockCode() );
  500. //#else
  501. pDC->TextOut( x, y, info.GetStockName() );
  502. //#endif
  503. UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
  504. pDC->SetTextColor( AfxGetVariantColor(SLH_CLOSE,info) );
  505. pDC->TextOut( x2, y, (LPCTSTR)AfxGetVariantDispString(SLH_CLOSE,info,NULL) );
  506. CString strTemp;
  507. if( CStock::classVolRatio == ms.m_class )
  508. strTemp.Format( "%.2f", 0.01*ms.m_stocks[i].m_data2 );
  509. else if( CStock::classAmount == ms.m_class )
  510. strTemp.Format( "%.0f", 0.001*ms.m_stocks[i].m_data2 );
  511. else
  512. strTemp.Format( "%.2f%%", 0.01*ms.m_stocks[i].m_data2 );
  513. pDC->TextOut( x3, y, strTemp );
  514. y += yStep;
  515. pDC->SetTextAlign( nOldAlign );
  516. // 选中股票
  517. if( nSelectPos == i )
  518. {
  519. int ySel = y-yStep+16;
  520. if( ySel > rect.top && ySel < rect.bottom )
  521. DrawLine( pDC, 2, clrBorder, rect.left+5, ySel, rect.right-5, ySel );
  522. }
  523. }
  524. // 补足股票排名
  525. for( i=size; i<6; i++ )
  526. {
  527. pDC->SetTextColor( clrText );
  528. pDC->TextOut( x, y, "-" );
  529. UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
  530. pDC->TextOut( x2, y, "-" );
  531. pDC->TextOut( x3, y, "-" );
  532. y += yStep;
  533. pDC->SetTextAlign( nOldAlign );
  534. }
  535. pDC->SelectObject( pOldFont );
  536. }
  537. // 今日涨幅排名
  538. void CMultiSort::DrawRise( CDC * pDC, CRect rect )
  539. {
  540. CString strTitle;
  541. strTitle.LoadString( IDS_MULTISORT_RISE );
  542. DrawBorderAndTitle( pDC, rect, strTitle );
  543. if( modeDirect == m_nRefreshMode )
  544. DrawMultiSort( pDC, m_msRise, rect, SLH_DIFFPERCENT, areaRise == m_nSelectArea ? m_nSelectPos : -1 );
  545. else
  546. DrawMultiSort( pDC, m_adwRise, rect, SLH_DIFFPERCENT, areaRise == m_nSelectArea ? m_nSelectPos : -1 );
  547. }
  548. // 今日跌幅排名
  549. void CMultiSort::DrawFall( CDC * pDC, CRect rect )
  550. {
  551. CString strTitle;
  552. strTitle.LoadString( IDS_MULTISORT_FALL );
  553. DrawBorderAndTitle( pDC, rect, strTitle );
  554. if( modeDirect == m_nRefreshMode )
  555. DrawMultiSort( pDC, m_msFall, rect, SLH_DIFFPERCENT, areaFall == m_nSelectArea ? m_nSelectPos : -1 );
  556. else
  557. DrawMultiSort( pDC, m_adwFall, rect, SLH_DIFFPERCENT, areaFall == m_nSelectArea ? m_nSelectPos : -1 );
  558. }
  559. // 今日震幅排名
  560. void CMultiSort::DrawDiff( CDC * pDC, CRect rect )
  561. {
  562. CString strTitle;
  563. strTitle.LoadString( IDS_MULTISORT_DIFF );
  564. DrawBorderAndTitle( pDC, rect, strTitle );
  565. if( modeDirect == m_nRefreshMode )
  566. DrawMultiSort( pDC, m_msDiff, rect, SLH_SCOPE, areaDiff == m_nSelectArea ? m_nSelectPos : -1 );
  567. else
  568. DrawMultiSort( pDC, m_adwDiff, rect, SLH_SCOPE, areaDiff == m_nSelectArea ? m_nSelectPos : -1 );
  569. }
  570. // 5分钟涨幅排名
  571. void CMultiSort::DrawRiseMin5( CDC * pDC, CRect rect )
  572. {
  573. CString strTitle;
  574. strTitle.LoadString( IDS_MULTISORT_RISEMIN5 );
  575. DrawBorderAndTitle( pDC, rect, strTitle );
  576. if( modeDirect == m_nRefreshMode )
  577. DrawMultiSort( pDC, m_msRiseMin5, rect, SLH_DIFFPERCENT_MIN5, areaRiseMin5 == m_nSelectArea ? m_nSelectPos : -1 );
  578. else
  579. DrawMultiSort( pDC, m_adwRiseMin5, rect, SLH_DIFFPERCENT_MIN5, areaRiseMin5 == m_nSelectArea ? m_nSelectPos : -1 );
  580. }
  581. // 5分钟跌幅排名
  582. void CMultiSort::DrawFallMin5( CDC * pDC, CRect rect )
  583. {
  584. CString strTitle;
  585. strTitle.LoadString( IDS_MULTISORT_FALLMIN5 );
  586. DrawBorderAndTitle( pDC, rect, strTitle );
  587. if( modeDirect == m_nRefreshMode )
  588. DrawMultiSort( pDC, m_msFallMin5, rect, SLH_DIFFPERCENT_MIN5, areaFallMin5 == m_nSelectArea ? m_nSelectPos : -1 );
  589. else
  590. DrawMultiSort( pDC, m_adwFallMin5, rect, SLH_DIFFPERCENT_MIN5, areaFallMin5 == m_nSelectArea ? m_nSelectPos : -1 );
  591. }
  592. // 今日量比排名
  593. void CMultiSort::DrawVolRatio( CDC * pDC, CRect rect )
  594. {
  595. CString strTitle;
  596. strTitle.LoadString( IDS_MULTISORT_VOLRATIO );
  597. DrawBorderAndTitle( pDC, rect, strTitle );
  598. if( modeDirect == m_nRefreshMode )
  599. DrawMultiSort( pDC, m_msVolRatio, rect, SLH_RATIO_VOLUME, areaVolRatio == m_nSelectArea ? m_nSelectPos : -1 );
  600. else
  601. DrawMultiSort( pDC, m_adwVolRatio, rect, SLH_RATIO_VOLUME, areaVolRatio == m_nSelectArea ? m_nSelectPos : -1 );
  602. }
  603. // 今日委比前六名
  604. void CMultiSort::DrawBSRatioAsc( CDC * pDC, CRect rect )
  605. {
  606. CString strTitle;
  607. strTitle.LoadString( IDS_MULTISORT_BSRATIOASC );
  608. DrawBorderAndTitle( pDC, rect, strTitle );
  609. if( modeDirect == m_nRefreshMode )
  610. DrawMultiSort( pDC, m_msBSRatioAsc, rect, SLH_SELLBUYRATIO, areaBSRatioAsc == m_nSelectArea ? m_nSelectPos : -1 );
  611. else
  612. DrawMultiSort( pDC, m_adwBSRatioAsc, rect, SLH_SELLBUYRATIO, areaBSRatioAsc == m_nSelectArea ? m_nSelectPos : -1 );
  613. }
  614. // 今日委比后六名
  615. void CMultiSort::DrawBSRatioDesc( CDC * pDC, CRect rect )
  616. {
  617. CString strTitle;
  618. strTitle.LoadString( IDS_MULTISORT_BSRATIODESC );
  619. DrawBorderAndTitle( pDC, rect, strTitle );
  620. if( modeDirect == m_nRefreshMode )
  621. DrawMultiSort( pDC, m_msBSRatioDesc, rect, SLH_SELLBUYRATIO, areaBSRatioDesc == m_nSelectArea ? m_nSelectPos : -1 );
  622. else
  623. DrawMultiSort( pDC, m_adwBSRatioDesc, rect, SLH_SELLBUYRATIO, areaBSRatioDesc == m_nSelectArea ? m_nSelectPos : -1 );
  624. }
  625. // 今日总金额排名
  626. void CMultiSort::DrawAmount( CDC * pDC, CRect rect )
  627. {
  628. CString strTitle;
  629. strTitle.LoadString( IDS_MULTISORT_AMOUNT );
  630. DrawBorderAndTitle( pDC, rect, strTitle );
  631. if( modeDirect == m_nRefreshMode )
  632. DrawMultiSort( pDC, m_msAmount, rect, SLH_AMOUNT, areaAmount == m_nSelectArea ? m_nSelectPos : -1 );
  633. else
  634. DrawMultiSort( pDC, m_adwAmount, rect, SLH_AMOUNT, areaAmount == m_nSelectArea ? m_nSelectPos : -1 );
  635. }