📄 scdemodlg.cpp
字号:
// 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 + -