策略为王源代码扩展系列-分时图(4)-当日行情回放功能之播放控制工具条

Published

\src\Client\StkUI\View\RePlayRealTimeView.cpp

思路:

1.增加行情回放视图\src\Client\StkUI\View\RePlayRealTimeView.cpp

2.增加播放控制工具条资源IDR_REPLAY ToolBar

 

第一部分 新增加一个工具条资源IDR_REPLAY ToolBar

step 1:在Resource.h里面的添加一个ID值,IDR_REPLAY

因前面手工直接修改代码,Resource.h里面的下一个ID值设置未改,vs创建时乱套了。

src/Client/StkUI/resource.h

/*************custom extend by freema*******/
#define IDD_SETSYSTEMSET1               300
#define IDR_REPLAY                      301
/*****************************************/

在Resource.h里面的修改下一个ID值设置

#ifdef APSTUDIO_INVOKED

//下一个控件ID值 by freeman
#define _APS_NEXT_RESOURCE_VALUE        302
//下一个视图ID值  by feeman
#define _APS_NEXT_COMMAND_VALUE         34595
#define _APS_NEXT_CONTROL_VALUE         1325
#define _APS_NEXT_SYMED_VALUE           101
#endif

 

toolbar属于资源,所以在RC目录中右击,添加资源-->toolbar--->新建IDR_REPLAY,新建的位图放在G:\stock\TskingVS2019\src\Client\StkUI\res目录下,名称为toolbar1,新建 的位图一般不美观,用其他画图工具做好16X16或32X32宽度的图片备用,关闭程序,删除rec目录下的toolbar1.bmp图片,然后再打开程序,此时会提示找不到toolbar1.bmp图片,按取消关闭,再把创建好的图片放在rec目录下,替换原来的toolbar1.bmp图片。此时再打开程序就是新的图片

step 2:指定IDR_REPLAY 的图片资源

G:\stock\TskingVS2019\src\Client\StkUI\StkUI.rc

IDB_SPLASH              BITMAP                  "res\\splash.bmp"


/*************custom extend 工具条 by freema*******/
IDR_REPLAY              BITMAP                  "res\\playback.bmp"
/*****************************************/

 

step 3:菜单

添加对工具条单个按钮的ID定义 

/*************custom extend 工具条 by freema*******/
#define ID_PLAYBACK_BEGIN               35779
#define ID_PLAYBACK_REV                 35780
#define ID_PLAYBACK_FASTREV             35781
#define ID_PLAYBACK_PAUSE               35782
#define ID_PLAYBACK_FORWARD             35783
#define ID_PLAYBACK_FASTFW              35784
#define ID_PLAYBACK_END                 35785
#define ID_PLAYBACK_STOP                35786
/*****************************************/

G:\stock\TskingVS2019\src\Client\StkUI\StkUI.rc

 

/*************custom extend 工具条 by freema*******/
IDR_REPLAY TOOLBAR 16, 15
BEGIN
    BUTTON      ID_PLAYBACK_BEGIN
    BUTTON      ID_PLAYBACK_FASTREV
    BUTTON      ID_PLAYBACK_REV
    BUTTON      ID_PLAYBACK_STOP
    BUTTON      ID_PLAYBACK_PAUSE
    BUTTON      ID_PLAYBACK_FORWARD
    BUTTON      ID_PLAYBACK_FASTFW
    BUTTON      ID_PLAYBACK_END
END
/*****************************************/

 

第二部分 MFC添加工具条(Toolbar)按钮并加入事件

1.首先切换到资源视图,编辑最后一个灰色的按钮,我画的图案是一个红色的1。现在运行按钮是灰色的说明没有添加事件。

2.资源视图,点击新建的1按钮,属性视图,改变ID为ID_MyButton。

3.为ID_MyButton,添加ON_COMMAND的绑定,同时添加对应的函数,这样再点击按钮,就可以调用ON_COMMAND绑定

的函数了。

 

在RePlayRealTimeView.cpp视图中加入按钮消息处理事件

G:\stock\TskingVS2019\src\Client\StkUI\View\RePlayRealTimeView.h

	/*************custom extend 工具条 by freema*******/
	afx_msg void OnPlaybackBegin();
	afx_msg void OnPlaybackEnd();
	afx_msg void OnPlaybackForward();

	afx_msg void OnPlaybackPause();
	afx_msg void OnPlaybackFastfw();
	afx_msg void OnPlaybackFastrev();
	afx_msg void OnPlaybackStop();
	/*****************************************/

G:\stock\TskingVS2019\src\Client\StkUI\View\RePlayRealTimeView.cpp

/*************custom extend 工具条 by freema*******/
ON_COMMAND(ID_PLAYBACK_BEGIN, OnPlaybackBegin)
ON_COMMAND(ID_PLAYBACK_END, OnPlaybackEnd)
ON_COMMAND(ID_PLAYBACK_FORWARD, OnPlaybackForward)
ON_WM_TIMER()
ON_COMMAND(ID_PLAYBACK_PAUSE, OnPlaybackPause)
ON_COMMAND(ID_PLAYBACK_FASTFW, OnPlaybackFastfw)
ON_COMMAND(ID_PLAYBACK_FASTREV, OnPlaybackFastrev)
ON_COMMAND(ID_PLAYBACK_STOP, OnPlaybackStop)
/*****************************************/

 

 

在RePlayRealTimeView.cpp添加点击播放按钮消息的实现函数

G:\stock\TskingVS2019\src\Client\StkUI\View\RePlayRealTimeView.cpp

void CRePlayRealTimeView::OnPlaybackBegin()
{
	
}

void CRePlayRealTimeView::OnPlaybackEnd()
{
	
}

void CRePlayRealTimeView::OnPlaybackForward()
{
	
}



void CRePlayRealTimeView::OnPlaybackPause()
{
	
}

void CRePlayRealTimeView::OnPlaybackFastfw()
{
	
}



void CRePlayRealTimeView::OnPlaybackFastrev()
{
	KillTimer(RTV_TIMER_REPLAYREFRESH);
	m_timer = m_timer - 500;
	if (m_timer <= 0)
		m_timer = 100;
	SetTimer(RTV_TIMER_REPLAYREFRESH, m_timer, NULL);
}

void CRePlayRealTimeView::OnPlaybackStop()
{
	
}

第二部分 启用行情播放工具条

step 1:在MainFrm.cpp中添加对HistoryRealtimeView.h类的引用

/**** extend 系统设置、行情回放菜单项 by freeman ****/
#include "Dialog/SetSystemSet1.h"
#include "View/PlayBackView.h"
#include "View/HistoryRealtimeView.h"
/**************************************/

step 2:在MainFrm.h中定义消息映射关系

G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.h

/**** extend 系统设置、行情回放、历史行情菜单项 by freeman ****/
	afx_msg void OnViewPlayback(); 
	afx_msg void OnUpdateViewPlayback(CCmdUI* pCmdUI);
	afx_msg void OnOptionSystemset();
	afx_msg void OnViewHistoryRealtime();
	afx_msg void OnUpdateViewHistoryRealtime(CCmdUI* pCmdUI);
	/**************************************/

 

在主程序中添加点击菜单后生成的消息和对应的消息处理函数

/**** extend 系统设置、行情回放、历史行情菜单项 by freeman ****/
	ON_COMMAND(ID_VIEW_HISTORYREALTIME, OnViewHistoryRealtime)
	ON_COMMAND(ID_VIEW_PLAYBACK, OnViewPlayback)
	ON_UPDATE_COMMAND_UI(ID_VIEW_PLAYBACK, OnUpdateViewPlayback)
	/**************************************/

 

D:\temp\stock\k-line-print-master\client\cnmarket\StkUI\AfxCore.inl

_AFXCORE_INLINE	CRealTimeView * AfxGetRealTimeView( )
{
	CStaticDoc * pStaticDoc = AfxGetStaticDoc();
	return (CRealTimeView *)( pStaticDoc->GetViewIfExist(RUNTIME_CLASS(CRealTimeView)) );
}

 

第二部分 添加历史行情视图

先准备函数

StkUI:HistoryRealTimeView:在StkUI\AfxCore.inl中添加 AfxGetHistoryRealTimeView()

StkUI:HistoryRealTimeView:在StkUI\AfxCore.inl中添加 AfxShowStockHistoryRealTimeView()

第三部份 修改功能

添加在日K线按回车进入历史行情界面的功能

3.1 在日K线按回车时判断,是否进入历史行情界面的功能

 src/Client/StkUI/View/StockGraph.cpp

void CStockGraph::OnReturn(BOOL bShiftPressed, BOOL bCtrlPressed)
{


	/*****custom extend start 回车键处理 by freeman 2019/06/08****/

	BOOL bInTrade = CSPTime::InTradeTime(CSPTime::GetCurrentTime().GetTime(), 900);

	if (m_nIndexCurrent >= 0&& bInTrade)
	{
		/*****custom extend start 回车键处理 by freeman 2019/06/08****/


		{
			AfxSwitchToStaticView(RUNTIME_CLASS(CRealTimeView));
			CRealTimeView* pView = AfxGetRealTimeView();
			if (pView)
				pView->ChangeDrawMode(CRealTime::modePriceLine);
		}
		/**********custom extend end-********************************/

	}
	else
	{

		{
			AfxSwitchToStaticView(RUNTIME_CLASS(CHistoryRealTimeView));//历史行情
			CHistoryRealTimeView* pView = AfxGetHistoryRealTimeView();
			if (pView)
				pView->ChangeDrawMode(CHistoryRealTime::modePriceLine);
		}

	}

	/**********custom extend end-********************************/

 

3.2 添加选择的日K线日期变量

 

3.3 将日期变量存入股票容器中,以便历史行情视图获取。

 

 

G:\stock\TskingVS2019\src\Client\StkLib\Src\Stock.cpp

CStockInfo& CStockInfo::operator = (const CStockInfo& si)
{
	m_dwMarket = si.m_dwMarket;
	memcpy(m_szCode, si.m_szCode, sizeof(m_szCode));
....

/********custom extend 获取回车选择的历史K线日期;*********************/
	m_dateHistoryReport = si.m_dateHistoryReport;
	/********end*******************/

....
}

m_stockinfo = *pInfo;需要做上面的修改,m_dateHistoryReport才会被赋值。

BOOL CStock::SetStockInfo(CStockInfo * pInfo)
	{
		if (NULL == pInfo)
		{
			Clear();
			return FALSE;
		}
		if (m_stockinfo.IsEqualTo(pInfo->GetMarket(), pInfo->GetStockCode()))
		{
			m_stockinfo = *pInfo;
			return m_stockinfo.IsValidStock();
		}
		Clear();
		m_stockinfo = *pInfo;
		return m_stockinfo.IsValidStock();
	}

 

3.2  修改改窗口标题

/* *** extend 历史行情 by freeman ****/
#define IDS_TITLE_HISTORYREALTIMEVIEW   46000
/**************************************/