绘制正弦曲线,实现局部放大

来源:互联网 发布:ubuntu中安装超级终端 编辑:程序博客网 时间:2024/05/02 01:20

.h文件

// DC_curveView.h : CDC_curveView 类的接口
//


#pragma once


class CDC_curveView : public /*CView*/CScrollView
{
protected: // 仅从序列化创建
 CDC_curveView();
 DECLARE_DYNCREATE(CDC_curveView)

// 属性
public:
 CDC_curveDoc* GetDocument() const;

// 操作
public:

// 重写
public:
 virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
 virtual ~CDC_curveView();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
 DECLARE_MESSAGE_MAP()
public:
 virtual void OnInitialUpdate();
public:
 CBitmap m_MemMap;
 CDC m_MemDc;

 CBitmap m_BigMemMap;
 CDC m_BigMemDc;
 void DrawSin();

 bool m_isBigShow;

 CRect m_CliRect;

 float m_MultipleBig;

protected:
 virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
public:
 afx_msg void OnPaint();
public:
 afx_msg void OnSize(UINT nType, int cx, int cy);
public:
 afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
public:
 afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
public:
 afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
public:
 afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
public:
 afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
public:
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
public:
 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};

#ifndef _DEBUG  // DC_curveView.cpp 中的调试版本
inline CDC_curveDoc* CDC_curveView::GetDocument() const
   { return reinterpret_cast<CDC_curveDoc*>(m_pDocument); }
#endif

 

 

.cpp文件

// DC_curveView.cpp : CDC_curveView 类的实现
//

#include "stdafx.h"
#include "DC_curve.h"

#include "DC_curveDoc.h"
#include "DC_curveView.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDC_curveView

IMPLEMENT_DYNCREATE(CDC_curveView, CScrollView)

BEGIN_MESSAGE_MAP(CDC_curveView, CScrollView)
 // 标准打印命令
 ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CScrollView::OnFilePrintPreview)
 ON_WM_PAINT()
 ON_WM_SIZE()
 ON_WM_VSCROLL()
 ON_WM_HSCROLL()
 ON_WM_MBUTTONDOWN()
 ON_WM_MOUSEWHEEL()
 ON_WM_RBUTTONUP()
 ON_WM_MOUSEMOVE()
 ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

// CDC_curveView 构造/析构

CDC_curveView::CDC_curveView()
{
 // TODO: 在此处添加构造代码
 m_isBigShow = false;
 m_MultipleBig=2;

}

CDC_curveView::~CDC_curveView()
{
}

BOOL CDC_curveView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改
 //  CREATESTRUCT cs 来修改窗口类或样式

 return CView::PreCreateWindow(cs);
}

// CDC_curveView 绘制

void CDC_curveView::OnDraw(CDC* /*pDC*/)
{
 CDC_curveDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

 // TODO: 在此处为本机数据添加绘制代码
}


// CDC_curveView 打印

BOOL CDC_curveView::OnPreparePrinting(CPrintInfo* pInfo)
{
 // 默认准备
 return DoPreparePrinting(pInfo);
}

void CDC_curveView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: 添加额外的打印前进行的初始化过程
}

void CDC_curveView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: 添加打印后进行的清除过程
}


// CDC_curveView 诊断

#ifdef _DEBUG
void CDC_curveView::AssertValid() const
{
 CView::AssertValid();
}

void CDC_curveView::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

CDC_curveDoc* CDC_curveView::GetDocument() const // 非调试版本是内联的
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDC_curveDoc)));
 return (CDC_curveDoc*)m_pDocument;
}
#endif //_DEBUG


// CDC_curveView 消息处理程序

void CDC_curveView::OnInitialUpdate()
{
 CView::OnInitialUpdate();

 // TODO: 在此添加专用代码和/或调用基类
 SIZE ScroSize={3000,1500};
 SetScrollSizes(MM_TEXT,ScroSize);
 CDC *pDC = GetDC();

 m_MemMap.CreateCompatibleBitmap(pDC,3000,1500);
 m_MemDc.CreateCompatibleDC(pDC);
 m_MemDc.SelectObject(m_MemMap);
 m_MemDc.FillSolidRect(0,0,3000,1500,RGB(255,255,255));

 m_BigMemMap.CreateCompatibleBitmap(pDC,150,150);
 m_BigMemDc.CreateCompatibleDC(pDC);
 m_BigMemDc.SelectObject(m_BigMemMap);
 m_BigMemDc.SetStretchBltMode(HALFTONE);
 //m_BigMemDc.FillSolidRect(0,0,150,150,RGB(0,0,255));
 m_BigMemDc.Rectangle(0,0,150,150);

 GetClientRect(&m_CliRect);

 ReleaseDC(pDC);
 DrawSin();
}

void CDC_curveView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
 // TODO: 在此添加专用代码和/或调用基类

 CView::OnPrint(pDC, pInfo);
}

void CDC_curveView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 // TODO: 在此处添加消息处理程序代码
 // 不为绘图消息调用 CView::OnPaint()
 CClientDC cliDc(this);
 OnPrepareDC(&cliDc);
 CPoint beg_point(0,0);
 cliDc.DPtoLP(&beg_point);


 dc.BitBlt(0,0,m_CliRect.Width(),m_CliRect.Height(),&m_MemDc,beg_point.x,beg_point.y,SRCCOPY);

 if(m_isBigShow)dc.BitBlt(m_CliRect.Width()-151,1,150,150,&m_BigMemDc,0,0,SRCCOPY);


}

void CDC_curveView::OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);

 // TODO: 在此处添加消息处理程序代码
 GetClientRect(&m_CliRect);
}

void CDC_curveView::DrawSin()
{
 m_MemDc.FillSolidRect(0,0,3000,1500,RGB(0,255,255));

 m_MemDc.MoveTo(20,200);
 m_MemDc.LineTo(2500,200);

 m_MemDc.MoveTo(60,380);
 m_MemDc.LineTo(60,20);

 int x=0,y=1;

 m_MemDc.MoveTo(60,200);
 while (x<1080)
 {
  x+=1;
  y = sin(x/180.0*3.1415926)*180;
  m_MemDc.LineTo(x+60,200-y);

 }

}

void CDC_curveView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 //CRect valueRect(CliRect.Width()-151,1,150,150);
 //InvalidateRect(valueRect);
 if(m_isBigShow)Invalidate();

 CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CDC_curveView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 if(m_isBigShow)Invalidate();
 CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CDC_curveView::OnMButtonDown(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 CScrollView::OnMButtonDown(nFlags, point);
}

BOOL CDC_curveView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 CPoint temPoint(pt);
 ScreenToClient(&temPoint);
 if (temPoint.x>m_CliRect.right-150 && temPoint.y<m_CliRect.top+150 && m_isBigShow)
 {
  if (zDelta>0)
  {
   m_MultipleBig+=0.1;
  }
  else
  {
   m_MultipleBig-=0.1;
  }

  if (m_isBigShow>=10)
  {
   m_MultipleBig=10;
  }
  if (m_MultipleBig<=0.1)
  {
   m_MultipleBig = 0.1;
  }
  CString temStr;
  temStr.Format("x %g",m_MultipleBig);
  m_BigMemDc.TextOut(1,1,temStr);
  return TRUE;
 }

 if(m_isBigShow)Invalidate();
 return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}

void CDC_curveView::OnRButtonUp(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 m_isBigShow = !m_isBigShow;
 Invalidate();

 CScrollView::OnRButtonUp(nFlags, point);
}

void CDC_curveView::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 CScrollView::OnMouseMove(nFlags, point);

 if (!m_isBigShow)
 {
  return;
 }

 m_BigMemDc.FillSolidRect(0,0,150,150,RGB(0,0,255));

 CClientDC cliDc(this);
 OnPrepareDC(&cliDc);
 cliDc.DPtoLP(&point);

 m_BigMemDc.StretchBlt(1,1,148,148,&m_MemDc,point.x-148/2/m_MultipleBig,point.y-148/2/m_MultipleBig,148/m_MultipleBig,148/m_MultipleBig,SRCCOPY);

 CString temStr;
 temStr.Format("x %g",m_MultipleBig);
 m_BigMemDc.TextOut(1,1,temStr);


 GetDC()->BitBlt(m_CliRect.Width()-151,1,150,150,&m_BigMemDc,0,0,SRCCOPY);
}

BOOL CDC_curveView::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 return FALSE;
 //return CScrollView::OnEraseBkgnd(pDC);
}

原创粉丝点击