// DlgChart.cpp : implementation file
//
#include "stdafx.h"
#include "page.h"
#include "DlgChart.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CDlgChart dialog
CDlgChart::CDlgChart(CWnd* pParent /*=NULL*/)
: CDialog(CDlgChart::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgChart)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDlgChart::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgChart)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgChart, CDialog)
//{{AFX_MSG_MAP(CDlgChart)
ON_WM_PAINT()
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CDlgChart message handlers
BOOL CDlgChart::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_pstatic = (CStatic*)GetDlgItem(IDC_PICCHAT);
CRect rect; //矩形区域对象
CWnd *pWnd; //得到图片框的窗口指针
pWnd=GetDlgItem(IDC_PICCHAT);
m_dc = pWnd->GetDC();
m_chart = new CLinepic(m_dc);
m_pstatic->GetClientRect( &rectStaticClient );
rectStaticClient.NormalizeRect();
m_size.cx=rectStaticClient.Size().cx;
m_size.cy=rectStaticClient.Size().cy;
m_size.cx = rectStaticClient.Width(); // zero based
m_size.cy = rectStaticClient.Height(); // zero based
m_pstatic->ClientToScreen( &rectStaticClient );
ScreenToClient( &rectStaticClient);
m_pt.x = rectStaticClient.left;
m_pt.y = rectStaticClient.top;
offsetx= m_pt.x;
offsety= m_pt.y;
m_chart->SetScale(1000,1000);
// m_chart->DoGradientFill(m_dc,&rectStaticClient);
m_chart->ReSetRange(rectStaticClient.Width(),rectStaticClient.Height());
m_iXxishu=1;m_iYxishu=4;
/* m_chart->DrawMarker(2,0,0,true);
m_chart->DrawMarker(4,4,0,true);
m_chart->DrawMarker(8,8,0,true);
m_chart->DrawMarker(16,8,0,true);
m_chart->DrawMarker(32,12,0,true);
m_chart->DrawMarker(48,8,0,true);
InvalidateRect(&rectStaticClient);*/
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgChart::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.BitBlt(offsetx,offsety,m_size.cx,m_size.cy,
m_chart->GetMemDC(),0,0,SRCCOPY);
// TODO: Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
}
/***********************************************************
在窗口显示时计算并绘制概率密度函数,由于绘图模块本身只支持整数
坐标而本功能需要实现支持至少3位小数的坐标绘制,因此只能再绘制
前将绘制比例缩小,再将坐标变大(*10000取整)。
同时由于需要将所有点都绘制在绘图区域内,所以需要将最终绘图的x
和y值按比例放大或缩小。
绘图模块将按照等间距绘制m_icount个点。因此数据越多,绘制的点越
密
************************************************************/
void CDlgChart::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
int iXValue,iYValue;
double dNormal,dFangcha,dAverage,dXValue,dOffset;
dNormal=dFangcha=dAverage=dXValue=dOffset=0;
CRect tCrect;CRect* ptCrect=&tCrect;
double dMinus = (m_aiTestValue[m_icount-1]-m_aiTestValue[0]) / m_icount;
// TODO: Add your message handler code here
ptCrect = m_chart->GetRect();
switch(m_bTestType)
{
case TEST_TYPE_DZPD:
m_iXxishu=1;m_iYxishu=8;
break;
case TEST_TYPE_JYGD:
m_iXxishu=1;m_iYxishu=4;
break;
case TEST_TYPE_JH:
m_iXxishu=1;m_iYxishu=4;
break;
case TEST_TYPE_KJWZJY:
m_iXxishu=1;m_iYxishu=4;
break;
case TEST_TYPE_SSTJQ:
m_iXxishu=1;m_iYxishu=4;
break;
case TEST_TYPE_ZYFP:
m_iXxishu=1;m_iYxishu=4;
break;
case TEST_TYPE_ZYLJZL:
m_iXxishu=1;m_iYxishu=4;
break;
default:
break;
}
dMinus = dMinus*(ptCrect->right-30)/(m_aiTestValue[m_icount-1]*100-30);//按比例修改
dAverage = Anverage(m_aiTestValue,m_icount);
dFangcha = Fangcha(m_aiTestValue,m_icount,dAverage);
dOffset = Normal(dAverage,dAverage,dFangcha);
for (int i=0;i<m_icount;i++)
{
/* dXValue = (m_aiTestValue[0]+i*dMinus)*ptCrect->right/(m_aiTestValue[m_icount-1]*100);
dNormal = Normal(dXValue,dAverage,dFangcha);
iXValue = floor((dXValue-(m_aiTestValue[0])*ptCrect->right/(m_aiTestValue[m_icount-1]*100))*10000);
iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
m_chart->DrawMarker(iXValue,iYValue,0,true);*/
/* dXValue = (m_aiTestValue[i]);
dNormal = Normal(dXValue,dAverage,dFangcha);
iXValue = floor((dXValue-m_aiTestValue[0])*10000);
iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
m_chart->DrawMarker(iXValue,iYValue,0,true);*/
dXValue = (m_aiTestValue[0]+i*dMinus);
dNormal = Normal(dXValue,dAverage,dFangcha);
iXValue = floor((dXValue-m_aiTestValue[0])*10000);
iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));//按比例修改
m_chart->DrawMarker(iXValue,iYValue,0,true);
}
iXValue = floor((dAverage-m_aiTestValue[0])*10000);
int iYValueEnd = floor(dOffset*10000*(ptCrect->bottom-30)/(dOffset*100));
m_chart->DrawLine(iXValue,0,iXValue,iYValueEnd);
dXValue = m_LatestValue;
dNormal = Normal(dXValue,dAverage,dFangcha);
iXValue = floor((dXValue-m_aiTestValue[0])*10000);
iYValue = floor(dNormal*10000*(ptCrect->bottom-30)/(dOffset*100));
m_chart->DrawMarker(iXValue,iYValue,1,true);
}
double CDlgChart::Anverage(double a[],int n)
{
double sum=0,sum1=0;
double dAnverage=0,adverage1=0;
for(int i=0;i<=n-1;i++)
{
sum+=a[i];
}
dAnverage=sum/n;
return dAnverage;
}
double CDlgChart::Fangcha(double a[],int n,double dAnv)
{
double sum=0;
double dAnverage=0;
for(int i=0;i<=n-1;i++)
sum+=(a[i]-dAnv)*(a[i]-dAnv);
dAnverage=sum/n;
return dAnverage;
}
double CDlgChart::Normal(double x,double miu,double sigma) //概率密度函数
{
return (1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma)));
}
linepic
BOOL CLinepic::DrawMarker(int x,int y,int index,BOOL bmark)
{
int xc,yc,xold,yold,xover,yover;
COLORREF color;
switch (index)
{
case 0:
{
color = RGB(0,255,0);
break;
}
case 1:
{
color = RGB(255,255,0);
break;
}
case 2:
{
color = RGB(255,0,0);
break;
}
case 3:
{
color = RGB(255,0,255);
break;
}
case 4:
{
color = RGB(0,255,255);
break;
}
default:
{
color = RGB(255,255,255);
break;
}
}
xc = x*xUnit/xscale+30-XOvalue;
yc = m_rcclient.bottom-y*yUnit/yscale;
xold = pointlast[index].x*xUnit/xscale+30;
yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;
/* xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;//-1避开重绘区
yc = m_rcclient.bottom-y*yUnit/yscale;
xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
yold = m_rcclient.bottom-pointlast[index].y*yUnit/yscale;
if(yc>=m_rcclient.bottom)
yc=m_rcclient.bottom-1;
if(yold>=m_rcclient.bottom)
yold=m_rcclient.bottom-1;*///090222
/* xc = x*xUnit/xscale+30-XOvalue;
xold = pointlast[index].x*xUnit/xscale+30-XOvalue;*/
/* if(xc>m_rcclient.right-5)
{
MoveRange(xc-m_rcclient.right+5);
xc = x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
xold = pointlast[index].x*xUnit/xscale-XOvalue+(m_rcclient.right/xUnit)*xUnit-1;
}*///hhh090222
if (bmark)
{
if (1!=index)
{
m_hPenNew.CreatePen(PS_SOLID,2,color);
VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
POINT p[4];
p[0].x = xc - 3;
p[0].y = yc;
p[1].x = xc;
p[1].y = yc + 3;
p[2].x = xc + 3;
p[2].y = yc;
p[3].x = xc;
p[3].y = yc - 3;
m_dcMemL.Polygon(p, 4);
m_dcMemL.SelectObject(m_hPenOld);
m_hPenNew.DeleteObject();
}
if (1==index)
{
xc = x*xUnit/xscale+30;
yc = m_rcclient.bottom-y*yUnit/yscale;
m_hPenNew.CreatePen(PS_SOLID,2,color);
VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
POINT p[4];
p[0].x = xc - 3;
p[0].y = yc;
p[1].x = xc;
p[1].y = yc + 3;
p[2].x = xc + 3;
p[2].y = yc;
p[3].x = xc;
p[3].y = yc - 3;
m_dcMemL.Polygon(p, 4);
m_dcMemL.SelectObject(m_hPenOld);
m_hPenNew.DeleteObject();
/* VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);
m_dcMemL.TextOut(xc,yc,"本次成绩");
m_dcMemL.SelectObject(m_pOldFont);
m_pNewFont.DeleteObject();*/
//m_dcMemL.SetBkColor(RGB(0,0,0));
m_dcMemL.SetTextColor(color);
//m_hPenNew.CreatePen(PS_SOLID,1,color);
//VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
m_dcMemL.SelectStockObject(NULL_BRUSH);
//m_dcMemL.MoveTo(0,topempty-1);
//m_dcMemL.LineTo(m_rcclient.right,topempty-1);
VERIFY(m_pNewFont.CreatePointFont(110, "宋体", &m_dcMemL));
m_pOldFont = m_dcMemL.SelectObject(&m_pNewFont);
m_dcMemL.TextOut(xc+5,yc-5,"本次成绩");
m_dcMemL.SelectObject(m_pOldFont);
m_pNewFont.DeleteObject();
}
}
if(1!=index)
{
m_hPenNew.CreatePen(PS_SOLID,1,color);
VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
// m_dcMemL.SelectStockObject(BLACK_PEN);
/* if(pointlast[index].x!=0)
{*/
if(yc<topempty&&yold<topempty)
{
m_dcMemL.MoveTo(xold-1,topempty);
m_dcMemL.LineTo(xc,topempty);
}
else if(yc<topempty)
{
xover = xc-(topempty-yc)*(xc-xold)/(yold-yc);
yover = topempty;
m_dcMemL.MoveTo(xold,yold);
m_dcMemL.LineTo(xover,yover);
m_dcMemL.MoveTo(xover,topempty);
m_dcMemL.LineTo(xc,topempty);
}
else if(yold<topempty)
{
xover = (topempty-yold)*(xc-xold)/(yc-yold)+xold;
yover = topempty;
m_dcMemL.MoveTo(xover,yover);
m_dcMemL.LineTo(xc,yc);
m_dcMemL.MoveTo(xover,topempty);
m_dcMemL.LineTo(xold-1,topempty);
}
else
{
m_dcMemL.MoveTo(xold,yold);
m_dcMemL.LineTo(xc,yc);
}
/* }
else
{
m_dcMemL.MoveTo(xc,m_rcclient.bottom);
m_dcMemL.LineTo(xc,yc);
}*/
/* if(0==pointlast[index].x)
{
;//m_dcMemL.MoveTo(xold,yold);
//m_dcMemL.LineTo(xc,yc);
}
else
{
m_dcMemL.MoveTo(xold,yold);
m_dcMemL.LineTo(xover,yover);
}*/
m_dcMemL.SelectObject(m_hPenOld);
m_hPenNew.DeleteObject();
}
pointlast[index].x = x;
pointlast[index].y = y;
return TRUE;
}
BOOL CLinepic::DrawLine(int x,int y,int xend,int yend)
{
int xc,yc,xcend,ycend;
xc= yc=xcend= ycend=0;
xc = x*xUnit/xscale+30;
yc = m_rcclient.bottom-y*yUnit/yscale;
xcend = xend*xUnit/xscale+30;
ycend = m_rcclient.bottom-yend*yUnit/yscale;
m_hPenNew.CreatePen(PS_SOLID,1,RGB(255,255,255));
VERIFY(m_hPenOld = m_dcMemL.SelectObject(&m_hPenNew));
m_dcMemL.MoveTo(xc,yc);
m_dcMemL.LineTo(xcend,ycend);
m_dcMemL.SelectObject(m_hPenOld);
m_hPenNew.DeleteObject();
return true;
}