📄 kxiantu.cpp
字号:
// KXianTu.cpp : implementation file
//
#include "stdafx.h"
#include "Accobook_CE.h"
#include "Accobook_CEDoc.h"
#include "Accobook_CEView.h"
#include "KXianTu.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CDWordArray g_YearArray,g_MonthArray,g_DayArray;
extern CStringArray g_ZuiGaoJiaArray;
extern CStringArray g_ZuiDiJiaArray;
extern CStringArray g_KaiPanJiaArray;
extern CStringArray g_ShouPanJiaArray;
extern int g_nDays;
extern CTime g_time1,g_time2;
float g_nMax=1.8;
float g_nMin=0.3;
float g_nYStep=8;
TCHAR g_cc[120];
//TCHAR a[100];
//swprintf(a,_T("%f 元."),num);
int g_nTotalNum=12;
float g_nXStep=0;
float g_Step=0;
int g_nXTop=41;//1
int g_nXOffset=40;//35;
int g_nYOffset1=35;
int g_nYOffset2=15;
int g_i;
int g_len;
double g_f;
int g_dec;
int g_sign=-1;;
int g_decpnt;
CString g_s,g_temp="0.";
float g_num;
DWORD g_d;
/////////////////////////////////////////////////////////////////////////////
// CKXianTu dialog
CKXianTu::CKXianTu(CWnd* pParent /*=NULL*/)
: CDialog(CKXianTu::IDD, pParent)
{
//{{AFX_DATA_INIT(CKXianTu)
m_sDaiMa = _T("");
m_sMingChen = _T("");
m_sRiQi1 = _T("");
m_sRiQi2 = _T("");
m_TianShu = 5;
//}}AFX_DATA_INIT
m_bHuaKXianTu=1;
m_nYMax=220;//160;
}
void CKXianTu::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKXianTu)
DDX_Text(pDX, IDC_EDIT_DAIMA, m_sDaiMa);
DDX_Text(pDX, IDC_EDIT_MINGCHEN, m_sMingChen);
DDX_Text(pDX, IDC_EDIT_SearchRIQI1, m_sRiQi1);
DDX_Text(pDX, IDC_EDIT_SearchRIQI2, m_sRiQi2);
DDX_Text(pDX, IDC_EDIT_TIANSHU, m_TianShu);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CKXianTu, CDialog)
//{{AFX_MSG_MAP(CKXianTu)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BUTTON_HUATU, OnButtonHuatu)
ON_BN_CLICKED(IDC_BUTTON_HUATU2, OnButtonHuatu2)
ON_BN_CLICKED(IDC_BUTTON_HUATU3, OnButtonHuatu3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CKXianTu message handlers
BOOL CKXianTu::OnInitDialog()
{
CDialog::OnInitDialog();
//g_nYear1=g_nMonth1=g_nDay1=g_nYear2=g_nMonth2=g_nDay2=
g_nDays=0;
SYSTEMTIME st;
::GetSystemTime(&st);
TCHAR sYear[10],sMonth[10],sDay[10];
wsprintf(sYear,_T("%d"),st.wYear);
wsprintf(sMonth,_T("%d"),st.wMonth);
wsprintf(sDay,_T("%d"),st.wDay);
CString s=sYear;
s+=_T(".");
s+=sMonth;
s+=_T(".");
s+=sDay;
s+=_T(".");
m_sRiQi1=s;
m_sRiQi2=s;
GetDlgItem(IDC_EDIT_SearchRIQI1)->SetWindowText(m_sRiQi1);
GetDlgItem(IDC_EDIT_SearchRIQI2)->SetWindowText(m_sRiQi2);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CKXianTu::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
void CKXianTu::OnCancel()
{
CDialog::OnCancel();
}
void CKXianTu::DrawOneKXianTu(CDC* pDC,float nXpos,
float nZuiGaoJia,float nZuiDiJia,
float nKaiPanJia,float nShouPanJia)
{
CBrush brs1(RGB(255,255,255));
CBrush brs2(RGB(0,0,0));
float nShangXian,nXiaXian;
if(nKaiPanJia<=nShouPanJia)
{
pDC->SelectObject(&brs1);
nShangXian=nShouPanJia;
nXiaXian=nKaiPanJia;
}
else
{
pDC->SelectObject(&brs2);
nShangXian=nKaiPanJia;
nXiaXian=nShouPanJia;
}
nShangXian=(m_nYMax-g_nYOffset1)
-((nShangXian-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
nXiaXian=(m_nYMax-g_nYOffset1)
-((nXiaXian-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
nZuiDiJia=(m_nYMax-g_nYOffset1)
-((nZuiDiJia-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
nZuiGaoJia=(m_nYMax-g_nYOffset1)
-((nZuiGaoJia-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
pDC->Rectangle(nXpos-m_nWidth,nShangXian,
nXpos+m_nWidth,nXiaXian);
pDC->MoveTo(nXpos,nXiaXian);
pDC->LineTo(nXpos,nZuiDiJia);
pDC->MoveTo(nXpos,nShangXian);
pDC->LineTo(nXpos,nZuiGaoJia);
}
void CKXianTu::OnButtonHuatu2()
{
UpdateData();
if((m_sDaiMa=="")&&(m_sMingChen==""))
{
//AfxMessageBox(_T("股票代码及名称不能均空!请输入代码或名称!"));
::MessageBox(GetSafeHwnd(),_T("股票代码及名称不能均空!请输入代码或名称!"),
_T("StockStar_CE Application"),MB_OK);
return;
}
if(m_TianShu<1)
{
//AfxMessageBox(_T("平均线天数不能小于1!请输入正确的平均线天数!"));
::MessageBox(GetSafeHwnd(),_T("平均线天数不能小于1!请输入正确的平均线天数!"),
_T("StockStar_CE Application"),MB_OK);
return;
}
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(0);
CFrameWnd* pWnd=(CFrameWnd*)AfxGetMainWnd( );
if(pWnd)
{
CAccobook_CEView* pView=(CAccobook_CEView*)pWnd->GetActiveView();
if(pView)
{
pView->UpdateListForKXianTu(m_sRiQi1,m_sRiQi2,m_sDaiMa,m_sMingChen);
pView->PrePareKXianTuValues();
if(g_ShouPanJiaArray.GetSize()<m_TianShu)
{
//AfxMessageBox(_T("交易数据太少不能画均线图!"));
::MessageBox(GetSafeHwnd(),_T("交易数据太少不能画均线图!"),
_T("StockStar_CE Application"),MB_OK);
m_bHuaKXianTu=1;
}
else
m_bHuaKXianTu=2;
}
}
Invalidate();
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(1);
}
void CKXianTu::OnButtonHuatu()
{
UpdateData();
if((m_sDaiMa=="")&&(m_sMingChen==""))
{
//AfxMessageBox(_T("股票代码及名称不能均空!请输入代码或名称!"));
::MessageBox(GetSafeHwnd(),_T("股票代码及名称不能均空!请输入代码或名称!"),
_T("StockStar_CE Application"),MB_OK);
return;
}
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(0);
CFrameWnd* pWnd=(CFrameWnd*)AfxGetMainWnd( );
if(pWnd)
{
CAccobook_CEView* pView=(CAccobook_CEView*)pWnd->GetActiveView();
if(pView)
{
pView->UpdateListForKXianTu(m_sRiQi1,m_sRiQi2,m_sDaiMa,m_sMingChen);
pView->PrePareKXianTuValues();
m_bHuaKXianTu=1;
}
}
Invalidate();
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(1);
}
void CKXianTu::OnButtonHuatu3()
{
UpdateData();
if((m_sDaiMa=="")&&(m_sMingChen==""))
{
//AfxMessageBox(_T("股票代码及名称不能均空!请输入代码或名称!"));
::MessageBox(GetSafeHwnd(),_T("股票代码及名称不能均空!请输入代码或名称!"),
_T("StockStar_CE Application"),MB_OK);
return;
}
if(m_TianShu<1)
{
// AfxMessageBox(_T("平均线天数不能小于1!请输入正确的平均线天数!"));
::MessageBox(GetSafeHwnd(),_T("平均线天数不能小于1!请输入正确的平均线天数!"),
_T("StockStar_CE Application"),MB_OK);
return;
}
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(0);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(0);
CFrameWnd* pWnd=(CFrameWnd*)AfxGetMainWnd( );
if(pWnd)
{
CAccobook_CEView* pView=(CAccobook_CEView*)pWnd->GetActiveView();
if(pView)
{
pView->UpdateListForKXianTu(m_sRiQi1,m_sRiQi2,m_sDaiMa,m_sMingChen);
pView->PrePareKXianTuValues();
if(g_ShouPanJiaArray.GetSize()<m_TianShu)
{
m_bHuaKXianTu=1;
if(g_ShouPanJiaArray.GetSize()>0)
// AfxMessageBox(_T("交易数据太少不能画均线图,只能画K线图!"));
::MessageBox(GetSafeHwnd(),_T("交易数据太少不能画均线图,只能画K线图!"),
_T("StockStar_CE Application"),MB_OK);
}
else
m_bHuaKXianTu=3;
}
}
Invalidate();
GetDlgItem(IDC_BUTTON_HUATU)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU2)->EnableWindow(1);
GetDlgItem(IDC_BUTTON_HUATU3)->EnableWindow(1);
}
void CKXianTu::DrawJunXianTu(CDC* pDC)
{
int i,j,Num=g_ShouPanJiaArray.GetSize();
if(Num<5)return;
double dShouPanJia;
TCHAR* stopstring;
//int nFind=0;
//while(nFind<4)
//dShouPanJia=_tcstod(g_ShouPanJiaArray[4],&stopstring);
dShouPanJia=wcstod(g_ShouPanJiaArray[m_TianShu-1],&stopstring);
//for(j=3;j>=0;j--)
for(j=m_TianShu-2;j>=0;j--)
{
dShouPanJia+=wcstod(g_ShouPanJiaArray[j],&stopstring);
}
dShouPanJia=dShouPanJia/(double)m_TianShu;
dShouPanJia=(m_nYMax-g_nYOffset1)
-((dShouPanJia-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
//pDC->MoveTo(g_nXOffset+(4+1)*g_nXStep,dShouPanJia);
pDC->MoveTo(g_nXOffset+(m_TianShu)*g_nXStep,dShouPanJia);
//for(i=5;i<Num;i++)
for(i=m_TianShu;i<Num;i++)
{
dShouPanJia=wcstod(g_ShouPanJiaArray[i],&stopstring);
//while(nFind<4)
//for(j=i-1;j>i-5;j--)
for(j=i-1;j>i-m_TianShu;j--)
{
dShouPanJia+=wcstod(g_ShouPanJiaArray[j],&stopstring);
}
dShouPanJia=dShouPanJia/(double)m_TianShu;
dShouPanJia=(m_nYMax-g_nYOffset1)
-((dShouPanJia-g_nMin)/(g_nMax-g_nMin))*g_nYStep*g_Step;
pDC->LineTo(g_nXOffset+(i+1)*g_nXStep,dShouPanJia);
}
}
void CKXianTu::OnPaint()
{
CPaintDC dc(this); // device context for painting
g_nTotalNum=g_ZuiGaoJiaArray.GetSize();
g_nDays+=1;
CRect rc;
GetClientRect(&rc);
//m_nYMax=160;
m_nWidth=(rc.Width()-3)/(2*g_nDays);//g_nXStep;
//m_nWidth=5;//(rc.Width()-3)/(2*g_nDays);
// if(m_nWidth<2)m_nWidth=2;
if(m_nWidth>5)m_nWidth=5;
TCHAR* stopstring;
int i,KNum;
DrawZuoBiaoXi(&dc,rc);
if(m_bHuaKXianTu==1)
{
KNum=g_ZuiGaoJiaArray.GetSize();
for(i=0;i<KNum;i++)
{
// i=0;
// dc.Rectangle(50,50,150,100);
// dc.Rectangle(70,50,150,100);
// DrawOneKXianTu(&dc,70,140,100,138,110);
DrawOneKXianTu(&dc,g_nXOffset+(i+1)*g_nXStep,
wcstod(g_ZuiGaoJiaArray[i],&stopstring),
wcstod(g_ZuiDiJiaArray[i],&stopstring),
wcstod(g_KaiPanJiaArray[i],&stopstring),
wcstod(g_ShouPanJiaArray[i],&stopstring)) ;
}
}
if(m_bHuaKXianTu==2)
{
DrawJunXianTu(&dc);
}
if(m_bHuaKXianTu==3)
{
DrawJunXianTu(&dc);
KNum=g_ZuiGaoJiaArray.GetSize();
for(i=0;i<KNum;i++)
{
DrawOneKXianTu(&dc,g_nXOffset+(i+1)*g_nXStep,
wcstod(g_ZuiGaoJiaArray[i],&stopstring),
wcstod(g_ZuiDiJiaArray[i],&stopstring),
wcstod(g_KaiPanJiaArray[i],&stopstring),
wcstod(g_ShouPanJiaArray[i],&stopstring)) ;
}
}
}
void CKXianTu::DrawZuoBiaoXi(CDC* pDC,CRect rc)
{
pDC->MoveTo(g_nXOffset,g_nXTop);//1
pDC->LineTo(g_nXOffset,m_nYMax);//rc.Height());
pDC->LineTo(rc.Width()-3,m_nYMax);
pDC->LineTo(rc.Width()-6,m_nYMax+3);
pDC->MoveTo(rc.Width()-3,m_nYMax);
pDC->LineTo(rc.Width()-6,m_nYMax-3);
pDC->MoveTo(g_nXOffset,g_nXTop);//1
pDC->LineTo(g_nXOffset-3,g_nXTop+3);//4
pDC->MoveTo(g_nXOffset,g_nXTop);//1
pDC->LineTo(g_nXOffset+3,g_nXTop+3);//4
ExtTextOut(pDC->GetSafeHdc(),g_nXOffset-6,m_nYMax, ETO_OPAQUE,NULL,_T("o"),1,NULL);
//////////////////////////////////////^
////////////////////Draw KE DU:Y Zhou |
g_num=(g_nMax-g_nMin)/g_nYStep;
//g_Step=(m_nYMax-50)/g_nYStep;
g_Step=(m_nYMax-90)/g_nYStep;
if(g_nTotalNum>0)
{
for(g_i=0;g_i<(g_nYStep+1);g_i++)
{
pDC->MoveTo(g_nXOffset-2,m_nYMax-g_nYOffset1-g_i*g_Step);
pDC->LineTo(g_nXOffset+2,m_nYMax-g_nYOffset1-g_i*g_Step);
swprintf(g_cc,_T("%f"),g_nMin+g_i*g_num);
g_s=g_cc;
g_len=g_s.GetLength();
while(g_s[g_len-1]=='0')
{
g_s=g_s.Left(g_len-1);
g_len=g_s.GetLength();
}
g_len=min(g_len,6);
g_s=g_s.Left(g_len);
ExtTextOut(pDC->GetSafeHdc(),0,m_nYMax-g_nYOffset1-g_i*g_Step-5,//m_nYMax-(i+2)*nStep-5,//g_nXOffset-2,m_nYMax-g_nYOffset1-i*nStep
ETO_OPAQUE,NULL,g_s,g_s.GetLength(),NULL);
}
/////X Zhou----->
g_nXStep=(rc.Width()-g_nXOffset)/(g_nTotalNum+1);
wsprintf(g_cc,_T("%d年%d月"),g_time1.GetYear(),g_time1.GetMonth());
if(g_time1.GetMonth()>0)
ExtTextOut(pDC->GetSafeHdc(),2,m_nYMax+18,
ETO_OPAQUE,NULL,g_cc,_tcslen(g_cc),NULL);
g_d=g_time1.GetMonth();
for(g_i=0;g_i<g_nTotalNum;g_i++)
{
pDC->MoveTo(g_nXOffset+(g_i+1)*g_nXStep,m_nYMax-2);
pDC->LineTo(g_nXOffset+(g_i+1)*g_nXStep,m_nYMax+2);
if(g_nTotalNum<20)
{
wsprintf(g_cc,_T("%d"),g_DayArray[g_i]);
if(g_i%2==0)
ExtTextOut(pDC->GetSafeHdc(),g_nXOffset+(g_i+1)*g_nXStep-2,m_nYMax+4,
ETO_OPAQUE,NULL,g_cc,_tcslen(g_cc),NULL);
else
ExtTextOut(pDC->GetSafeHdc(),g_nXOffset+(g_i+1)*g_nXStep-2,m_nYMax-16,
ETO_OPAQUE,NULL,g_cc,_tcslen(g_cc),NULL);
}
if(g_d!=g_MonthArray[g_i])
{
g_d=g_MonthArray[g_i];
wsprintf(g_cc,_T("%d月"),g_MonthArray[g_i]);
//AfxMessageBox(g_cc);
ExtTextOut(pDC->GetSafeHdc(),g_nXOffset+(g_i+1)*g_nXStep-2,m_nYMax+18,
ETO_OPAQUE,NULL,g_cc,_tcslen(g_cc),NULL);
}
}
}
}
BOOL CKXianTu::DestroyWindow()
{
g_YearArray.RemoveAll();
g_MonthArray.RemoveAll();
g_DayArray.RemoveAll();
g_ZuiGaoJiaArray.RemoveAll();
g_ZuiDiJiaArray.RemoveAll();
g_KaiPanJiaArray.RemoveAll();
g_ShouPanJiaArray.RemoveAll();
return CDialog::DestroyWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -