// Gauss.cpp : implementation file // #include "stdafx.h" #include "math.h" #include "Gauss.h" #include "drawfunc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGauss CGauss::CGauss() { } CGauss::~CGauss() { } BEGIN_MESSAGE_MAP(CGauss, CWnd) //{{AFX_MSG_MAP(CGauss) ON_WM_PAINT() ON_WM_ERASEBKGND() ON_WM_SIZE() ON_WM_CREATE() ON_WM_HSCROLL() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGauss message handlers void CGauss::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here drawaxis(&dc); drawfunc(&dc); /* drawxaxis(&dc,5,200,100,3,RGB(0,255,0)); drawyaxis(&dc,50,200,100,3,RGB(0,255,0)); CPen pen(PS_SOLID,3,RGB(0,255,0)); CPen * pOldPen=NULL; pOldPen = dc.SelectObject(&pen); dc.SetBkMode(TRANSPARENT); dc.SetTextColor(RGB(0,255,0)); CFont font; font.CreatePointFont(240,"Arial",&dc); CFont * pOldFont=dc.SelectObject(&font); drawxscale(&dc,35,46,CString("-3")); drawyscale(&dc,88,130,CString("-1")); dc.SelectObject(pOldPen); dc.SelectObject(pOldFont); */ // Do not call CWnd::OnPaint() for painting messages } BOOL CGauss::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CBrush brblack(RGB(0,0,0)); CRect rcClient; GetClientRect(&rcClient); pDC->FillRect(rcClient, &brblack); return TRUE; } void CGauss::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); // TODO: Add your message handler code here CRect rect; this->GetClientRect(&rect); rect.top=rect.bottom-20; rect.right -= 10; rect.left +=10; hscroll.MoveWindow(&rect); this->GetClientRect(&rect); rect.bottom -=10; xbegin = rect.left+rect.Width()*10/100; xend = rect.right-rect.Width()*10/100; xmin = rect.left+rect.Width()*15/100; xmax = rect.right-rect.Width()*15/100; xcur = xO = rect.left+rect.Width()/2; yt1 = rect.top + rect.Height()*10/100; yb1 = rect.top + rect.Height()*35/100; yt2 = rect.top + rect.Height()*55/100; yb2 = rect.top + rect.Height()*80/100; ymax1 = yt1+rect.Height()*5/100; ymax2 = yt2+rect.Height()*5/100; } void CGauss::drawaxis(CDC *pDC) { drawxaxis(pDC,xbegin,xend,yb1,3,RGB(0,255,0)); drawyaxis(pDC,yt1,yb1,xO,3,RGB(0,255,0)); drawxaxis(pDC,xbegin,xend,yb2,3,RGB(0,255,0)); drawyaxis(pDC,yt2,yb2,xO,3,RGB(0,255,0)); CPen pen(PS_SOLID,3,RGB(0,255,0)); CPen * pOldPen=NULL; pOldPen = pDC->SelectObject(&pen); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0,255,0)); CFont font; font.CreatePointFont(240,"Arial",pDC); CFont * pOldFont=pDC->SelectObject(&font); drawxscale(pDC,xmin,yb1,CString("-3")); drawxscale(pDC,xmax,yb1,CString("3")); drawxscale(pDC,xmin,yb2,CString("-3")); drawxscale(pDC,xmax,yb2,CString("3")); drawxscale(pDC,xO,yb1,CString("0")); drawxscale(pDC,xO,yb2,CString("0")); drawyscale(pDC,xO,ymax2,CString("1")); CPen redpen(PS_SOLID,1,RGB(255,0,0)); pDC->SelectObject(&redpen); pDC->MoveTo(xcur,yt1); pDC->LineTo(xcur,yb2); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldFont); } double CGauss::f1(double x) { const double pi = 3.14159265358979; return exp(-x*x/2)/sqrt(2*pi); } double CGauss::f2(double x) { return normdisp(x); } void CGauss::drawfunc(CDC *pDC) { CPen pen(PS_SOLID,2,RGB(255,255,255)); CPen * pOldPen=NULL; CPen nullpen; nullpen.CreateStockObject(NULL_PEN); CBrush brush(RGB(100,100,0)); CBrush * pOldBrush=NULL; pOldBrush = pDC->SelectObject(&brush); CFont font; font.CreatePointFont(120,"Courier",pDC); CFont * pOldFont=pDC->SelectObject(&font); pDC->SetTextColor(RGB(255,255,255)); pDC->SetBkColor(RGB(0,0,0)); pDC->SetTextAlign(TA_LEFT); pDC->SetBkMode(OPAQUE); CPoint pt[601]; CPoint pt2[602]; int i,gnum,ex,ey; gnum=0; for(i=0;i<601;i++) { int j; j=i-300; double x; x=(double)j; x/=100; double y; y=f1(x); int ix,iy; ix = (int)(0.5+xO+x*(xmax-xO)/3.0); iy = (int)(0.5+yb1-y*(yb1-ymax1)/0.398); pt[i]=CPoint(ix,iy); pt2[i]=CPoint(ix,iy); if(ix==xcur){ gnum=i+1; ex=ix; ey=yb1; } } if(gnum != 601) { pt2[gnum]=CPoint(ex,ey); gnum++; } pOldPen=pDC->SelectObject(&nullpen); pDC->Polygon(pt2,gnum); pDC->SelectObject(&pen); pDC->Polyline(pt,601); gnum=0; for(i=0;i<601;i++) { int j; j=i-300; double x; x=(double)j; x/=100; double y; y=f2(x); int ix,iy; ix = (int)(0.5+xO+x*(xmax-xO)/3.0); iy = (int)(0.5+yb2-y*(yb2-ymax2)); pt[i]=CPoint(ix,iy); pt2[i]=CPoint(ix,iy); if(ix==xcur){ gnum=i+1; } } CPen pen2(PS_DASH,1,RGB(192,192,192)); pDC->SelectObject(&pen2); pDC->Polyline(pt,601); pDC->SelectObject(&pen); pDC->Polyline(pt2,gnum); CString s; s.Format("x=%5.2f,y=%7.4f",nowx,f2(nowx)); pDC->TextOut(xbegin,yt2," "); pDC->TextOut(xbegin,yt2,s); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldFont); } int CGauss::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here RECT rect; rect.bottom = 0; rect.left = 0; rect.right=0; rect.top=0; hscroll.Create(SBS_HORZ | SBS_BOTTOMALIGN | WS_VISIBLE, rect,this,111); hscroll.SetScrollRange(0,600); hscroll.SetScrollPos(300,FALSE); nowx = 0; return 0; } void CGauss::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if(pScrollBar->GetDlgCtrlID()==111) { int nCurrentPos=pScrollBar->GetScrollPos(); switch(nSBCode) { case SB_THUMBTRACK: case SB_THUMBPOSITION: pScrollBar->SetScrollPos(nPos); break; case SB_LINELEFT: pScrollBar->SetScrollPos(nCurrentPos-1); break; case SB_LINERIGHT: pScrollBar->SetScrollPos(nCurrentPos+1); break; case SB_PAGELEFT: pScrollBar->SetScrollPos(nCurrentPos-5); break; case SB_PAGERIGHT: pScrollBar->SetScrollPos(nCurrentPos+5); break; } int i; i=pScrollBar->GetScrollPos(); double x; int oldcur=xcur; x=(i-300.0)/100.0; xcur = (int)(0.5+xO+x*(xmax-xO)/3.0); nowx = x; // this->Invalidate(); CRect r; if(xcur >= oldcur){ r.left=oldcur-5; r.right = xcur+5; } else { r.left=xcur-5; r.right=oldcur+5; } r.top = yt1-2; r.bottom = yb2 + 10; this->InvalidateRect(&r); r.left=xbegin; r.right=xbegin+180; r.top=yt2-10; r.bottom=yt2+20; this->InvalidateRect(&r); } CWnd::OnHScroll(nSBCode, nPos, pScrollBar); }