?? myview.cpp
字號:
// MyView.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "My.h"
#include "MyDoc.h"
#include "MyView.h"
#include "MyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
ON_COMMAND(ID_INPUT, OnInput)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
const int xOrg = 100;
const int yOrg = 350;
const int xMax = 700;
const int yMin = 20;
const int xMin = xOrg;
const int yMax = yOrg;
if(!pDoc->m_boolNew)
{
//找出最大和最小
double dbXMin = pDoc->m_dbXdata[0];
double dbXMax = pDoc->m_dbXdata[0];
double dbYMin = pDoc->m_dbYdata[0];
double dbYMax = pDoc->m_dbYdata[0];
for(int i=1; i<pDoc->iPt; i++)
{
pDoc->m_dbXdata[i]<dbXMin?dbXMin=pDoc->m_dbXdata[i]:
pDoc->m_dbXdata[i]>dbXMax?dbXMax=pDoc->m_dbXdata[i]:dbXMax;
pDoc->m_dbYdata[i]<dbYMin?dbYMin=pDoc->m_dbYdata[i]:
pDoc->m_dbYdata[i]>dbYMax?dbYMax=pDoc->m_dbYdata[i]:dbYMax;
}
//調(diào)整最大最小值
dbXMax = dbXMax + (dbXMax-dbXMin)/pDoc->iPt;
dbXMin = dbXMin - (dbXMax-dbXMin)/pDoc->iPt;
dbYMax = dbYMax + (dbYMax-dbYMin)/pDoc->iPt;
dbYMin = dbYMin - (dbYMax-dbYMin)/pDoc->iPt;
//換算比率,同時當x或y的最大值和最小值相等或幾乎相等時,限制比率不要太大
double dbXRatio = (dbXMax-dbXMin) < 10e-15 ? 10e-15 : (xMax-xOrg)/(dbXMax-dbXMin);
double dbYRatio = (dbYMax-dbYMin) < 10e-15 ? 10e-15 : (yOrg-yMin)/(dbYMax-dbYMin);
//畫折線
int x = (int) (dbXRatio * (pDoc->m_dbXdata[0]-dbXMin) + xOrg);
int y = (int) (yOrg - dbYRatio * (pDoc->m_dbYdata[0]-dbYMin));
pDC->MoveTo(x,y);
CBrush brushNewBrush(RGB(0, 0, 0));
pDC->SelectObject(&brushNewBrush);
CRect rectSymbol(x-3, y-3, x+3, y+3);
pDC->Ellipse(rectSymbol);
for(i=1; i<pDoc->iPt; i++)
{
x = (int) (dbXRatio * (pDoc->m_dbXdata[i]-dbXMin) + xOrg);
y = (int) (yOrg - dbYRatio * (pDoc->m_dbYdata[i]-dbYMin));
rectSymbol.left = x - 3;
rectSymbol.top = y - 3;
rectSymbol.right = x + 3;
rectSymbol.bottom = y + 3;
pDC->Ellipse(rectSymbol);
pDC->LineTo(x,y);
}
//畫軸
pDC->SelectStockObject(WHITE_BRUSH); //恢復
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xMax,yOrg);
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xOrg,yMin);
//畫刻度
const iNumScal = 8;
double dbXInc = (dbXMax - dbXMin)/iNumScal;
y = yOrg;
for(i = 0; i<=iNumScal; ++i)
{
x = (int) (dbXRatio * i * dbXInc + xOrg);
pDC->MoveTo(x, y);
pDC->LineTo(x, y+8);
CString strBufOut;
strBufOut.Format("%6.2f", (dbXMin + i * dbXInc));
pDC->TextOut(x - 20 , y + 15, strBufOut);
}
double dbYInc = (dbYMax - dbYMin)/iNumScal;
x = xOrg;
for(i = 0; i<=iNumScal; ++i)
{
y = (int) (yOrg - dbYRatio * dbYInc * i);
pDC->MoveTo(x, y);
pDC->LineTo(x - 8, y);
CString strBufOut;
strBufOut.Format("%6.2f", (dbYMin + i * dbYInc));
pDC->TextOut(x - 55 , y - 8, strBufOut);
}
//寫軸標題
x = (xMax-xOrg)/8 * 7;
y = yOrg + 40;
pDC->TextOut(x, y, "X");
x = xOrg - 80;
y = (yOrg - yMin)/8;
pDC->TextOut(x, y, "Y");
}
else //第一次啟動或新建文當時將視圖擦除
{
CRect rectClient;
GetClientRect(rectClient);
pDC->FillSolidRect(rectClient, RGB(255, 255, 255));
}
}
/////////////////////////////////////////////////////////////////////////////
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
void CMyView::OnInput()
{
// TODO: Add your command handler code here
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CMyDlg dlgInput;
int nRet = dlgInput.DoModal(); //顯示對話框
if (nRet == IDOK) //如果是OK按鈕將數(shù)據(jù)保存Doc類
{
pDoc->m_dbXdata[0] = dlgInput.m_dbX1;
pDoc->m_dbXdata[1] = dlgInput.m_dbX2;
pDoc->m_dbXdata[2] = dlgInput.m_dbX3;
pDoc->m_dbXdata[3] = dlgInput.m_dbX4;
pDoc->m_dbXdata[4] = dlgInput.m_dbX5;
pDoc->m_dbXdata[5] = dlgInput.m_dbX6;
pDoc->m_dbXdata[6] = dlgInput.m_dbX7;
pDoc->m_dbXdata[7] = dlgInput.m_dbX8;
pDoc->m_dbXdata[8] = dlgInput.m_dbX9;
pDoc->m_dbXdata[9] = dlgInput.m_dbX10;
pDoc->m_dbYdata[0] = dlgInput.m_dbY1;
pDoc->m_dbYdata[1] = dlgInput.m_dbY2;
pDoc->m_dbYdata[2] = dlgInput.m_dbY3;
pDoc->m_dbYdata[3] = dlgInput.m_dbY4;
pDoc->m_dbYdata[4] = dlgInput.m_dbY5;
pDoc->m_dbYdata[5] = dlgInput.m_dbY6;
pDoc->m_dbYdata[6] = dlgInput.m_dbY7;
pDoc->m_dbYdata[7] = dlgInput.m_dbY8;
pDoc->m_dbYdata[8] = dlgInput.m_dbY9;
pDoc->m_dbYdata[9] = dlgInput.m_dbY10;
pDoc->m_boolNew = false;
Invalidate();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -