📄 mydrawnode.cpp
字号:
// MyDrawNode.cpp : 实现文件
//
#include "stdafx.h"
#include "BPlusTree.h"
#include "MyDrawNode.h"
#include "parameters.h"
#include <math.h>
// MyDrawNode
CDC* MyDrawNode::m_pDC = NULL;
COLORREF MyDrawNode::m_crNormal = NORMAL_COLOR;
COLORREF MyDrawNode::m_crLight = LIGHT_COLOR;
CPen MyDrawNode::m_penThickNormal;
CPen MyDrawNode::m_penThinNormal;
CPen MyDrawNode::m_penThickDotNormal;
CPen MyDrawNode::m_penThickLight;
CPen MyDrawNode::m_penThinLight;
CPen MyDrawNode::m_penThickDotLight;
CFont MyDrawNode::m_font;
int MyDrawNode::N = MINIMUS_NUMBER_OF_NODE;
MyDrawNode::MyDrawNode()
{
m_pnode = NULL;
m_position = CPoint(0,0);
}
MyDrawNode::~MyDrawNode()
{
}
// MyDrawNode 成员函数
// static fuction
void MyDrawNode::SetDC(CDC* pDC)
{
m_pDC = pDC;
}
void MyDrawNode::Initialization()
{
m_penThickNormal.CreatePen(PS_DASH,THICK_PEN,m_crNormal);
m_penThickDotNormal.CreatePen(PS_DOT,1,m_crNormal);
m_penThinNormal.CreatePen(PS_DASH,THIN_PEN,m_crNormal);
m_penThickLight.CreatePen(PS_DASH,THICK_PEN,m_crLight);
m_penThickDotLight.CreatePen(PS_DOT,1,m_crLight);
m_penThinLight.CreatePen(PS_DASH,THIN_PEN,m_crLight);
m_font.CreateFont(FONT_HEIGHT,FONT_WIDTH,0,0,FONT_WEIGHT,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,NULL);
}
void MyDrawNode::SetN(int n)
{
N = n;
}
void MyDrawNode::SetNormalColor(COLORREF cr)
{
m_crNormal = cr;
}
void MyDrawNode::SetLightColor(COLORREF cr)
{
m_crLight = cr;
}
void MyDrawNode::Create(POINT position)
{
m_position = position;
m_rect.left = m_position.x - KEY_WIDTH*N/2;
m_rect.top = m_position.y;
m_rect.right = m_rect.left + KEY_WIDTH*N;
m_rect.bottom = m_rect.top + KEY_HEIGHT + POINTER_HEIGHT;
}
int MyDrawNode::DrawFont(POINT point,long key,bool bLight)
{
if(!m_pDC) return -1;
m_pDC->SelectObject(&m_font);
if(bLight)
m_pDC->SetTextColor(m_crLight);
else
m_pDC->SetTextColor(m_crNormal);
CString str;
str.Format("%d",key);
int i = 0;
do
{
key = key/10;
i++;
}while(key > 0);
m_pDC->TextOut(point.x - i*FONT_WIDTH/2,point.y - FONT_HEIGHT/2,str);
return i;
}
int MyDrawNode::DrawArrow(POINT ptFrom,POINT ptTo,int type,bool bLight) //type : 0 sPen, 1 bPen, 2 svPen
{
if(!m_pDC) return -1;
if(bLight)
{
if(type == 0)
m_pDC->SelectObject(&m_penThinLight);
else if(type == 1)
m_pDC->SelectObject(&m_penThickLight);
else
m_pDC->SelectObject(&m_penThickDotLight);
}
else
{
if(type == 0)
m_pDC->SelectObject(&m_penThinNormal);
else if(type == 1)
m_pDC->SelectObject(&m_penThickNormal);
else
m_pDC->SelectObject(&m_penThickDotNormal);
}
m_pDC->MoveTo(ptFrom);
m_pDC->LineTo(ptTo);
// draw arrow
double tanA,A,B;
double O = ARROWDEGREE*PI/180;
int x,y,i=1,j=1;
if( (ptFrom.x - ptTo.x < 3) && (ptFrom.x - ptTo.x > -3) )
A = PI/2;
else
{
i = (ptFrom.x-ptTo.x > 0) ? 1 : -1;
j = (ptTo.y-ptFrom.y > 0) ? 1 : -1;
tanA = (double)(ptTo.y-ptFrom.y) / (double)(ptFrom.x-ptTo.x);
A = atan(abs(tanA));
if( (i==1) && (j==1 ) ) ;
else if( (i==-1) && (j==1) ) A = A + PI/2;
else if( (i==-1) && (j==-1) ) A = A + PI;
else if( (i==1) && (j==-1) ) A = -A;
}
for(int n=-1;n<=1;n += 2)
{
B = A + n*O;
if(B < 0)
{ B = -B; i = 1; j = -1; }
else if(B < PI/2)
{ i = 1; j = 1; }
else if(B < PI)
{ B = PI - B; i = -1; j = 1; }
else
{ B = B - PI; i = -1; j = -1; }
x = (int)(ARROWLEGHT * cos(B));
y = (int)(ARROWLEGHT * sin(B));
m_pDC->MoveTo(ptTo);
m_pDC->LineTo(ptTo.x + i*x,ptTo.y - j*y);
}
return 0;
}
void MyDrawNode::DrawNode(MyNode* pnode,POINT position,bool bLight)
{
m_pnode = pnode;
Create(position);
if(m_pnode->m_level == 1)
DrawLeaf(bLight);
else
DrawBranch(bLight);
return;
}
void MyDrawNode::DrawBranch(bool bLight)
{
// draw other
CPen* oldPen;
POINT pt;
int i;
// draw rect
if(bLight)
oldPen = m_pDC->SelectObject(&m_penThickLight);
else
oldPen = m_pDC->SelectObject(&m_penThickNormal);
m_pDC->Rectangle(&m_rect);
// draw line
if(bLight)
m_pDC->SelectObject(&m_penThinLight);
else
m_pDC->SelectObject(&m_penThinNormal);
// ---------
m_pDC->MoveTo(m_rect.left,m_position.y + KEY_HEIGHT);
m_pDC->LineTo(m_rect.right,m_position.y + KEY_HEIGHT);
// | | | |
for(i=1;i<m_pnode->N;i++)
{
m_pDC->MoveTo(m_rect.left+KEY_WIDTH*i,m_position.y);
m_pDC->LineTo(m_rect.left+KEY_WIDTH*i,m_position.y + KEY_HEIGHT);
}
// | | | | |
int width = (KEY_WIDTH*N)/(N+1);
for(i=1;i<=m_pnode->N;i++)
{
m_pDC->MoveTo(m_rect.left+width*i,m_rect.bottom - POINTER_HEIGHT);
m_pDC->LineTo(m_rect.left+width*i,m_rect.bottom);
}
m_pDC->SelectObject(oldPen);
// draw key;
pt.x = m_rect.left + KEY_WIDTH/2;
pt.y = m_rect.top + KEY_HEIGHT/2;
for(i=0;i<m_pnode->m_n;i++)
{
DrawFont(pt,m_pnode->k[i],bLight);
pt.x += KEY_HEIGHT;
}
}
void MyDrawNode::DrawLeaf(bool bLight)
{
// draw other
CPen* oldPen;
int i;
POINT pt,pt2,pt3;
RECT rect;
// draw rect
if(bLight)
oldPen = m_pDC->SelectObject(&m_penThickLight);
else
oldPen = m_pDC->SelectObject(&m_penThickNormal);
pt.x = pt.y = LEAF_CORNER;
m_pDC->RoundRect(&m_rect,pt);
// draw line
if(bLight)
m_pDC->SelectObject(&m_penThinLight);
else
m_pDC->SelectObject(&m_penThinNormal);
// ---------
m_pDC->MoveTo(m_rect.left,m_position.y + KEY_HEIGHT);
m_pDC->LineTo(m_rect.right,m_position.y + KEY_HEIGHT);
// | | | |
for(i=1;i<m_pnode->N;i++)
{
m_pDC->MoveTo(m_rect.left+KEY_WIDTH*i,m_rect.top);
m_pDC->LineTo(m_rect.left+KEY_WIDTH*i,m_rect.bottom);
}
// draw ]
rect.left = m_rect.right;
rect.top = m_rect.top + KEY_HEIGHT;
rect.right = rect.left + LEAF_NEXT_WIDTH;
rect.bottom = rect.top + POINTER_HEIGHT;
m_pDC->Rectangle(&rect);
//draw ->
if(((MyLeaf*)m_pnode)->m_next)
{
pt.x = rect.right;
pt.y = rect.top + POINTER_HEIGHT/2;
pt2.x = m_rect.right + DISTANCE;
pt2.y = pt.y;
DrawArrow(pt,pt2,0,bLight);
}
// draw key;
pt.x = m_rect.left + KEY_WIDTH/2;
pt.y = m_rect.top + KEY_HEIGHT/2;
for(i=0;i<m_pnode->m_n;i++)
{
DrawFont(pt,m_pnode->k[i],bLight);
pt.x += KEY_HEIGHT;
}
// draw point key
pt.x = m_rect.left + KEY_WIDTH/2;
pt.y = m_rect.bottom;
pt2.y = pt.y + LEAF_KEY_POINT_LONGTH;
rect.top = pt2.y;
rect.bottom = rect.top + 2*LEAF_KEY_POINT_RADIUS;
pt3.y = pt2.y + LEAF_KEY_POINT_RADIUS;
for(i=0;i<m_pnode->m_n;i++)
{
pt2.x = pt.x;
DrawArrow(pt,pt2,0,bLight);
rect.left = pt.x - LEAF_KEY_POINT_RADIUS;
rect.right = pt.x + LEAF_KEY_POINT_RADIUS;
m_pDC->Ellipse(&rect);
pt3.x = pt.x;
DrawFont(pt3,*(long*)m_pnode->p[i],bLight);
pt.x += KEY_WIDTH;
}
m_pDC->SelectObject(oldPen);
}
void MyDrawNode::DrawInsertKey(long key)
{
POINT pt,pt2;
RECT rect;
pt.x = m_rect.right;
pt.y = m_rect.bottom + LEAF_KEY_POINT_LONGTH/2;
pt2.x = pt.x + KEY_WIDTH/2;
pt2.y = pt.y + LEAF_KEY_POINT_LONGTH;
DrawArrow(pt2,pt,0,true);
rect.left = pt2.x - LEAF_KEY_POINT_RADIUS;
rect.right = pt2.x + LEAF_KEY_POINT_RADIUS;
rect.top = pt2.y;
rect.bottom = rect.top + 2*LEAF_KEY_POINT_RADIUS;
m_pDC->Ellipse(&rect);
pt2.y += LEAF_KEY_POINT_RADIUS;
DrawFont(pt2,key,true);
}
POINT MyDrawNode::GetFirstPointFrom()
{
POINT point;
point.x = m_rect.left + (KEY_WIDTH*N)/(N+1)/2;
point.y = m_rect.bottom;
return point;
}
int MyDrawNode::GetPointDistance()
{
return (KEY_WIDTH*N)/(N+1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -