这个问题有那么难吗?
一个部门类: public class Dept
Dept 中可以有的属性:int level; // 部门的层次
string text; // 部门名称
Point location; // 位置
Size size; // 大小
readonly Point NodeTop, NodeBottom, NodeLeft, NodeRight // 表示部门控件每边的中点一个部门集合类
DeptCollection 有 Add, Remove 等方法;一个容器控件, : public DeptPanel : Control {}
DeptPanel 可以加入 部门集合的属性 DeptCollection Depts加入一个部门 int index = Depts.Add(int Level);
当添加部门的时候 DeptPanel 计算 Dept 的位置, 在根据 index 分配 Point, Size 给 Dept:
Depts[index].Point = point; Depts[index].Size = size;Dept 控件自动计算边框中点 NodeTop 等属性值。绘制时:
首先统计一下 DeptPanel 中各 Level 中的 Dept, 如果有必要可以重新分配 Point, Size 属性。然后逐层绘制 Dept。完成后根据上层 Dept 的 NodeTop 属性值 和 下层 Dept 之间进行划线计算,例如:下层 Dept 在左还是右;
返回上层 NodeBottom.Y 和下层 NodeTop.X 的距离中点 Y;
从上层 Dept.NodeBottom 画线到 Point A = (Dept.NodeBottom.X, Y);
从下层 Detp.NodeTop 画线到 Point B = (Dept.NodeTop.X, Y);
在绘制 A 到 B 的直线。这样线条就画好了。下面的自己扩展扩展吧。