📄 trymovetree3_4view.cpp
字号:
// trymovetree3_4View.cpp : implementation of the CTrymovetree3_4View class
//
//Copyright:04本3班 赖删珊。
//此程序功能:在单文档中显示一个二叉树,并用动态演示它的遍历顺序
//作者:赖删珊。完成日期:2005年11月18日
//当前的版本号:LSS.04,该程序比LSS.03版本的多了菜单的选择功能,而且界面要好看一点,
//没有了红色画笔留下的痕迹,。另外,这里的flag是私有变量,而trymovetree3_2View.cpp
//里的flag是公有变量,功能是一样的。
#include "stdafx.h"
#include "trymovetree3_4.h"
#include "trymovetree3_4Doc.h"
#include "trymovetree3_4View.h"
#include <stack>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
using namespace std;
typedef stack<int> STACK_INT;
STACK_INT stack1;
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View
IMPLEMENT_DYNCREATE(CTrymovetree3_4View, CView)
BEGIN_MESSAGE_MAP(CTrymovetree3_4View, CView)
//{{AFX_MSG_MAP(CTrymovetree3_4View)
ON_COMMAND(ID_create, Oncreate)
ON_COMMAND(ID_move, Onmove)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View construction/destruction
CTrymovetree3_4View::CTrymovetree3_4View()
{
// TODO: add construction code here
flag=0;
}
CTrymovetree3_4View::~CTrymovetree3_4View()
{
}
BOOL CTrymovetree3_4View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View drawing
void CTrymovetree3_4View::OnDraw(CDC* pDC)
{
CTrymovetree3_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(flag==1||flag==2)
{
//生成二叉树
char CHAR[10]={' ','A','B','C','D',',','E','F',',','G'}; //此数组是按二叉树层次遍历排列的
int length=10; //传入数组长度
int x,y; //用来设置坐标的变化
if(CHAR[1]!=',')
{
pDC->Ellipse(400,50,370,20); //画第一个圆
pDC->TextOut(380,25,CHAR[1]); //输出圆里的字符
}
for (int i=1;i<length/2;i++)
{
if(i%2==0) //若i为偶数,令x向左走
x=370-45*(i/2);
if(i%2==1) //若i为奇数,令x向右走
x=370+45*(i/2);
y=20+45*(i/2); //y无论是奇,偶都是向下走
if(CHAR[2*i]!=',') //若CHAR[i]的左孩子存在,则画一向左倾斜的斜线和一个圆,并输出圆里的字符
{
pDC->MoveTo(x+4.4,y+25.6);
pDC->LineTo( x+4.4-30, y+25.6+30 );
pDC->Ellipse( x-15,y+75,x-45,y+45);
pDC->TextOut( x-35,y+50,CHAR[2*i] );
}
if(CHAR[2*i+1]!=',') //若CHAR[i]的右孩子存在,则画一向右倾斜的斜线和一个圆,并输出圆里的字符
{
pDC->MoveTo( x+25.6, y+25.6);
pDC->LineTo( x+25.6+30, y+25.6+30);
pDC->Ellipse(x+75,y+75,x+45,y+45);
pDC->TextOut(x+45+10,y+45+5,CHAR[2*i+1]);
}
}
}
if(flag==2)
{
//动态演示
char CHAR[10]={' ','A','B','C','D',',','E','F',',','G'};
int k=0;
int length=10;
pDC->TextOut(170,200,"遍历顺序为:");
CPen pen; //创建画笔变量
COLORREF oldbackcolor=pDC->GetBkColor(); //获取背景颜色
char e; //用来放从队列中POP出来的字符
char a[7]={'A','B','D','G','C','E','F'}; //暂时代替队列
int j;
for(j=0;j<7;j++)
{
e=a[j];
for(int i=1;i<length;i++) //此for循环控制查找到e所对应的i的值
{
if(e==CHAR[i])
{ //根据i的值找到它所对应的坐标x,y的值
int x=370;
int y=35;
while(i!=1) //把从根走到i所经过的结点序号依次保存在栈里
{
stack1.push(i);
i=i/2;
}
while(!stack1.empty())
{
i=stack1.top();
stack1.pop();
if(i==1)
continue;
if(i%2==0) //i为偶数,则x向左走
x=x-45;
if(i%2==1) //i为奇数,则x向右走
x=x+45;
y=y+45; //无论i为奇数或偶数,y都向下走
}
pDC->TextOut(270+k*20,200,CHAR[i]); //输出所遍历到的字符
k++;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0)); //把红色画笔设为当前的画笔
pDC->SelectObject(&pen);
pDC->MoveTo(x,y); //画箭头"--->"
pDC->LineTo(x-30,y);
pDC->MoveTo(x,y);
pDC->LineTo(x-10,y-10);
pDC->MoveTo(x,y);
pDC->LineTo(x-10,y+10);
pen.DeleteObject(); //释放画笔
Sleep(1500); //延时
pen.CreatePen(PS_SOLID,2,oldbackcolor); //把背景颜色画笔设为当前的画笔画刷
pDC->SelectObject(&pen);
pDC->Rectangle(x+1,y+11,x-31,y-11); //画一矩形把箭头覆盖住
pen.DeleteObject(); //释放画笔
i=length; //控制跳出for循环
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View printing
BOOL CTrymovetree3_4View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTrymovetree3_4View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTrymovetree3_4View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View diagnostics
#ifdef _DEBUG
void CTrymovetree3_4View::AssertValid() const
{
CView::AssertValid();
}
void CTrymovetree3_4View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CTrymovetree3_4Doc* CTrymovetree3_4View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTrymovetree3_4Doc)));
return (CTrymovetree3_4Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTrymovetree3_4View message handlers
void CTrymovetree3_4View::Oncreate()
{
// TODO: Add your command handler code here
flag=1;
Invalidate(TRUE);
}
void CTrymovetree3_4View::Onmove()
{
// TODO: Add your command handler code here
flag=2;
Invalidate(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -