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

金融证券系统

开发平台:

Visual C++

  1. // SetKDataDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SetKDataDlg.h"
  5. #include <io.h>
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSetKDataDlg dialog
  13. IMPLEMENT_DYNCREATE(CSetKDataDlg, CPropertyPageEx)
  14. CSetKDataDlg::CSetKDataDlg( )
  15. : CPropertyPageEx(CSetKDataDlg::IDD)
  16. {
  17. //{{AFX_DATA_INIT(CSetKDataDlg)
  18. m_tmDate = 0;
  19. m_strOpen = _T("");
  20. m_strHigh = _T("");
  21. m_strLow = _T("");
  22. m_strClose = _T("");
  23. m_dwVolume = 0;
  24. m_dwAmount = 0;
  25. //}}AFX_DATA_INIT
  26. m_tmDate = CSPTime::GetCurrentTime();
  27. }
  28. void CSetKDataDlg::EnableEdit( BOOL bEnable )
  29. {
  30. m_editOpen.EnableWindow( bEnable );
  31. m_editHigh.EnableWindow( bEnable );
  32. m_editLow.EnableWindow( bEnable );
  33. m_editClose.EnableWindow( bEnable );
  34. m_editVolume.EnableWindow( bEnable );
  35. m_editAmount.EnableWindow( bEnable );
  36. }
  37. void CSetKDataDlg::LoadKData( CString strStockCode )
  38. {
  39. if( strStockCode.GetLength() <= 0 )
  40. return;
  41. UpdateData();
  42. m_strOpen.Empty();
  43. m_strHigh.Empty();
  44. m_strLow.Empty();
  45. m_strClose.Empty();
  46. m_dwVolume = 0;
  47. m_dwAmount = 0;
  48. if( m_tmDate.GetTime() == -1 )
  49. {
  50. UpdateData( FALSE );
  51. return;
  52. }
  53. CStockInfo info;
  54. CStock stock;
  55. if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) )
  56. return;
  57. stock.SetStockInfo( &info );
  58. int nKType = m_comboKType.GetSelect();
  59. AfxPrepareStockData( &AfxGetDB(), stock, nKType,  CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE );
  60. CKData & kdata = stock.GetKData(nKType);
  61. // 价格小数位数格式串
  62. CString strPriceFmt;
  63. strPriceFmt.Format( "%%.%df", info.DigitBit() );
  64. CSPTime sptime = m_tmDate.GetTime();
  65. int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) );
  66. if( nIndex >= 0 && nIndex < kdata.GetSize() )
  67. {
  68. KDATA kd = kdata.ElementAt(nIndex);
  69. m_strOpen.Format( strPriceFmt, kd.m_fOpen );
  70. m_strHigh.Format( strPriceFmt, kd.m_fHigh );
  71. m_strLow.Format( strPriceFmt, kd.m_fLow );
  72. m_strClose.Format( strPriceFmt, kd.m_fClose );
  73. m_dwVolume = (DWORD)(kd.m_fVolume/100);
  74. m_dwAmount = (DWORD)(kd.m_fAmount/1000);
  75. }
  76. UpdateData( FALSE );
  77. }
  78. BOOL CSetKDataDlg::StoreKData( CString strStockCode )
  79. {
  80. if( strStockCode.GetLength() <= 0 )
  81. return FALSE;
  82. UpdateData( );
  83. if( m_tmDate.GetTime() == -1 )
  84. return FALSE;
  85. if( !IsNumber(m_strOpen,FALSE) || !IsNumber(m_strHigh,FALSE) || !IsNumber(m_strLow,FALSE)
  86. || !IsNumber(m_strClose,FALSE) )
  87. {
  88. AfxMessageBox( IDS_SETKDATA_NOTNUMBER );
  89. return FALSE;
  90. }
  91. DWORD dwMarket = CStock::marketUnknown;
  92. CStockInfo info;
  93. if( info.SetStockCode(dwMarket, strStockCode) )
  94. dwMarket = info.GetMarket();
  95. int nKType = m_comboKType.GetSelect();
  96. CSPTime sptime = m_tmDate.GetTime();
  97. KDATA kd;
  98. memset( &kd, 0, sizeof(kd) );
  99. kd.m_dwMarket = dwMarket;
  100. strncpy( kd.m_szCode, strStockCode, min(sizeof(kd.m_szCode)-1,strStockCode.GetLength()) );
  101. kd.m_time = m_tmDate.GetTime();
  102. kd.m_date = sptime.ToStockTime(CKData::IsDayOrMin(nKType));
  103. kd.m_fOpen = (float)atof(m_strOpen);
  104. kd.m_fHigh = (float)atof(m_strHigh);
  105. kd.m_fLow = (float)atof(m_strLow);
  106. kd.m_fClose = (float)atof(m_strClose);
  107. kd.m_fVolume = (float)m_dwVolume*100;
  108. kd.m_fAmount = (float)m_dwAmount*1000;
  109. CKData kdata(nKType);
  110. kdata.Add( kd );
  111. AfxGetDB().InstallKData( kdata );
  112. return TRUE;
  113. }
  114. BOOL CSetKDataDlg::DeleteKData( CString strStockCode )
  115. {
  116. if( strStockCode.GetLength() <= 0 )
  117. return FALSE;
  118. UpdateData( );
  119. if( m_tmDate.GetTime() == -1 )
  120. return FALSE;
  121. CStockInfo info;
  122. CStock stock;
  123. if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) )
  124. return FALSE;
  125. stock.SetStockInfo( &info );
  126. int nKType = m_comboKType.GetSelect();
  127. AfxPrepareStockData( &AfxGetDB(), stock, nKType,  CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE );
  128. CKData & kdata = stock.GetKData(nKType);
  129. CSPTime sptime = m_tmDate.GetTime();
  130. int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) );
  131. if( nIndex >= 0 && nIndex < kdata.GetSize() )
  132. {
  133. kdata.RemoveAt(nIndex);
  134. AfxGetDB().InstallKData( kdata, TRUE );
  135. return TRUE;
  136. }
  137. return FALSE;
  138. }
  139. void CSetKDataDlg::DoDataExchange(CDataExchange* pDX)
  140. {
  141. CPropertyPageEx::DoDataExchange(pDX);
  142. //{{AFX_DATA_MAP(CSetKDataDlg)
  143. DDX_Control(pDX, IDC_SAVE, m_btnSave);
  144. DDX_Control(pDX, IDC_DELETE, m_btnDelete);
  145. DDX_Control(pDX, IDC_KTYPE, m_comboKType);
  146. DDX_Control(pDX, IDC_AMOUNT, m_editAmount);
  147. DDX_Control(pDX, IDC_VOLUME, m_editVolume);
  148. DDX_Control(pDX, IDC_CLOSE, m_editClose);
  149. DDX_Control(pDX, IDC_LOW, m_editLow);
  150. DDX_Control(pDX, IDC_HIGH, m_editHigh);
  151. DDX_Control(pDX, IDC_OPEN, m_editOpen);
  152. DDX_Control(pDX, IDC_DATE, m_dtcDate);
  153. DDX_Control(pDX, IDC_EDITCODE, m_editCode);
  154. DDX_Control(pDX, IDC_STATICSTOCK, m_staticStock);
  155. DDX_Control(pDX, IDC_LIST_STOCKSRC, m_listStockSrc);
  156. DDX_Control(pDX, IDC_COMBO_GROUPSRC, m_comboGroupSrc);
  157. DDX_DateTimeCtrl(pDX, IDC_DATE, m_tmDate);
  158. DDX_Text(pDX, IDC_OPEN, m_strOpen);
  159. DDX_Text(pDX, IDC_HIGH, m_strHigh);
  160. DDX_Text(pDX, IDC_LOW, m_strLow);
  161. DDX_Text(pDX, IDC_CLOSE, m_strClose);
  162. DDX_Text(pDX, IDC_VOLUME, m_dwVolume);
  163. DDX_Text(pDX, IDC_AMOUNT, m_dwAmount);
  164. //}}AFX_DATA_MAP
  165. }
  166. BEGIN_MESSAGE_MAP(CSetKDataDlg, CPropertyPageEx)
  167. //{{AFX_MSG_MAP(CSetKDataDlg)
  168. ON_EN_CHANGE(IDC_EDITCODE, OnChangeEditcode)
  169. ON_CBN_SELCHANGE(IDC_COMBO_GROUPSRC, OnSelchangeComboGroupsrc)
  170. ON_LBN_SELCHANGE(IDC_LIST_STOCKSRC, OnSelchangeListStocksrc)
  171. ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE, OnDatetimechangeDate)
  172. ON_BN_CLICKED(IDC_SAVE, OnSave)
  173. ON_BN_CLICKED(IDC_DELETE, OnDelete)
  174. //}}AFX_MSG_MAP
  175. END_MESSAGE_MAP()
  176. /////////////////////////////////////////////////////////////////////////////
  177. // CSetKDataDlg message handlers
  178. BOOL CSetKDataDlg::OnInitDialog()
  179. {
  180. CPropertyPageEx::OnInitDialog();
  181. EnableEdit( FALSE );
  182. CWaitCursor waitcursor;
  183. // TODO: Add extra initialization here
  184. CDomainContainer & groups = AfxGetGroupContainer( );
  185. CDomainContainer & domains = AfxGetDomainContainer( );
  186. CStockContainer & container = AfxGetStockContainer();
  187. // Src
  188. m_comboGroupSrc.InitStrings( TRUE, TRUE, groups );
  189. m_comboGroupSrc.SetCurSel( 0 );
  190. OnSelchangeComboGroupsrc();
  191. OnSelchangeListStocksrc();
  192. m_comboKType.InitializeDayMin5();
  193. return TRUE;  // return TRUE unless you set the focus to a control
  194.               // EXCEPTION: OCX Property Pages should return FALSE
  195. }
  196. void CSetKDataDlg::OnChangeEditcode() 
  197. {
  198. // TODO: If this is a RICHEDIT control, the control will not
  199. // send this notification unless you override the CPropertyPageEx::OnInitDialog()
  200. // function and call CRichEditCtrl().SetEventMask()
  201. // with the ENM_CHANGE flag ORed into the mask.
  202. // TODO: Add your control notification handler code here
  203. CString strText;
  204. m_editCode.GetWindowText( strText );
  205. strText.TrimLeft();
  206. strText.TrimLeft();
  207. if( strText.GetLength() > 0 )
  208. {
  209. int nSel = m_comboGroupSrc.GetCurSel();
  210. if( CB_ERR == nSel ||
  211. CStockContainer::typeAll != (int)(m_comboGroupSrc.GetItemData( nSel )) )
  212. {
  213. m_comboGroupSrc.SelectGroupAll( );
  214. OnSelchangeComboGroupsrc();
  215. }
  216. }
  217. if( !m_listStockSrc.SelectCode( 0, strText ) )
  218. m_listStockSrc.SelectShortname( 0, strText );
  219. OnSelchangeListStocksrc( );
  220. }
  221. void CSetKDataDlg::OnSelchangeComboGroupsrc() 
  222. {
  223. // TODO: Add your control notification handler code here
  224. int nType = m_comboGroupSrc.GetCurSelType();
  225. CString strName = m_comboGroupSrc.GetCurSelName();
  226. m_listStockSrc.SetCurrentStocks( nType, strName, AfxGetGroupContainer() );
  227. }
  228. BOOL CSetKDataDlg::PreTranslateMessage(MSG* pMsg) 
  229. {
  230. // TODO: Add your specialized code here and/or call the base class
  231. if( WM_KEYDOWN == pMsg->message )
  232. {
  233. if( VK_UP == pMsg->wParam )
  234. {
  235. if( ::GetFocus() == m_editCode.GetSafeHwnd() )
  236. {
  237. m_listStockSrc.SelectUp( );
  238. OnSelchangeListStocksrc( );
  239. return TRUE;
  240. }
  241. }
  242. else if( VK_DOWN == pMsg->wParam )
  243. {
  244. if( ::GetFocus() == m_editCode.GetSafeHwnd() )
  245. {
  246. m_listStockSrc.SelectDown( );
  247. OnSelchangeListStocksrc( );
  248. return TRUE;
  249. }
  250. }
  251. else if( VK_PRIOR == pMsg->wParam )
  252. {
  253. if( ::GetFocus() == m_editCode.GetSafeHwnd() )
  254. {
  255. m_listStockSrc.SelectPrior( );
  256. OnSelchangeListStocksrc( );
  257. return TRUE;
  258. }
  259. }
  260. else if( VK_NEXT == pMsg->wParam )
  261. {
  262. if( ::GetFocus() == m_editCode.GetSafeHwnd() )
  263. {
  264. m_listStockSrc.SelectNext( );
  265. OnSelchangeListStocksrc( );
  266. return TRUE;
  267. }
  268. }
  269. else if( VK_RETURN == pMsg->wParam )
  270. {
  271. if( ::GetFocus() == m_editCode.GetSafeHwnd() )
  272. {
  273. m_editCode.SetWindowText( NULL );
  274. return TRUE;
  275. }
  276. }
  277. }
  278. return CPropertyPageEx::PreTranslateMessage(pMsg);
  279. }
  280. void CSetKDataDlg::OnSelchangeListStocksrc() 
  281. {
  282. // TODO: Add your control notification handler code here
  283. HWND hWndFocus = ::GetFocus( );
  284. int nSel = m_listStockSrc.GetCurSel( );
  285. if( LB_ERR != nSel )
  286. {
  287. CString rString, strStockCode;
  288. m_listStockSrc.GetText(nSel,rString);
  289. int nIndex = rString.Find( '(' );
  290. if( -1 != nIndex )
  291. strStockCode = rString.Left( nIndex );
  292. m_staticStock.SetWindowText( rString );
  293. m_strCurStockCode = strStockCode;
  294. LoadKData( m_strCurStockCode );
  295. }
  296. else
  297. {
  298. CString strNoStock;
  299. strNoStock.LoadString( IDS_SETBASEDATA_NOSTOCK );
  300. m_staticStock.SetWindowText( strNoStock );
  301. m_strCurStockCode.Empty();
  302. }
  303. EnableEdit( m_strCurStockCode.GetLength() > 0 );
  304. ::SetFocus( hWndFocus );
  305. }
  306. void CSetKDataDlg::OnCompleted( )
  307. {
  308. AfxGetSListStockContainer().ReRetrieveFromStatic( AfxGetActiveStrategy() );
  309. AfxGetStaticDoc()->UpdateAllViews( NULL, UPDATE_HINT_GRAPHVIEW, NULL );
  310. AfxGetStaticDoc()->UpdateAllViews( NULL, UPDATE_HINT_SLISTVIEW, NULL );
  311. }
  312. void CSetKDataDlg::OnOK() 
  313. {
  314. OnCompleted( );
  315. CPropertyPageEx::OnOK();
  316. }
  317. void CSetKDataDlg::OnCancel() 
  318. {
  319. OnCompleted( );
  320. CPropertyPageEx::OnCancel();
  321. }
  322. BOOL CSetKDataDlg::OnKillActive() 
  323. {
  324. OnCompleted( );
  325. return CPropertyPageEx::OnKillActive();
  326. }
  327. void CSetKDataDlg::OnDatetimechangeDate(NMHDR* pNMHDR, LRESULT* pResult) 
  328. {
  329. LoadKData( m_strCurStockCode );
  330. *pResult = 0;
  331. }
  332. void CSetKDataDlg::OnSave() 
  333. {
  334. StoreKData( m_strCurStockCode );
  335. }
  336. void CSetKDataDlg::OnDelete() 
  337. {
  338. if( DeleteKData( m_strCurStockCode ) )
  339. {
  340. m_tmDate = CSPTime::GetCurrentTime();
  341. UpdateData( FALSE );
  342. LoadKData( m_strCurStockCode );
  343. }
  344. }