// Other2SaleChart.cpp : implementation file // #include "stdafx.h" #include "ylgl.h" #include "Other2SaleChart.h" #include "VcPlot.h" #include "VcAxis.h" #include "VcValueScale.h" #include "VcSeriesCollection.h" #include "VcSeries.h" #include "VcPen.h" #include "VcCategoryScale.h" #include "VcColor.h" #include "VcDataGrid.h" #include "VcBackdrop.h" #include "VcFill.h" #include "VcBrush.h" #include "VcDataPoints.h" #include "VcDataPoint.h" #include "VcDataPointLabel.h" #include "VcAxisTitle.h" #include "ShowMschart.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Other2SaleChart dialog Other2SaleChart::Other2SaleChart(CWnd* pParent /*=NULL*/) : CDialog(Other2SaleChart::IDD, pParent) { //{{AFX_DATA_INIT(Other2SaleChart) m_year = atoi(g_date.Mid(0, 4)); m_bInit = 0; //}}AFX_DATA_INIT } void Other2SaleChart::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(Other2SaleChart) DDX_Control(pDX, IDC_LIST1, m_List1); DDX_Control(pDX, IDC_SPIN1, m_spinyear); DDX_Control(pDX, IDC_MSCHART1, m_Chart); DDX_Text(pDX, IDC_EDITyear, m_year); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(Other2SaleChart, CDialog) //{{AFX_MSG_MAP(Other2SaleChart) ON_EN_CHANGE(IDC_EDITyear, OnChangeEDITyear) ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Other2SaleChart message handlers BOOL Other2SaleChart::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_spinyear.SetRange(1900, 3000); VARIANT var; m_Chart.GetBackdrop().GetFill().SetStyle(1); m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255); m_Chart.SetShowLegend(TRUE); m_Chart.SetChartType(1); // 栈模式 m_Chart.SetStacking(FALSE); m_Chart.GetPlot().GetAxis(1, var).GetValueScale().SetAuto(1); // 不自动标注Y轴刻度 m_Chart.GetPlot().GetAxis(0, var).GetCategoryScale().SetAuto(0); // 不自动标注X轴刻度 m_Chart.GetPlot().GetAxis(0, var).GetCategoryScale().SetDivisionsPerLabel(1);// 每刻度一个标注 m_Chart.GetPlot().GetAxis(0, var).GetCategoryScale().SetDivisionsPerTick(1); // 每刻度一个刻度线 m_Chart.SetColumnCount(6); m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(255, 0, 0); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(0, 255, 0); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(0, 0, 255); m_Chart.GetPlot().GetSeriesCollection().GetItem(4).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(0, 255, 255); m_Chart.GetPlot().GetSeriesCollection().GetItem(5).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(255, 255, 0); m_Chart.GetPlot().GetSeriesCollection().GetItem(6).GetDataPoints().GetItem(-1).GetBrush().GetFillColor().Set(255, 0, 255); // 线宽(对点线图有效) m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(30); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(30); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(30); m_Chart.GetPlot().GetSeriesCollection().GetItem(4).GetPen().SetWidth(30); m_Chart.GetPlot().GetSeriesCollection().GetItem(5).GetPen().SetWidth(30); m_Chart.GetPlot().GetSeriesCollection().GetItem(6).GetPen().SetWidth(30); // 数据点类型显示数据值的模式(对柱柱状图和点线图有效) // 0: 不显示 1: 显示在柱状图外 // 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方 m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(4).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(5).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(6).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_bInit = 1; GetData(); MoveWindow(g_rc); CRect rc, rc2, rc3; GetClientRect(rc); GetDlgItem(IDC_EDITyear)->GetWindowRect(rc2); ScreenToClient(rc2); int top = rc2.bottom + 5; m_List1.GetWindowRect(rc2); ScreenToClient(rc2); rc2.top = top; rc2.bottom = rc.bottom; m_List1.MoveWindow(rc2); rc2.left = rc2.right; rc2.right = rc.right; m_Chart.MoveWindow(rc2); GetDlgItem(IDC_STATIC2)->GetWindowRect(rc2); ScreenToClient(rc2); int dt = rc.right - rc2.right; rc2.left += dt; rc2.right += dt; GetDlgItem(IDC_STATIC2)->MoveWindow(rc2); GetDlgItem(IDC_EDITyear)->GetWindowRect(rc2); ScreenToClient(rc2); rc2.left += dt / 2; rc2.right += dt / 2; GetDlgItem(IDC_EDITyear)->MoveWindow(rc2); GetDlgItem(IDC_STATIC1)->GetWindowRect(rc2); ScreenToClient(rc2); rc2.left += dt / 2; rc2.right += dt / 2; GetDlgItem(IDC_STATIC1)->MoveWindow(rc2); m_spinyear.GetWindowRect(rc2); ScreenToClient(rc2); rc2.left += dt / 2; rc2.right += dt / 2; m_spinyear.MoveWindow(rc2); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void Other2SaleChart::GetData() { if (m_bInit == 0)return; m_spinyear.EnableWindow(0); UpdateData(); int i; BOOL bLastYear = 0; BOOL bThisYear = 0; int g_nYearposTemp = g_nYearpos; #if JEFF_TEST_ON // 2015开始禁用跨年数据; int g_nYearposPre = -1; if (m_year >= 2014 && m_year <= atoi(g_date.Left(4)) && g_hisyeararray.GetSize()) { g_nYearpos = -1; bThisYear = 1; if (m_year == 2014) { g_nYearposPre = GetYearPos(m_year - 1); } } else if (m_year <= 2013 && g_hisyeararray.GetSize()) { g_nYearpos = GetYearPos(m_year); if (g_nYearpos != -1) g_nYearposPre = GetYearPos(m_year - 1); bLastYear = 1; } #else if (m_year == atoi(g_date.Left(4)) && g_hisyeararray.GetSize()) bThisYear = 1; else if (m_year <= atoi(g_date.Left(4)) - 1 && g_hisyeararray.GetSize()) bLastYear = 1; g_nYearpos = GetYearPos(m_year); #endif g_sendhead.bsql = 0; g_sendhead.code[0] = 198; g_sendhead.tabcount = 1; CString sql, strdate, strdate2; strdate.Format("%04d-%02d-%02d", m_year, 1, 1); strdate2.Format("%04d-%02d-%02d", m_year, 12, 31); sql.Format("date>='" + strdate + "' and date<='" + strdate2 + "'"); g_pMainWnd->ProcessChatMessageRequest2(sql); if (g_bSendOK == 0) { g_nYearpos = g_nYearposTemp; m_spinyear.EnableWindow(1); return; } DataToArray(&other2salearray); if (bLastYear)//如果是去年, 则加今年的补款 { g_nYearpos = -1;//今年 g_sendhead.bsql = 0; g_sendhead.code[0] = 198; g_sendhead.tabcount = 1; g_pMainWnd->ProcessChatMessageRequest2(sql); if (g_bSendOK == 0) { g_nYearpos = g_nYearposTemp; m_spinyear.EnableWindow(1); return; } CArrayThisYearother2salearray; DataToArray(&ThisYearother2salearray); int oldsize; oldsize = other2salearray.GetSize(); other2salearray.SetSize(oldsize + ThisYearother2salearray.GetSize()); for (i = oldsize; i < oldsize + ThisYearother2salearray.GetSize(); i++) { other2salearray.ElementAt(i).Copy(ThisYearother2salearray.ElementAt(i - oldsize)); } } else if (bThisYear)//如果是今年, 则加去年的补款 { g_nYearpos = 0;//去年 g_sendhead.bsql = 0; g_sendhead.code[0] = 198; g_sendhead.tabcount = 1; g_pMainWnd->ProcessChatMessageRequest2(sql); if (g_bSendOK == 0) { g_nYearpos = g_nYearposTemp; m_spinyear.EnableWindow(1); return; } CArrayThisYearother2salearray; DataToArray(&ThisYearother2salearray); int oldsize; oldsize = other2salearray.GetSize(); other2salearray.SetSize(oldsize + ThisYearother2salearray.GetSize()); for (i = oldsize; i < oldsize + ThisYearother2salearray.GetSize(); i++) { other2salearray.ElementAt(i).Copy(ThisYearother2salearray.ElementAt(i - oldsize)); } } g_nYearpos = g_nYearposTemp; KindChange(); m_spinyear.EnableWindow(1); } void Other2SaleChart::KindChange() { int i = 0; float incomedata1[12] = { 0 }; float incomedata2[12] = { 0 }; float incomedata3[12] = { 0 }; float incomedata4[12] = { 0 }; float incomedata5[12] = { 0 }; float incomedata6[12] = { 0 }; CString stryear[12] = { "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" }; CStringArray array; for (i = 0; i < other2salearray.GetSize(); i++) { if (::FindArray(&array, other2salearray.ElementAt(i).ElementAt(0)) == -1) array.Add(other2salearray.ElementAt(i).ElementAt(0)); } for (i = 0; i < array.GetSize(); i++) { if (FindList(array.ElementAt(i)) == -1) m_List1.AddString(array.ElementAt(i)); } CStringArray arraytemp; arraytemp.Copy(array); array.RemoveAll(); if (m_selarray.GetSize())array.Copy(m_selarray); while (array.GetSize()>6) array.RemoveAt(array.GetSize() - 1); if (array.GetSize() < 6) { for (int i = 0; i < arraytemp.GetSize(); i++) { if (::FindArray(&array, arraytemp.ElementAt(i)) == -1) { array.Add(arraytemp.ElementAt(i)); if (array.GetSize() >= 6)break; } } } m_Chart.SetColumnCount(array.GetSize()); for (i = 0; i < array.GetSize(); i++) { m_Chart.SetColumn(i + 1); m_Chart.SetColumnLabel((LPCTSTR)array.ElementAt(i)); } for (i = 0; i < other2salearray.GetSize(); i++) { if (array.GetSize() > 0) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(0)) incomedata1[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } if (array.GetSize() > 1) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(1)) incomedata2[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } if (array.GetSize() > 2) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(2)) incomedata3[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } if (array.GetSize() > 3) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(3)) incomedata4[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } if (array.GetSize() > 4) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(4)) incomedata5[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } if (array.GetSize() > 5) { if (other2salearray.ElementAt(i).ElementAt(0) == array.ElementAt(5)) incomedata6[atoi(other2salearray.ElementAt(i).ElementAt(5).Mid(5, 2)) - 1] += atof(other2salearray.ElementAt(i).ElementAt(4)); } } int nRowCount = 12;// VARIANT var; m_Chart.SetRowCount(nRowCount); for (int row = 1; row <= nRowCount; ++row) { m_Chart.SetRow(row); m_Chart.SetRowLabel(stryear[row - 1]); if (array.GetSize() > 0) m_Chart.GetDataGrid().SetData(row, 1, incomedata1[row - 1], 0); if (array.GetSize() > 1) m_Chart.GetDataGrid().SetData(row, 2, incomedata2[row - 1], 0); if (array.GetSize() > 2) m_Chart.GetDataGrid().SetData(row, 3, incomedata3[row - 1], 0); if (array.GetSize() > 3) m_Chart.GetDataGrid().SetData(row, 4, incomedata4[row - 1], 0); if (array.GetSize() > 4) m_Chart.GetDataGrid().SetData(row, 5, incomedata5[row - 1], 0); if (array.GetSize() > 5) m_Chart.GetDataGrid().SetData(row, 6, incomedata6[row - 1], 0); } m_Chart.Refresh(); } void Other2SaleChart::OnChangeEDITyear() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetData(); // TODO: Add your control notification handler code here } void Other2SaleChart::OnSelchangeList1() { // TODO: Add your control notification handler code here UpdateData(); int count = m_List1.GetSelCount(); if (count == 0)return; m_selarray.RemoveAll(); int *pIndex = new int[count]; m_List1.GetSelItems(count, pIndex); CString str; for (int i = 0; i < count; i++) { m_List1.GetText(pIndex[i], str); m_selarray.Add(str); } delete[]pIndex; KindChange(); } int Other2SaleChart::FindList(CString str) { CString temp; for (int i = 0; i < m_List1.GetCount(); i++) { m_List1.GetText(i, temp); if (str == temp)return i; } return -1; } BEGIN_EVENTSINK_MAP(Other2SaleChart, CDialog) //{{AFX_EVENTSINK_MAP(Other2SaleChart) ON_EVENT(Other2SaleChart, IDC_MSCHART1, -601 /* DblClick */, OnDblClickMschart1, VTS_NONE) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() extern BOOL g_bShowMsChart; extern HWND g_hShowChartWnd; void Other2SaleChart::OnDblClickMschart1() { // TODO: Add your control notification handler code here if (g_bShowMsChart) { ::SendMessage(g_hShowChartWnd, WM_CLOSE, 0, 0); return; } g_bShowMsChart = 1; CRect rc; m_Chart.GetWindowRect(rc); ScreenToClient(rc); ShowMschart dlg; dlg.m_pParent = this; dlg.m_pChart = &m_Chart; dlg.DoModal(); m_Chart.MoveWindow(rc); g_bShowMsChart = 0; }