⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scdemodlg.cpp

📁 数畅接口示范例程源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SCDemoDlg.cpp : implementation file
// any questions or suggesstion, pls contact MSN: (cctw007@gmail.com)

#include "stdafx.h"
#include "SCDemo.h"
#include "SCDemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

UINT nReplyMsg = RegisterWindowMessage("SCDemo Reply Message");

struct TDate {		// 五分钟K线数据时间格式
	unsigned long m_Minute : 6;
	unsigned long m_Hour : 5;
	unsigned long m_Day  : 5;
	unsigned long m_Month : 4; 
	unsigned long m_Year : 12;
 
	void operator = (const SYSTEMTIME &st)
	{
		m_Year=st.wYear;
		m_Month=st.wMonth;
		m_Day=st.wDay;
		m_Hour=st.wHour;
		m_Minute=st.wMinute;
	}
 
	unsigned long GetStdDate(void)
	{
		return m_Year*10000+m_Month*100+m_Day;
	}
	unsigned long GetStdTime(void)
	{
		return m_Hour*100+m_Minute;
	}

	long GetOldDateTime(void)
	{
		return m_Month*1000000+m_Day*10000+m_Hour*100+m_Minute;
	}

	void SetStdDate(int nDate)
	{
		m_Year=nDate/10000;
		m_Month=nDate%10000/100;
		m_Day=nDate%100;
	}

	void SetStdTime(int nTime)
	{
		m_Hour=nTime/100;
		m_Minute=nTime%100;
	}

	BOOL operator ==(const  TDate Date )
	{
		return *(unsigned long *)this==*(unsigned long*)&Date;
	}
	BOOL operator !=(const TDate Date)
	{
		return *(unsigned long *)this!=*(unsigned long*)&Date;
	}
	BOOL operator <( const TDate Date) 
	{
		return *(unsigned long *)this<*(unsigned long*)&Date;
	}
	BOOL operator >( const TDate Date)
	{
		return *(unsigned long *)this>*(unsigned long*)&Date;
	}
	BOOL operator <=(const TDate Date) 
	{
		return *(unsigned long *)this<=*(unsigned long*)&Date;
	}
	BOOL operator >=( const TDate Date)
	{
		return *(unsigned long *)this>=*(unsigned long*)&Date;
	}
};


/////////////////////////////////////////////////////////////////////////////
// CSCDemoDlg dialog

CSCDemoDlg::CSCDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSCDemoDlg::IDD, pParent)
{
	CTime t = CTime::GetCurrentTime();
	//{{AFX_DATA_INIT(CSCDemoDlg)
	m_strData = _T("");
	m_nLstFunc = -1;
	m_nLstTitle = -1;
	m_dateStart = t;
	m_dateEnd = t;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_pMLHead = m_pMLTail = NULL;
	m_lAskIndex = 1;
	m_bIMTitle = FALSE;
	m_pIMTitle = NULL;
	m_nIMCnt = 0;
}

CSCDemoDlg::~CSCDemoDlg()
{
	_DeleteMLink();

//****************************************************************************************
// 退出的时候调用这个函数,以释放调用SCInit时分配的资源。
// void WINAPI SCQuit();
//****************************************************************************************
	m_Dll.SCQuit();

	m_Dll.Unload();
	if ( m_pIMTitle ) {
		delete m_pIMTitle;
		m_pIMTitle = NULL;
		m_nIMCnt = 0;
	}
}

void CSCDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSCDemoDlg)
	DDX_Control(pDX, IDC_DATA, m_editData);
	DDX_Control(pDX, IDC_TREE_STOCK, m_treeStock);
	DDX_Control(pDX, IDC_LIST_TITLE, m_lstTitle);
	DDX_Control(pDX, IDC_LIST_FUNC, m_lstFunc);
	DDX_Text(pDX, IDC_DATA, m_strData);
	DDX_LBIndex(pDX, IDC_LIST_FUNC, m_nLstFunc);
	DDX_LBIndex(pDX, IDC_LIST_TITLE, m_nLstTitle);
	DDX_DateTimeCtrl(pDX, IDC_DATETIME_START, m_dateStart);
	DDX_DateTimeCtrl(pDX, IDC_DATETIME_END, m_dateEnd);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSCDemoDlg, CDialog)
	//{{AFX_MSG_MAP(CSCDemoDlg)
	ON_LBN_SELCHANGE(IDC_LIST_FUNC, OnSelchangeListFunc)
	ON_LBN_SELCHANGE(IDC_LIST_TITLE, OnSelchangeListTitle)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_STOCK, OnSelchangedTreeStock)
	ON_BN_CLICKED(IDC_CLEAR_PREV_ASK, OnClearPrevAsk)
	ON_BN_CLICKED(IDC_USERNAME, OnUsername)
	//}}AFX_MSG_MAP
	ON_REGISTERED_MESSAGE(nReplyMsg, OnReply)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSCDemoDlg message handlers

BOOL CSCDemoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	// TODO: Add extra initialization here
	if ( m_Dll.Load() ) {
		UpdateData();
		m_lstFunc.AddString("实时行情报价");		// 0
		m_lstFunc.AddString("交易所公告信息");		// 1
		m_lstFunc.AddString("F10资料");
		m_lstFunc.AddString("个股信息地雷");
		m_lstFunc.AddString("新闻");
		m_lstFunc.AddString("综合资讯");
		m_lstFunc.AddString("五分钟");
		m_lstFunc.AddString("日线数据");
		m_lstFunc.AddString("除权数据");
		m_lstFunc.AddString("盘口数据");
		m_treeStock.ModifyStyle(0, TVS_LINESATROOT | TVS_HASBUTTONS
			| TVS_SHOWSELALWAYS | TVS_HASLINES );

// 设置处理消息的窗口句柄和自定义的消息
// SCAskData请求的数据在这个消息中返回结果
// 但是,并不是一定要调用SCAskData才有数据返回,在没有调用SCAskData的情况下,有下面三种情况会返回数据
// 1、市场变化(比如初始化,新股上市等),返回SC_MarketReply数据
// 2、开市时段内,实时数据不断变化,返回SC_NowReply数据
// 3、在引擎里面进行了下载操作,返回下载下来的指定数据SC_Downdload
// 其它情况,通过调用SCAskData,返回指定类型的数据。
		SC_InitAsk sca;					// 引擎初始化包
		memset(&sca, 0, sizeof(sca));
		sca.m_Head.m_nType = SC_INIT;
		sca.m_dwSoftware = 0x12345678; // 示范标识,请选用数畅公司分配的软件标识
		sca.m_hWnd = m_hWnd;
		sca.m_nMsg = nReplyMsg;

		// 调用引擎初始化函数
		if ( !m_Dll.SCInit(&sca, sizeof(sca)) )  // 退出时调用m_Dll.SCQuit();
			return FALSE;
	}

	return TRUE;  // return TRUE  unless you set the focus to a control
}

LRESULT CSCDemoDlg::OnReply(WPARAM wParam, LPARAM lParam)		//新接口消息处理
{
	int i;
	char strText[128];
	short nIndex;
	WORD wMarket;
	SCMarket *pscm;
	struct tm *ptm;
	SCHead *pHead = (SCHead *)lParam;
	if ( !pHead )
		return 0;

	if (  pHead->m_cStatus == 0 ) {
		MessageBox("没有数据或其它错误!", MB_OK);
		return 0;
	}

	UpdateData();
	switch( pHead->m_nType )
	{
	case SC_MARKET: 
		{
			SC_MarketReply *psc = (SC_MarketReply *)lParam;
			if ( _AddMarket2Link(&psc->m_Market) )
				_InitTree();
		}
		break;
	case SC_NOWDATA:
		{
			SC_NowDataReply *pnr = (SC_NowDataReply *)lParam;
			if ( pnr->m_nCount > 0 ) {
				sprintf(strText, "收到 %d 个实时数据", pnr->m_nCount);
				SetDlgItemText(IDC_NOW, strText);
			}
		}
		break;
	case SC_KLINE:
		{
			SC_KLineReply *pk = (SC_KLineReply *)lParam;
			RCV_HISTORY_STRUCTEx *ph = pk->m_pData;
			wMarket = pk->m_sID.m_wMarket;
			nIndex = pk->m_sID.m_nIndex;
			pscm = _GetMarket(wMarket);
			sprintf(strText, "%d", pk->m_lDataCount);
			SetDlgItemText(IDC_RECORD_CNT, strText);
			if ( pscm ) {
				if ( pk->m_wDataType == KLINE_DAYDATA ) {
					for ( i=0; i<pk->m_lDataCount; ++i ) {
						ptm = localtime(&ph[i].m_time);
						sprintf(strText, "%s\t%04d%02d%02d\t%.3f", pscm->m_Siif[nIndex].m_szLabel, 
							ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday,
							ph[i].m_fClose);
						m_lstTitle.AddString(strText);
					}
				}
				else 
				if ( pk->m_wDataType == KLINE_MIN5DATA ) {
					for ( i=0; i<pk->m_lDataCount; ++i ) {
						ptm = localtime(&ph[i].m_time);
						sprintf(strText, "%s\t%04d%02d%02d, %02d:%02d\t%.3f", pscm->m_Siif[nIndex].m_szLabel, 
							ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min,
							ph[i].m_fClose);
						m_lstTitle.AddString(strText);
					}
				}
			}
		}
		break;
	case SC_PANKOU:
		{
			SC_PankouReply *pp = (SC_PankouReply *)lParam;
			wMarket = pp->m_sID.m_wMarket;
			nIndex = pp->m_sID.m_nIndex;
			pscm = _GetMarket(wMarket);
			struct tm *lt;

			sprintf(strText, "%d", pp->m_lCount);
			SetDlgItemText(IDC_RECORD_CNT, strText);
			if ( pscm ) {
				for ( i=0; i<pp->m_lCount; ++i ) {
					lt = localtime( &pp->m_Data[i].m_time);
					sprintf(strText, "%s\t%02d:%02d:%02d\t%.3f\t%.3lf"
						"\t%.3f\t%.3lf\t%.3lf"
						"\t%.3f\t%.3lf\t%.3lf"
						, 
						pscm->m_Siif[nIndex].m_szLabel, 
						lt->tm_hour, lt->tm_min, lt->tm_sec,
						pp->m_Data[i].m_fNewPrice, pp->m_Data[i].m_fVolume,
						pp->m_Data[i].m_fBuyPrice[2], pp->m_Data[i].m_fBuyPrice[3], pp->m_Data[i].m_fBuyPrice[4],
						pp->m_Data[i].m_fSellPrice[2], pp->m_Data[i].m_fSellPrice[3], pp->m_Data[i].m_fSellPrice[4]
						);
					m_lstTitle.AddString(strText);
				}
			}			
		}
		break;
	case SC_CQ:
		{
			SC_CQReply *pcq = (SC_CQReply *)lParam;
			wMarket = pcq->m_sID.m_wMarket;
			nIndex = pcq->m_sID.m_nIndex;
			pscm = _GetMarket(wMarket);
			sprintf(strText, "%d", pcq->m_nCount);
			SetDlgItemText(IDC_RECORD_CNT, strText);
			if ( pscm ) {
				for ( i=0; i<pcq->m_nCount; ++i ) {
					ptm = gmtime(&pcq->m_pData[i].m_time);
					sprintf(strText, "%s\t%d%02d%02d\t%.3f\t%.3f\t%.3f",
						pscm->m_Siif[nIndex].m_szLabel, 
						ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday,
						pcq->m_pData[i].m_fGive, pcq->m_pData[i].m_fPeiPrice, pcq->m_pData[i].m_fPei);						
					m_lstTitle.AddString(strText);
				}
			}
		}
		break;
	case SC_IMTYPELIST:
		{
			SC_IMTypeReply *pt = (SC_IMTypeReply *)lParam;
		}
		break;
	case SC_IMTITLE:
		{
			m_bIMTitle = TRUE;
			SC_IMTitleReply *ptr = (SC_IMTitleReply *)lParam;
			sprintf(strText, "%d", ptr->m_nSize);
			SetDlgItemText(IDC_RECORD_CNT, strText);
			if ( ptr->m_nSize > 0 )
				m_lClassDate = ptr->m_IMTitle[0].m_lDate;
			for ( i=0; i<ptr->m_nSize; ++i ) {
				m_lstTitle.AddString(ptr->m_IMTitle[i].m_cTitle);
			}
			if ( m_pIMTitle ) {
				delete m_pIMTitle;
				m_pIMTitle = NULL;
				m_nIMCnt = 0;
			}
			m_pIMTitle = new SCIMTitle [ptr->m_nSize];
			if ( m_pIMTitle ) {
				m_nIMCnt = ptr->m_nSize;
				memcpy(m_pIMTitle, ptr->m_IMTitle, m_nIMCnt*sizeof(SCIMTitle));
			}
			m_cClass = ptr->m_cClass;
		}
		break;
	case SC_IMCONTENT:
		{
			char *p, *pTmp;
			int nDataSize;
			SC_IMDataReply *pdr = (SC_IMDataReply *)lParam;
			SCIMData *pData;
			nDataSize = 0;
//			sprintf(strText, "%d", pdr->m_nSize);
//			SetDlgItemText(IDC_RECORD_CNT, strText);
			for ( pData = pdr->m_Data, i=0; i<pdr->m_nSize; ++i ) {
				nDataSize += pData->m_lDataLength;
				pData = (SCIMData *)(pData->m_cData + pData->m_lDataLength);
			}
			p = new char[nDataSize+1];
			if ( p ) {
				pTmp = p;
				for ( pData = pdr->m_Data, i=0; i<pdr->m_nSize; ++i ) {
					memcpy(pTmp, pData->m_cData, pData->m_lDataLength);
					pTmp += pData->m_lDataLength;
					pData = (SCIMData *)(pData->m_cData + pData->m_lDataLength);
				}
				p[nDataSize] = '\0';
				m_editData.SetWindowText(p);
				delete []p;
			}
			else
				m_editData.SetWindowText("not enough memory");

		}
		break;
	case SC_DL_KLINE:		// 日k线下载
		{
			SC_Download *pdl = (SC_Download *)lParam;
			sprintf(strText, "收到下载日线数据 %d 个", pdl->m_lCount);
			SetDlgItemText(IDC_DOWN_LOAD, strText);
		}
		break;
	case SC_DL_5MIN:		// 五分钟k线下载
		{
			SC_Download *pdl = (SC_Download *)lParam;
			sprintf(strText, "收到下载五分钟数据 %d 个", pdl->m_lCount);
			SetDlgItemText(IDC_DOWN_LOAD, strText);
		}
		break;
	case SC_DL_CQ:			// 除权数据下载
		{
			SC_Download *pdl = (SC_Download *)lParam;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -