界面如下:
1------IDR_MAINFRAME 程序的主菜单
2------IDR_MAINBAR 工具栏
3------IDR_SLISTBAR 工具栏
4------IDR_SIMUBAR 工具栏
17-----IDR_PERIODBAR 工具栏
18-----IDR_VIEWBAR 工具栏
以下是视图
5------CStragegyView 基类---CTreeView-----策略
6------CGroupView 基类---CTreeView-----分组
7------CTechsView 基类---CTreeView-----指标
8------CWizardView 基类---CFormView-----向导
9------CSimuView 基类---CFormView-----策略
10-----CSListView 基类---CFormView-----股票列表
11-----CRealTimeView 基类---CView---------分时行情
12-----CMultiSortView 基类---CView---------综合排名
13-----CGraphView 基类---CView---------技术图表;画日K线、其他周期K线的类;StkUI\View\StockGraph.cpp;StkUI\View\GraphView.cpp
14-----CBaseView 基类---CEditView-----基本信息
15-----CInfoView 基类---CHtmlView-----在线资讯
16-----CSelectorView 基类---CFormView-----智能选股
对话框
对话框位置
StkUI\Dialog\AlarmResultDlg.cpp
数据管理
CInstallPacDlg installdlg; //安装K线数据包
CTyDataDlg tydata; //导出K线数据包
CSetDrdataDlg setdr;//权息资料
CSetBaseDlg setbase;//板块财务F10导入
CSetBasedataDlg setbasedata;//基本资料修改
CSetKDataDlg setkdata;//K线修复
使用到的全局变量定义
G:\stock\TskingVS2019\src\Client\StkLib\Src\AfxCore.cpp
7.调用股票数据
BOOL AfxReloadStock( CStock & stock )
{
CStockInfo info = stock.GetStockInfo();
// Reload AfxGetStockMain()
AfxGetStockContainer().GetStockInfo( info.GetStockCode(), &info );
stock.Clear( );
stock.SetStockInfo( &info );
stock.SetDatabase( &AfxGetDB() );
stock.PrepareData( CStock::dataK, CKData::ktypeDay );
// Merge New
stock.GetKDataDay().MergeKData( &(info.m_kdata) );
stock.PrepareData( CStock::dataK, CKData::ktypeWeek );
stock.PrepareData( CStock::dataK, CKData::ktypeMonth );
stock.PrepareData( CStock::dataK, CKData::ktypeMin1);//extend 1分钟K线 by freeman
stock.PrepareData( CStock::dataK, CKData::ktypeMin5 );
stock.PrepareData( CStock::dataK, CKData::ktypeMin15 );
stock.PrepareData( CStock::dataK, CKData::ktypeMin30 );
stock.PrepareData( CStock::dataK, CKData::ktypeMin60 );
return TRUE;
}
加载分时线数据
G:\stock\TskingVS2019\src\Client\StkLib\Src\AfxCore.cpp
int AfxRefreshStockContainerMinute( CStockContainer & container, LONG lStockType, int nSecondsToRead )
{
container.Lock();
time_t tmTradeLatest = -1;
int nCount = 0;
for( int i=0; i<container.GetSize(); i++ )
{
CStockInfo & info = container.ElementAt(i);
if( info.GetType() != lStockType )
continue;
CStock stock;
stock.SetStockInfo( &info );
stock.SetDatabase( &AfxGetDB() );
//加载分时线数据 by freeman
AfxGetDB().LoadMinute( &stock );
info.m_minute.RemoveAll();
CMinute & minstock = stock.GetMinute();
if( -1 == tmTradeLatest && stock.GetMinute().GetSize() > 0 )
tmTradeLatest = CSPTime::GetTimeTradeLatest( minstock[0].m_time );
for( int i=0; i<minstock.GetSize(); i++ )
{
if( -1 == nSecondsToRead || tmTradeLatest-minstock[i].m_time<nSecondsToRead )
info.m_minute.Add( minstock[i] );
}
nCount ++;
}
container.UnLock();
return nCount;
}
GraphView StockGraph MainFrm三者之间的关系
三者之间的层级与调用关系
[ MainFrm ] (主框架窗口)
└─▸ 管理/包含
[ GraphView ] (视图窗口)
└─▸ 依赖/持有 & 调用
[ StockGraph ] (图表渲染引擎)
MainFrm (主框架窗口 / CMainFrame):
负责管理整体的 UI 框架(如菜单栏、工具栏、状态栏、多文档标签页/MDI 子窗口),协调各个子窗口的创建、销毁与布局调度。它是整个界面的控制中枢。
GraphView (图形视图窗口 / CGraphView / CView)
继承自 CView 或 CScrollView,负责接收 Windows 绘图消息(如 OnDraw / OnPaint)、鼠标交互(拖拽、放大缩小、十字光标)以及键盘事件。它将具体的绘制工作委托给 StockGraph 处理
StockGraph (股票图表绘制与逻辑引擎)
封装具体的行情图表绘制算法(如 K 线柱体、均线、MACD、副图指标等)
消息传递链:
MainFrm 接收全局命令(如切换股票代码、切换周期) -> 通知当前激活的 GraphView -> GraphView -> 更新 StockGraph 中的数据源并刷新显示
Windows 发送 WM_PAINT 消息给 GraphView $\rightarrow$ GraphView 获取绘图设备上下文(CDC*) --.> 传递给 StockGraph::Draw(CDC* pDC) 进行最终的 K 线和图形渲染。
用户点击或缩放窗口 .-> 捕获鼠标/键盘消息 $\rightarrow$ 调用 StockGraph 更新坐标、偏移量或放大倍率 .-> 触发 GraphView::Invalidate()
