⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pathview.cpp

📁 文字的特殊现实效果
💻 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 + -