您的位置:首页 > 其它

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

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: