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

金融证券系统

开发平台:

Visual C++

  1. // SListCombos.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SListCombos.h"
  5. #include "DialogCacheLoadDlg.h"
  6. /////////////////////////////////////////////////////////////////////////////
  7. // CSearchBox
  8. #define SEARCHBOX_SIGNBIT_STT 0x80000000 // 技术指标项
  9. #define SEARCHBOX_SIGNBIT_ACCE 0x40000000 // 快捷键项
  10. CSearchBox::CSearchBox()
  11. {
  12. m_hwndLastFocus = NULL;
  13. m_bSegmentEnd = FALSE;
  14. m_bShowOnSel = TRUE;
  15. m_bDoNothing = FALSE;
  16. m_bAutoHide = FALSE;
  17. }
  18. CSearchBox::~CSearchBox()
  19. {
  20. }
  21. void CSearchBox::SetAutoHide( BOOL bAutoHide )
  22. {
  23. m_bAutoHide = bAutoHide;
  24. }
  25. BOOL CSearchBox::InitStocks( BOOL bHasSTTTech, BOOL bShowOnSel, BOOL bDuplicate )
  26. {
  27. ResetContent( );
  28. m_bShowOnSel = bShowOnSel;
  29. CStockContainer & container = AfxGetStockContainer();
  30. InitStorage( bDuplicate ? container.GetSize()*2 : container.GetSize(), 32 );
  31. for( int i=0; i<container.GetSize(); i++ )
  32. {
  33. CStockInfo & info = container.ElementAt(i);
  34. if( !info.IsValidStock() )
  35. continue;
  36. CString strTemp = info.GetStockCode();
  37. while( strTemp.GetLength() < 8 )
  38. strTemp += ' ';
  39. strTemp += info.GetStockName();
  40. int nItem = AddString( strTemp );
  41. SetItemData( nItem, i );
  42. if( bDuplicate )
  43. {
  44. strTemp = info.GetStockShortName();
  45. while( strTemp.GetLength() < 8 )
  46. strTemp += ' ';
  47. strTemp += info.GetStockName();
  48. if( CB_ERR == SelectString( 0, strTemp ) )
  49. {
  50. nItem = AddString( strTemp );
  51. SetItemData( nItem, i );
  52. }
  53. }
  54. }
  55. if( bHasSTTTech )
  56. {
  57. // 技术指标项
  58. UINT nTechUserCount = CTechUser::GetTechUserCount();
  59. for( UINT i=STT_MIN; i <= STT_MAX+nTechUserCount; i ++ )
  60. {
  61. UINT nTech = i;
  62. if( nTech > STT_MAX )
  63. nTech = i-STT_MAX-1+STT_USER_MIN;
  64. CString strTemp = AfxGetSTTShortName( nTech );
  65. while( strTemp.GetLength() < 8 )
  66. strTemp += ' ';
  67. strTemp += AfxGetSTTName( nTech );
  68. int nItem = AddString( strTemp );
  69. SetItemData( nItem, nTech | SEARCHBOX_SIGNBIT_STT );
  70. }
  71. // 快捷键项
  72. for( i = ACCE_MIN; i <= ACCE_MAX; i++ )
  73. {
  74. CString strTemp = AfxGetAccelerator( i, 8 );
  75. SetItemData( AddString(strTemp), i | SEARCHBOX_SIGNBIT_ACCE );
  76. }
  77. }
  78. return TRUE;
  79. }
  80. BOOL CSearchBox::InitStocks( CSPStringArray & astocks, BOOL bHasSTTTech, BOOL bShowOnSel, BOOL bDuplicate )
  81. {
  82. ResetContent( );
  83. m_bShowOnSel = bShowOnSel;
  84. CStockContainer & container = AfxGetStockContainer();
  85. InitStorage( bDuplicate ? astocks.GetSize()*2 : astocks.GetSize(), 32 );
  86. for( int i=0; i<astocks.GetSize(); i++ )
  87. {
  88. if( astocks.ElementAt(i).GetLength() <= 0 )
  89. continue;
  90. CStockInfo info;
  91. int nAID = -1;
  92. if( !container.GetStockInfo( astocks.ElementAt(i), &info, &nAID ) )
  93. continue;
  94. CString strTemp = info.GetStockCode();
  95. while( strTemp.GetLength() < 8 )
  96. strTemp += ' ';
  97. strTemp += info.GetStockName();
  98. int nItem = AddString( strTemp );
  99. SetItemData( nItem, nAID );
  100. if( bDuplicate )
  101. {
  102. strTemp = info.GetStockShortName();
  103. while( strTemp.GetLength() < 8 )
  104. strTemp += ' ';
  105. strTemp += info.GetStockName();
  106. if( CB_ERR == SelectString( 0, strTemp ) )
  107. {
  108. nItem = AddString( strTemp );
  109. SetItemData( nItem, nAID );
  110. }
  111. }
  112. }
  113. if( bHasSTTTech )
  114. {
  115. // 技术指标项
  116. UINT nTechUserCount = CTechUser::GetTechUserCount();
  117. for( UINT i=STT_MIN; i <= STT_MAX+nTechUserCount; i ++ )
  118. {
  119. UINT nTech = i;
  120. if( nTech > STT_MAX )
  121. nTech = i-STT_MAX-1+STT_USER_MIN;
  122. CString strTemp = AfxGetSTTShortName( nTech );
  123. while( strTemp.GetLength() < 8 )
  124. strTemp += ' ';
  125. strTemp += AfxGetSTTName( nTech );
  126. int nItem = AddString( strTemp );
  127. SetItemData( nItem, nTech | SEARCHBOX_SIGNBIT_STT );
  128. }
  129. // 快捷键项
  130. for( i = ACCE_MIN; i <= ACCE_MAX; i++ )
  131. {
  132. CString strTemp = AfxGetAccelerator( i, 8 );
  133. SetItemData( AddString(strTemp), i | SEARCHBOX_SIGNBIT_ACCE );
  134. }
  135. }
  136. return TRUE;
  137. }
  138. CString CSearchBox::GetSelectedStockCode( )
  139. {
  140. int nSel = GetCurSel();
  141. if( CB_ERR == nSel )
  142. return "";
  143. CStockContainer & container = AfxGetStockContainer();
  144. long dwData = GetItemData(nSel);
  145. if( dwData >= 0 && dwData < container.GetSize() )
  146. {
  147. return container.ElementAt(dwData).GetStockCode();
  148. }
  149. return "";
  150. }
  151. void CSearchBox::SetCurrentWindowText( )
  152. {
  153. if( !::IsWindow(m_hWnd) )
  154. return;
  155. if( !m_bShowOnSel )
  156. return;
  157. CStockInfo info;
  158. if( AfxGetProfile().GetCurrentStock( &info ) )
  159. {
  160. if( CB_ERR == SelectString( 0, info.GetStockCode() ) )
  161. SetWindowText( info.GetStockCode() );
  162. }
  163. else
  164. {
  165. SetWindowText( NULL );
  166. }
  167. }
  168. BOOL CSearchBox::IsWantChar( int nVirtKey )
  169. {
  170. return ( (nVirtKey >= '0' && nVirtKey <= '9')
  171. || (nVirtKey >= 'A' && nVirtKey <= 'Z')
  172. || (nVirtKey >= VK_NUMPAD0 && nVirtKey <= VK_NUMPAD9) );
  173. }
  174. char VirtKeyToChar( int nVirtKey )
  175. {
  176. if( nVirtKey >= VK_NUMPAD0 && nVirtKey <= VK_NUMPAD9 )
  177. {
  178. return (char)(nVirtKey - VK_NUMPAD0 + '0');
  179. }
  180. return (char)nVirtKey;
  181. }
  182. void CSearchBox::OnChangeStatus( int nVirtKey, long lParam, BOOL bFocused )
  183. {
  184. CString strText;
  185. GetWindowText( strText );
  186. int nCurSel = GetCurSel();
  187. /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
  188. /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
  189. if( IsWantChar( nVirtKey ) && !IsCTRLpressed() ) // Ctrl Key Not Pressed
  190. {
  191. if( !bFocused )
  192. m_hwndLastFocus = ::SetFocus( m_hWnd );
  193. if( m_bSegmentEnd )
  194. {
  195. strText = VirtKeyToChar( nVirtKey );
  196. m_bSegmentEnd = FALSE;
  197. SetWindowText( strText );
  198. SetEditSel( strText.GetLength(), strText.GetLength() );
  199. }
  200. else
  201. {
  202. DWORD dwEditSel = GetEditSel();
  203. if( CB_ERR != dwEditSel && LOWORD(dwEditSel) <= strText.GetLength() && HIWORD(dwEditSel) <= strText.GetLength() )
  204. {
  205. CString strTemp = strText.Left( LOWORD(dwEditSel) );
  206. strTemp += VirtKeyToChar( nVirtKey );
  207. strTemp += strText.Mid( HIWORD(dwEditSel) );
  208. strText = strTemp;
  209. SetWindowText( strText );
  210. SetEditSel( LOWORD(dwEditSel)+1, LOWORD(dwEditSel)+1 );
  211. }
  212. else
  213. {
  214. strText += VirtKeyToChar( nVirtKey );
  215. SetWindowText( strText );
  216. SetEditSel( strText.GetLength(), strText.GetLength() );
  217. }
  218. }
  219. OnEditchange( );
  220. }
  221. }
  222. BEGIN_MESSAGE_MAP(CSearchBox, CComboBox)
  223. //{{AFX_MSG_MAP(CSearchBox)
  224. ON_WM_CREATE()
  225. ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
  226. ON_CONTROL_REFLECT(CBN_EDITCHANGE, OnEditchange)
  227. ON_CONTROL_REFLECT(CBN_SELENDOK, OnSelendok)
  228. ON_CONTROL_REFLECT(CBN_SELENDCANCEL, OnSelendcancel)
  229. //}}AFX_MSG_MAP
  230. END_MESSAGE_MAP()
  231. /////////////////////////////////////////////////////////////////////////////
  232. // CSearchBox message handlers
  233. BOOL CSearchBox::PreTranslateMessage(MSG* pMsg)
  234. {
  235. if( pMsg->message == WM_KEYDOWN )
  236. {
  237. if( IsWantChar( pMsg->wParam ) )
  238. {
  239. OnChangeStatus( pMsg->wParam, pMsg->lParam, TRUE );
  240. return TRUE;
  241. }
  242. if( VK_RETURN == pMsg->wParam )
  243. {
  244. m_bDoNothing = TRUE;
  245. m_hwndLastFocus = NULL;
  246. m_bSegmentEnd = TRUE;
  247. CString strCommand;
  248. GetWindowText( strCommand );
  249. int nSel = SelectString( 0, strCommand );
  250. ShowDropDown( FALSE );
  251. SetCurSel( nSel );
  252. // Show Graph View
  253. if( CB_ERR != nSel && m_bShowOnSel )
  254. {
  255. DWORD dwData = GetItemData( nSel );
  256. CView * pView = AfxGetStaticDoc()->GetActiveView();
  257. if( dwData & SEARCHBOX_SIGNBIT_STT )
  258. AfxShowStockTech( dwData & ~SEARCHBOX_SIGNBIT_STT ); 
  259. else if( dwData & SEARCHBOX_SIGNBIT_ACCE )
  260. AfxExecuteAccelerator( dwData & ~SEARCHBOX_SIGNBIT_ACCE );
  261. else if( IsCTRLpressed() )
  262. AfxShowStockBase( dwData, FALSE );
  263. else if( pView && pView->IsKindOf( RUNTIME_CLASS(CRealTimeView) ) )
  264. AfxShowStockRealTime( dwData, FALSE );
  265. else
  266. AfxShowStockGraph( dwData, FALSE );
  267. }
  268. else if( CB_ERR == nSel && m_bShowOnSel )
  269. {
  270. AfxShowStockGraph( strCommand );
  271. }
  272. else
  273. SetCurrentWindowText( );
  274. m_bDoNothing = FALSE;
  275. if( m_bAutoHide )
  276. SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW );
  277. return TRUE;
  278. }
  279. else if( VK_ESCAPE == pMsg->wParam )
  280. {
  281. m_bDoNothing = TRUE;
  282. if( m_hwndLastFocus )
  283. ::SetFocus( m_hwndLastFocus );
  284. m_hwndLastFocus = NULL;
  285. m_bSegmentEnd = TRUE;
  286. CString strCommand;
  287. GetWindowText( strCommand );
  288. int nSel = SelectString( 0, strCommand );
  289. ShowDropDown( FALSE );
  290. SetCurSel( nSel );
  291. SetCurrentWindowText( );
  292. m_bDoNothing = FALSE;
  293. if( m_bAutoHide )
  294. SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW );
  295. return TRUE;
  296. }
  297. }
  298. return CComboBox::PreTranslateMessage(pMsg);
  299. }
  300. int CSearchBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  301. {
  302. if (CComboBox::OnCreate(lpCreateStruct) == -1)
  303. return -1;
  304. // TODO: Add your specialized creation code here
  305. // InitStocks( TRUE, TRUE, TRUE );
  306. return 0;
  307. }
  308. void CSearchBox::OnKillfocus( )
  309. {
  310. SetCurrentWindowText( );
  311. }
  312. void CSearchBox::OnEditchange() 
  313. {
  314. // TODO: Add your control notification handler code here
  315. DWORD dwEditSel = GetEditSel();
  316. CString strText;
  317. GetWindowText( strText );
  318. int nFind = FindString( 0, strText );
  319. SetCurSel( nFind );
  320. if( !GetDroppedState() )
  321. ShowDropDown( );
  322. SetWindowText( strText );
  323. SetEditSel( 0, -1 );
  324. SetEditSel( LOWORD(dwEditSel), HIWORD(dwEditSel) );
  325. }
  326. void CSearchBox::OnSelendok()
  327. {
  328. // TODO: Add your control notification handler code here
  329. if( m_bDoNothing )
  330. return;
  331. int nSel = GetCurSel();
  332. m_hwndLastFocus = NULL;
  333. m_bSegmentEnd = TRUE;
  334. if( CB_ERR != nSel )
  335. {
  336. SetCurSel( nSel );
  337. if( m_bShowOnSel )
  338. {
  339. DWORD dwData = GetItemData( nSel );
  340. CView * pView = AfxGetStaticDoc()->GetActiveView();
  341. if( dwData & SEARCHBOX_SIGNBIT_STT )
  342. AfxShowStockTech( dwData & ~SEARCHBOX_SIGNBIT_STT ); 
  343. else if( dwData & SEARCHBOX_SIGNBIT_ACCE )
  344. AfxExecuteAccelerator( dwData & ~SEARCHBOX_SIGNBIT_ACCE );
  345. else if( pView && pView->IsKindOf( RUNTIME_CLASS(CRealTimeView) ) )
  346. AfxShowStockRealTime( dwData, FALSE );
  347. else
  348. AfxShowStockGraph( dwData, FALSE );
  349. return;
  350. }
  351. }
  352. SetCurrentWindowText( );
  353. if( m_bAutoHide )
  354. SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW );
  355. }
  356. void CSearchBox::OnSelendcancel()
  357. {
  358. // TODO: Add your control notification handler code here
  359. if( m_bDoNothing )
  360. return;
  361. m_bDoNothing = TRUE;
  362. if( m_hwndLastFocus )
  363. ::SetFocus( m_hwndLastFocus );
  364. m_hwndLastFocus = NULL;
  365. m_bSegmentEnd = TRUE;
  366. CString strCommand;
  367. GetWindowText( strCommand );
  368. int nSel = SelectString( 0, strCommand );
  369. ShowDropDown( FALSE );
  370. SetCurSel( nSel );
  371. SetCurrentWindowText( );
  372. m_bDoNothing = FALSE;
  373. if( m_bAutoHide )
  374. SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_HIDEWINDOW );
  375. }