www.pudn.com > jtlab.rar > createbezier.cpp
#include "stdafx.h"
//#include "math.h"
#include "VCad.h"
#include "VCadDoc.h"
#include "VCadView.h"
#include "MainFrm.h"
#include "Entity.h"
#include "CreateCmd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CCreateBezier::CCreateBezier()
: m_poly(NULL), m_points(0)
{
m_nStep = 0; // 初始化操作步为 0
}
CCreateBezier::~CCreateBezier()
{
}
int CCreateBezier::GetType()
{
return ctCreateBezier;
}
int CCreateBezier::OnLButtonDown(UINT nFlags, const Position& pos)
{POLYP * q;
m_nStep++; // 每次单击鼠标左键时操作步加 1
if(m_nStep==1) // 根据操作步执行相应的操作
{
q=new POLYP;
q->p = pos;
q->next=NULL;
m_poly=q;
m_fp1=m_ep1=pos;
::Prompt("请输入特征多边形的下一点:") ;
}
else
{
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
CLine* pTempLine = new CLine(m_fp1,m_ep1);
pTempLine->Draw(pDC, dmDrag);
delete pTempLine;
q=new POLYP;
q->p = pos;
q->next=m_poly;
m_poly=q;
CLine* pNewLine = new CLine(m_fp1,m_ep1);// 根据起点和终点创建直线
pNewLine->Draw(pDC,dmNormal); // 绘制直线
g_pDoc->m_EntityList.AddTail(pNewLine); // 将直线指针添加到图元链表
g_pDoc->SetModifiedFlag(TRUE);// set modified flag ;
m_fp1=m_ep1;
m_ep1=pos;
g_pView->ReleaseDC(pDC);
::Prompt("请输入下一点(点击右键,结束):") ;
}
return 0;
}
int CCreateBezier::OnMouseMove(UINT nFlags, const Position& pos)
{
// 用一静态变量nPreRefresh记录进入本函数的刷新次数
static int nPreRefresh = g_nRefresh;
// 布尔变量bRefresh说明在本函数中视窗是否被刷新
BOOL bRefresh = FALSE;
// nCurRefresh用于记录当前的刷新次数
int nCurRefresh = g_nRefresh;
// 如果nCurRefresh和nPreRefresh不相等,说明视窗曾被刷新过
if(nCurRefresh != nPreRefresh){
bRefresh = TRUE;
nPreRefresh = nCurRefresh;
}
if(m_nStep==0)
{
::Prompt("请输入多边形的第一点:") ;}
else
{
Position prePos, curPos;
prePos = m_ep1; // 获得鼠标所在的前一个位置
curPos = pos;
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
// 创建临时对象擦除上一条橡皮线
CLine* pTempLine1 = new CLine(m_fp1, prePos);
if(!bRefresh) // 当视窗没有被刷新时,重画原来的橡皮线使其被擦除
pTempLine1->Draw(pDC, dmDrag);
delete pTempLine1;
// 创建临时对象,根据当前位置绘制一条橡皮线
CLine* pTempLine2 = new CLine(m_fp1, curPos);
pTempLine2->Draw(pDC, dmDrag);
delete pTempLine2;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
m_ep1 = curPos; // 将当前位置设置为直线终点,以备下一次鼠标移动时用
}
return 0;
}
// 单击鼠标右键结束多边形输入操作
int CCreateBezier::OnRButtonDown(UINT nFlags, const Position& pos)
{POLYP *pp;
// 如果当前的操作步为 1 ,那么要在结束本次操作前擦除上次鼠标移动时绘制的橡皮线
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
CLine* pTempLine = new CLine(m_fp1,m_ep1);
pTempLine->Draw(pDC, dmDrag);
delete pTempLine;
CLine* pNewLine1 = new CLine(m_fp1,m_ep1);// 根据起点和终点创建直线
pNewLine1->Draw(pDC,dmNormal); // 绘制直线
g_pDoc->m_EntityList.AddTail(pNewLine1); // 将直线指针添加到图元链表
g_pDoc->SetModifiedFlag(TRUE);// set modified flag ;
pp=new POLYP;
pp->p = pos;
pp->next=m_poly;
m_poly=pp;
m_fp1=pos;
pp=m_poly;
m_points=m_nStep+1;
m_nStep=0;
CBezier* pTempBezier = new CBezier(m_poly,m_points);
pTempBezier->Draw(pDC, dmDrag);
//g_pDoc->m_EntityList.AddTail(pTempBezier);
delete pTempBezier; // 释放设备环境指针
g_pView->ReleaseDC(pDC);
return 0;
}
// 调用Cancel 函数取消本次操作
int CCreateBezier::Cancel()
{
// 如果当前的操作步为 1 ,那么要在结束本次操作前擦除上次鼠标移动时绘制的橡皮线
/* if(m_nStep == 1){
CDC* pDC = g_pView->GetDC(); // 得到设备环境指针
Position prePos = m_poly; // 获得鼠标所在的前一个位置
CFill* pTempFill = new CFill(&m_poly, m_points);
pTempFill->Draw(pDC, dmDrag); // 擦除上一次绘制的橡皮线
delete pTempFill;
g_pView->ReleaseDC(pDC); // 释放设备环境指针
}
m_nStep = 0; // 将操作步重置为 0
::Prompt("就绪"); // 等待提示新类型的命令操作
*/ return 0 ;
}