Листинг 4.6. Рисование дерева
void DrawNode(Node p) //
изображение дерева
{
int R = 12;
if (p.left != null)
g.DrawLine(MyPen,p.x, p.y,p.left.x,p.left.y);
if (p.right != null)
g.DrawLine(MyPen, p.x, p.y, p.right.x,
p.right.y);
if (p.visit)
MyBrush = (SolidBrush)Brushes.Yellow;
else
MyBrush = (SolidBrush)Brushes.LightYellow;
g.FillEllipse(MyBrush, p.x - R, p.y - R,
2*R, 2*R);
g.DrawEllipse(MyPen, p.x - R, p.y - R, 2*R, 2*R);
string s = Convert.ToString(p.data);
SizeF size = g.MeasureString(s, MyFont);
g.DrawString(s, MyFont, Brushes.Black,
p.x - size.Width / 2, p.y - size.Height / 2);
if (p.left != null)
DrawNode(p.left);
if (p.right != null)
DrawNode(p.right);
}
В процессе рисования один узел может наложиться на другой. Поэтому
в программе предусмотрено перемещение узла с помощью мыши. Соответст-
вующие обработчики событий приведены в листинге 4.7.
14 / 23
84
Листинг 4.7. Перемещение мышью узла дерева
private void FormMain_MouseDown(object sender,
MouseEventArgs e)
{
myTree.DeSelect(myTree.top);
myTree.SelectNode =
myTree.FindNode(myTree.top, e.X,e.Y);
drawing = myTree.SelectNode != null;
if (drawing)
myTree.SelectNode.visit = true;
}
private void FormMain_MouseMove(object sender,
MouseEventArgs e)
{
if (drawing)
myTree.Delta(myTree.SelectNode,
myTree.SelectNode.x –
e.X, myTree.SelectNode.y - e.Y);
else
{
myTree.DeSelect(myTree.top);
myTree.SelectNode=myTree.FindNode(myTree.top,
e.X,e.Y);
if (myTree.SelectNode != null)
myTree.SelectNode.visit = true;
}
MyDraw();
15 / 23
85
}
private void FormMain_MouseUp(object sender,
MouseEventArgs e)
{
drawing = false;
}
Обработчик события FormMain_ MouseDown, выполняющийся при
нажатии на левую кнопку мыши, вызывает метод FindNode(), в котором
производится поиск узла, который будет перемещаться. Этому методу в ка-
честве параметров передаются координаты указателя мыши (листинг 4.8).
Do'stlaringiz bilan baham: |