📄 pathview.cpp
字号:
// PathView.cpp : implementation of the CPathView class
//
#include "stdafx.h"
#include "Path.h"
#include "PathDoc.h"
#include "PathView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPathView
IMPLEMENT_DYNCREATE(CPathView, CView)
BEGIN_MESSAGE_MAP(CPathView, CView)
//{{AFX_MSG_MAP(CPathView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPathView construction/destruction
CPathView::CPathView()
{
m_font.CreateFont(200,0,0,0,FW_BLACK,FALSE,FALSE,FALSE,
GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN,"楷体_GB2312");
}
CPathView::~CPathView()
{
}
BOOL CPathView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CPathView drawing
void CPathView::OnDraw(CDC* pDC)
{
CPathDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RECT rect;
GetClientRect(&rect);
CFont* pOldFont=(CFont*)pDC->SelectObject(&m_font);
pDC->SetBkMode(TRANSPARENT);
// 定义路径
pDC->BeginPath();
pDC->TextOut(0,10,"柳",2);
pDC->TextOut(200,10,"暗",2);
pDC->TextOut(400,10,"花",2);
pDC->TextOut(600,10,"明",2);
pDC->EndPath();
pDC->SelectObject(pOldFont);
// 获取路径数据
int nCount=pDC->GetPath(NULL,NULL,0);
CPoint* points=new CPoint[nCount];
BYTE* bytes=new BYTE[nCount];
pDC->GetPath(points,bytes,nCount);
//对路径定义点按余弦曲线进行变换
int i;
for(i=0;i<nCount;i++)
points[i].y=points[i].y+(int)(80*cos(points[i].x/300.*3.1415926)+100);
// 依据新的路径信息构造一新的路径
CPoint ptStart;
pDC->BeginPath();
for(i=0;i<nCount;i++)
{
switch(bytes[i])
{
case PT_MOVETO:
pDC->MoveTo(points[i]);
ptStart=points[i];
break;
case PT_LINETO:
pDC->LineTo(points[i]);
break;
case PT_BEZIERTO:
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
case PT_BEZIERTO|PT_CLOSEFIGURE:
points[i+2]=ptStart;
pDC->PolyBezierTo(points+i,3);
i=i+2;
break;
case PT_LINETO|PT_CLOSEFIGURE:
pDC->LineTo(ptStart);
break;
}
}
pDC->CloseFigure();
pDC->EndPath();
// 绘制窗口灰色背景
CBrush* pOldBrush=(CBrush*)(pDC->SelectStockObject(GRAY_BRUSH));
pDC->Rectangle(&rect);
pDC->SelectObject(pOldBrush);
// 设置裁剪路径
pDC->SetPolyFillMode(WINDING);
pDC->SelectClipPath(RGN_COPY);
// 用位图填充裁剪区域
CBitmap bmp;
CBitmap* pBmpOld;
bmp.LoadBitmap(IDB_BMP);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
pBmpOld=dcMem.SelectObject(&bmp);
pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcMem,0,0,314,197,SRCCOPY);
dcMem.SelectObject(pBmpOld);
dcMem.DeleteDC();
bmp.DeleteObject();
}
/////////////////////////////////////////////////////////////////////////////
// CPathView diagnostics
#ifdef _DEBUG
void CPathView::AssertValid() const
{
CView::AssertValid();
}
void CPathView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CPathDoc* CPathView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPathDoc)));
return (CPathDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPathView message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -