📄 rbtreeview.cpp
字号:
// RBTreeView.cpp : CRBTreeView 类的实现
//
#include "stdafx.h"
#include "RBTree.h"
#include "MainFrm.h"
#include "RBTreeDoc.h"
#include "RBTreeView.h"
#include ".\rbtreeview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CRBTreeView
IMPLEMENT_DYNCREATE(CRBTreeView, CView)
BEGIN_MESSAGE_MAP(CRBTreeView, CView, CSInsert, CSDelete)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_COMMAND(ID_SHOW, OnShow)
ON_BN_CLICKED(ID_DEL_OK, OnShow)
ON_BN_CLICKED(ID_INS_OK, OnShow)
END_MESSAGE_MAP()
// CRBTreeView 构造/析构
CRBTreeView::CRBTreeView()
{
// TODO: 在此处添加构造代码
}
CRBTreeView::~CRBTreeView()
{
}
BOOL CRBTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CView::PreCreateWindow(cs);
}
// CRBTreeView 绘制
void CRBTreeView::OnDraw(CDC* pDC)
{
CRBTreeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDoc->UpdateAllViews(this);
extern RBTree rbtree;
rbtree.Fixlevel();
CRect rc;
GetClientRect(&rc);
rbtree.FixPosition(rc.right,rc.left);
RBTreeNode * node =rbtree.GetRoot();
Show(node);
}
int CRBTreeView::Draw(long x,long y,BOOL state)
{
return 0;
/*
*/
}
int CRBTreeView::Show(RBTreeNode * z)
{
CClientDC dc(this);
extern RBTree rbtree;
RBTreeNode * Nil = rbtree.Nil;
CString strvalue;
CString strsize;
CString strlevel;
if(z!=Nil)
{
long cx=z->x;
long cy=z->y;
long level=z->level;
strvalue.Format("value:%d",z->value);
strsize.Format("size:%d",z->size);
strlevel.Format("level:%d",z->level);
if(z->leftchild!=Nil)
{
Show(z->leftchild);
}
if(z->rightchild!=Nil)
{
Show(z->rightchild);
}
dc.MoveTo(cx,cy);
// dc.TextOut(cx+23,cy+16,strsize);
if(z->parent!=Nil)
{
dc.MoveTo(z->x,z->y);
dc.LineTo(z->parent->x,z->parent->y);
}
HBITMAP hbitmap;
if(z->color==RED)
hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_RED));
else hbitmap=::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BLACK));
HDC hMemDC=::CreateCompatibleDC(NULL);
SelectObject(hMemDC,hbitmap);
::StretchBlt(dc.m_hDC,(cx-24),cy,47,47,hMemDC,0,0,47,47,SRCCOPY);
::DeleteDC(hMemDC);
::DeleteObject(hbitmap);
dc.TextOut(cx-8,cy+46,strvalue);
dc.TextOut(cx-8,cy+62,strsize);
dc.TextOut(cx-8,cy+78,strlevel);
// dc.TextOut(cx+10,cy+24,strlevel);
return 0;
return 0;
}
else
return 0;
}
void CRBTreeView::OnShow()
{
// OnPreparePrinting(pInfo);
CRBTreeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPaintDC dc(this);
Invalidate(1);
OnDraw(&dc);
}
// CRBTreeView 打印
BOOL CRBTreeView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CRBTreeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CRBTreeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CRBTreeView 诊断
#ifdef _DEBUG
void CRBTreeView::AssertValid() const
{
CView::AssertValid();
}
void CRBTreeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CRBTreeDoc* CRBTreeView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRBTreeDoc)));
return (CRBTreeDoc*)m_pDocument;
}
#endif //_DEBUG
// CRBTreeView 消息处理程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -