绘制正弦曲线,实现局部放大
2011-05-24 00:36
465 查看
.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);
}
// 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);
}
相关文章推荐
- 自制绘制曲线组件-可局部放大缩小功能(C++ 与 QML结合)
- Python图形绘制操作之正弦曲线实现方法分析
- jQuery实现 图片的局部放大效果
- android端基于openCV实现局部放大
- iOS 利用UICollectionView横向滚动、余弦函数曲线特性实现居中放大的卡片浏览工具 XLCardSwitch
- 绘制正弦曲线
- 绘制正弦曲线
- 使用plot绘制正弦与与余弦函数曲线图实例代码
- wpf利用Visifire.Chart实现实时曲线绘制
- 使用opencv实现图像局部放大功能
- 绘制正弦曲线和余弦曲线
- 控制台绘制正弦/余弦曲线
- 利用jQuery UI 实现图片局部放大
- AChartEngine实现Android实时曲线绘制
- C++开发-绘制正弦曲线
- Python使用matplotlib绘制正弦和余弦曲线的方法示例
- Java_Swing实现小球沿正弦曲线运动的代码
- silverlight实现图片局部放大效果的方法
- WPF/Silverlight实现图片局部放大的方法分析
- MFC图形界面绘制坐标系及正弦曲线