📄 uiframewnd.cpp
字号:
// UIFrameWnd.cpp : implementation file
//
#include "stdafx.h"
#include "afxmt.h"
#include "stock.h"
#include "UIFrameWnd.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WM_IRQ (WM_USER+200)
/////////////////////////////////////////////////////////////////////////////
// CUIFrameWnd
CCriticalSection m_CriticalSection;
vector<CData> CUIFrameWnd::m_SHIndexArray;
vector<CData> CUIFrameWnd::m_SHStockArray;
vector<CData> CUIFrameWnd::m_SZIndexArray;
vector<CData> CUIFrameWnd::m_SZStockArray;
unsigned int CUIFrameWnd::m_uiWriteCounter = 0;
unsigned int CUIFrameWnd::m_uiWriteIndex = 0;
unsigned int CUIFrameWnd::m_uiReadCounter = 0;
unsigned int CUIFrameWnd::m_uiReadIndex = 0;
int CUIFrameWnd::Lastday=0;
BOOL CUIFrameWnd::m_bKill;
vector<CString> CUIFrameWnd::m_conserCode;
vector<CString> CUIFrameWnd::m_conserName;
vector<CString> CUIFrameWnd::m_appCode;
STOCK CUIFrameWnd::m_Stock[2000];
BOOL bControl=false;
KLine CUIFrameWnd:: data1[31];
CMainFrame *pMain = (CMainFrame *)AfxGetApp()->m_pMainWnd;
IMPLEMENT_DYNCREATE(CUIFrameWnd, CFrameWnd)
CUIFrameWnd::CUIFrameWnd()
{
InitBulk();
m_hLibrary = NULL;
}
CUIFrameWnd::~CUIFrameWnd()
{
FreeLibrary();
}
BEGIN_MESSAGE_MAP(CUIFrameWnd, CFrameWnd)
//{{AFX_MSG_MAP(CUIFrameWnd)
ON_MESSAGE(WM_IRQ, OnIRQ)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUIFrameWnd message handlers
int CUIFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_hLibrary = ::LoadLibrary("fstrcv.dll");
INITCARD* lpfunction = (INITCARD*)::GetProcAddress(m_hLibrary, "InitCard");
unsigned int uiCardNumber = (*lpfunction)((this->m_hWnd), WM_IRQ);
m_EnableMessage = (ENABLEMESSAGE*)::GetProcAddress(m_hLibrary, "EnableMessage");
m_ReceiveInfo = (RECEIVEINFO*)::GetProcAddress(m_hLibrary, "ReceiveInfo");
m_DataAcquisition = (DATAACQUISITION*)::GetProcAddress(m_hLibrary, "DataAcquisition");
// TODO: Add your specialized creation code here
return 0;
}
LRESULT CUIFrameWnd::OnIRQ(WPARAM wParam, LPARAM lParam)
{
unsigned int iMsgCounter;
unsigned int i;
(*m_EnableMessage)(0);
iMsgCounter = (*m_ReceiveInfo)();
for(i = 0; i < iMsgCounter; i++)
{
m_CriticalSection.Lock();
m_uiWriteIndex = m_uiWriteCounter % 2000;
(*m_DataAcquisition)(&(m_Stock[m_uiWriteIndex]), i);
++ m_uiWriteCounter;
m_CriticalSection.Unlock();
}
(*m_EnableMessage)(1);
CMainFrame::m_pReadThread->ResumeThread();
return 1;
}
UINT CUIFrameWnd::ReadRingThread(PVOID pParam)
{
while(!m_bKill)
{
m_CriticalSection.Lock();
while((m_uiReadCounter) < m_uiWriteCounter)
{
m_uiReadIndex = m_uiReadCounter % 2000;
switch(m_Stock[m_uiReadIndex].Type)
{
case 0x10://-----------------上证指数
ExpandPackage(m_SHIndexArray);
++m_uiReadCounter;
break;
case 0x11://-----------------上证股票
ExpandPackage(m_SHStockArray);
++m_uiReadCounter;
break;
case 0x12://-----------------上证公告
++m_uiReadCounter;
break;
case 0x14://-----------------上证补分时
++m_uiReadCounter;
break;
case 0x15://-----------------上证补日线
++m_uiReadCounter;
break;
case 0x16://-----------------上证权息
++m_uiReadCounter;
break;
case 0x20://-----------------深证指数
ExpandPackage(m_SZIndexArray);
++m_uiReadCounter;
break;
case 0x21://-----------------深证股票
ExpandPackage(m_SZStockArray);
++m_uiReadCounter;
break;
case 0x24://-----------------深证补分时
++m_uiReadCounter;
break;
case 0x25://-----------------深证补日线
++m_uiReadCounter;
break;
case 0x26://-----------------深证权息
++m_uiReadCounter;
break;
case 0x31://-----------------存盘文件
++m_uiReadCounter;
break;
case 0x50://-----------------其它(瑞照规定)
++m_uiReadCounter;
break;
default://-------------------其它(自定义)
++m_uiReadCounter;
break;
}
}
m_CriticalSection.Unlock();
CMainFrame::m_pReadThread->SuspendThread();
}
return 0;
}
void CUIFrameWnd::ExpandPackage(vector<CData>& Data)
{
int iIndex, iRealTime;
RealTime m_RealTime;
iIndex = SearchCode(Data,m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Code , m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Name);
if(((m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Volume) == m_SHIndexArray[1].m_pAllData->m_KLine.Volume) || //----------判断是否有重复数据
(((m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.New) > (m_SHIndexArray[1].m_pAllData->m_KLine.LastClose * 1.1 + 0.01)) && //----*1.1+0.01涨停板
((m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.New) < (m_SHIndexArray[1].m_pAllData->m_KLine.LastClose * 0.9 - 0.01))))//------*0.9-0.01跌停板
return;
else
{
m_RealTime.New = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.New)/1000;
m_RealTime.Volume = (m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Volume);
m_RealTime.Amount = (m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Amount);
m_RealTime.Time= CTime::GetCurrentTime();
Data[iIndex].m_pAllData->m_KLine.Time= CTime::GetCurrentTime();
Data[iIndex].m_pAllData->m_KLine.LastClose = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Close)/1000;
Data[iIndex].m_pAllData->m_KLine.Highest = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.High)/1000;
Data[iIndex].m_pAllData->m_KLine.Open = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Open)/1000;
Data[iIndex].m_pAllData->m_KLine.Lowest = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Low)/1000;
Data[iIndex].m_pAllData->m_KLine.New = (float)(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.New)/1000;
Data[iIndex].m_pAllData->m_KLine.Volume = (m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Volume);
Data[iIndex].m_pAllData->m_KLine.Amount = (m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Amount);
}
iRealTime = Data[iIndex].m_pAllData->m_RealData.Add(m_RealTime);
if(!Search(m_appCode,m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Code))
m_appCode.push_back(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Code);
// if(Lastday!=m_RealTime.Time.GetDay())
// bControl=false;
if(pMain->bTime)
{
bControl=false;
pMain->bTime=false;
}
if(!bControl)
{
for(int j=0;j<m_appCode.size();j++)
{
int index,Num;
index= SearchCode(Data,m_appCode[j]);
Num=Readdata(m_appCode[j]);
if(Num<30)
WriteData(m_appCode[j],Data[index].m_pAllData->m_KLine);
else
{
WriteDataOnce(m_appCode[j],Data[index].m_pAllData->m_KLine);
}
}
// Lastday=m_RealTime.Time.GetDay();
bControl=true;
}
if(m_Stock[m_uiReadIndex].ALLSTRUCT.INDEX.Code==pMain->pCode)
pMain->Refresh(Data[iIndex]);
}
int CUIFrameWnd::SearchCode(vector<CData>& Data, CString strCode, CString strName)
{
int iLow = 0;
int iHigh = (Data.size() - 1);
int iMid = 0;
CData Temp;
Temp.m_strCode = strCode;
Temp.m_strName = strName;
while((iLow <= iHigh))
{
iMid = (int)((iLow + iHigh)/2);
if(strCode.Compare(Data[iMid].m_strCode) == 0)
{
return iMid;
}
else if(strCode.Compare(Data[iMid].m_strCode) < 0)
{
iHigh = (iMid - 1);
}
else
{
iLow = (iMid + 1);
}
}
if(strCode.Compare(Data[iMid].m_strCode) > 0)
{
m_conserCode.push_back(strCode);
m_conserName.push_back(strName);
Data.insert((Data.begin()+iMid + 1), Temp);
return (iMid + 1);
}
else
{
m_conserCode.push_back(strCode);
m_conserName.push_back(strName);
Data.insert((Data.begin()+iMid + 1), Temp);
return iMid;
}
return 0;
}
void CUIFrameWnd::InitBulk(void)
{
CData data;
CStdioFile finSHStk, finSZStk, finSHIdx, finSZIdx;
finSHIdx.Open("SHStock.txt", CFile::modeRead);
while(1)
{
CString str,strCode, strName;
finSHIdx.ReadString(str);
if(str == "")
break;
strCode = str.Left(str.Find(" ",0));
strName = str.Right(str.GetLength() - str.Find(" ",0));
data.m_strCode = strCode;
data.m_strName = strName;
m_SHStockArray.push_back(data);
m_conserCode.push_back(strCode);
m_conserName.push_back(strName);
if(strCode!=_T(""))
{
strName=strCode+_T(".txt");
CFile file(strName, CFile::modeCreate|CFile::modeNoTruncate);
file.Close();
}
}
finSHIdx.Close();
finSHStk.Open("SHIndex.txt", CFile::modeRead);
while(1)
{
CString str,strCode, strName;
finSHStk.ReadString(str);
if(str == "")
break;
strCode = str.Left(str.Find(" ",0));
strName = str.Right(str.GetLength() - str.Find(" ",0));
data.m_strCode = strCode;
data.m_strName = strName;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -