1.多股同列的菜单点击事件
1.1 多股同列的菜单ID
IDR_MENU_MAINBARVIEW MENU
POPUP "行情(&N)"
BEGIN
...
MENUITEM "下一只股票(&N)\tPageDown", ID_REALTIME_NEXT
POPUP "多股同列(&M)"
BEGIN
MENUITEM "一只股票(&O)", ID_REALTIME_ONESTOCK
MENUITEM "两只股票(&T)", ID_REALTIME_TWOSTOCK
MENUITEM "四只股票(&F)", ID_REALTIME_FOURSTOCK
MENUITEM "六只股票(&S)", ID_REALTIME_SIXSTOCK
MENUITEM "九只股票(&N)", ID_REALTIME_NINESTOCK
END
1.2.九只股票id 对应的消息函数
G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.cpp
ON_UPDATE_COMMAND_UI(ID_REALTIME_NINESTOCK, OnUpdateRealtimeNinestock)
void CMainFrame::OnUpdateRealtimeNinestock(CCmdUI* pCmdUI)
{
CRealTimeView* pView = AfxGetRealTimeView();
pCmdUI->SetCheck(pView && 9 == pView->GetShowMultiStock());
}
1.3.九只股票id被点击后股票数据来源
G:\stock\TskingVS2019\src\Client\StkUI\View\RealTimeView.cpp
void CRealTimeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
...
// 多股同列
for(int i=1; i < m_nMultiStockCount && i < RTV_MAX_MULTICOUNT; i++)
{
if(AfxGetProfile().GetNextStock(&info))
{
m_realtime[i].SetCurStock(info);
m_realtime[i].PrepareStockData();
if(CRealTime::modeReportDetail == m_realtime[0].GetDrawMode())
AfxGetStkReceiver().RequestStockData(CStock::dataDetail, &info, 1, 0, 0);
else
AfxGetStkReceiver().RequestStockData(CStock::dataMinute, &info, 1, 0, 0);
}
}
for(int i=1; i < m_nMultiStockCount && i < RTV_MAX_MULTICOUNT; i++)
AfxGetProfile().GetPrevStock(&info);
Invalidate();
...
}
AfxGetProfile().GetNextStock(&info)
BOOL CStProfile::GetNextStock( CStockInfo * pInfo )
{
if( m_bCurStockFromSList )
return AfxGetSListStockContainer().GetNextStock( pInfo );
else
return AfxGetStockContainer().GetNextStock( pInfo );
}
智能选股界面的条件初始初始化
StkUI\View\SelectorView.h
首先定义了股票范围、K线类型、技术指标三个对话框变量,分别由三个对话框提供。
public:
//{{AFX_DATA(CSelectorView)
enum { IDD = IDD_SELECTOR_FORM };
CStatic m_staticInfo;
CProgressCtrl m_progress;
CButton m_btnRunSelector;
CTechComboBox m_cmbTech; //技术指标类型,由StkUI\ParamDlg\SetParamDlg.h提供的CTechComboBox类实现
CKTypeComboBox m_cmbKType; //K线类型,由StkUI\ParamDlg\SetParamDlg.h提供的CKTypeComboBox类实现
CDomainComboBox m_cmbStockGroup;//股票范围,由StkUI\Dialog\SetGroupDlg.h
//}}AFX_DATA
然后对股票范围、K线类型、技术指标三个对话框变量数据初始化
StkUI\View\SelectorView.cpp
void CSelectorView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
InitializeGrid( );
m_staticInfo.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
LOGFONT lf;
memset( &lf, 0, sizeof(lf) );
AfxGetProfile().GetFontSListView( &lf );
SetFont( &lf );
//初始化股票选择范围。如智能选股
m_cmbStockGroup.InitStrings( TRUE, TRUE, AfxGetGroupContainer( ) );
m_cmbStockGroup.SetCurSel( 0 );
m_cmbStockGroup.SelectGroupAll( );
//初始化K线类型选择框
m_cmbKType.InitializeDay( );
//各项技术指标种类选择框初始化。如智能选股
m_cmbTech.Initialize();
}
2.智能选股对话框分析
G:\stock\TskingVS2019\src\Client\StkUI\Dialog\FilterInfoDlg.cpp
2.1 智能选股对话框点击“开始”按钮
//基本资料和行情选股对话框点击“开始”按钮
void CFilterInfoDlg::OnStart()
{
UpdateData( ); ////step 1.基本资料和行情选股对话框,首先更新数据
if( m_listCond.GetCount() <= 0 )
{
AfxMessageBox( IDS_FILTERINFO_NOCOND, MB_OK|MB_ICONINFORMATION );
return;
}
BOOL bAnd = TRUE;
CButton * pbtn = (CButton *)GetDlgItem(IDC_RADIOAND);
if( pbtn ) bAnd = pbtn->GetCheck();
m_listResult.ResetContent();
CStockContainer & container = AfxGetStockContainer();
m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE );
m_ctrlProgress.SetRange( 0, container.GetSize() );//基本资料和行情选股对话框,进度条最大数设置为股票个数
for( int i=0; i<container.GetSize(); i++ )
{
m_ctrlProgress.SetPos( i ); //进度条设置为当前股票序号
CStockInfo & info = container.ElementAt(i);
LONG stocktype = info.GetType(); //判断选股范围
if( CStock::typeshA == stocktype )
{ if( !m_btnAll.GetCheck() && !m_btnShaa.GetCheck() ) continue; }
else if( CStock::typeshB == stocktype )
{ if( !m_btnAll.GetCheck() && !m_btnShab.GetCheck() ) continue; }
else if( CStock::typeszA == stocktype )
{ if( !m_btnAll.GetCheck() && !m_btnSzna.GetCheck() ) continue; }
else if( CStock::typeszB == stocktype )
{ if( !m_btnAll.GetCheck() && !m_btnSznb.GetCheck() ) continue; }
else
{ continue; }
BOOL bSelected = bAnd;
for( int k=0; k<m_listCond.GetCount(); k++ ) //选股条件
{
FILTERINFO_CONDITION * pCond = (FILTERINFO_CONDITION *)m_listCond.GetItemData(k);
double dValue = 0;
BOOL bOK = FALSE;
if( pCond && AfxGetVariantValue( pCond->nVariantID, info, &dValue, &container ) ) //对第i只股票进行计算
{
bOK = TRUE;
if( pCond->bHasMoreThan && dValue < pCond->dMoreThan )
bOK = FALSE;
if( pCond->bHasLessThan && dValue > pCond->dLessThan )
bOK = FALSE;
}
if( bAnd && !bOK )
{
bSelected = FALSE;
break;
}
if( !bAnd && bOK )
{
bSelected = TRUE; //符合选股条件
break;
}
}
//符合条件
if( bSelected )
{
//加入结果列表,CListBox m_listResult,因为是对话框,改变m_listResult的值即更新界面
int nItem = m_listResult.AddString( CString(info.GetStockCode()) + "(" + info.GetStockName() + ")" );
m_listResult.SetItemData( nItem, i );
}
}
m_ctrlProgress.SetPos( container.GetSize() );
m_btnAddToGroup.EnableWindow( TRUE );
}