所以这是我在Form类中的代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BstTree tree = new BstTree();
tree.addRoot(50);
for (int i = 1; i < 50; i++)
{
int b = rnd.Next(1, 100);
listBox1.Items.Add(b);
tree.AddNode(tree.root, b);
}
tree.treeOutput(tree.root, this);
}
public void draw(Point prevPT, Point currentPT)
{
Graphics p = CreateGraphics();
Pen pen = new Pen(Color.Red, 5);
p.DrawLine(pen, prevPT, currentPT);
}
}
我有BstTree类,我从那里调用draw方法:
public Class BstTree
{
public void treeOutput(Node root, Form1 f)
{
Label node = new Label();
node.AutoSize = true;
node.Text = root.value.ToString();
node.Location = pt;
root.ancPT = pt;
f.Controls.Add(node);
f.draw(root.ancestor.ancPT, pt);
}
}
但它没有画任何东西,不知道如何解决这个问题......
答案 0 :(得分:1)
在位图中绘制是静态的,您可以使用自己的Graphics
对象来实现;然而,在WinForms中绘制是非常动态的,因为绘图是非常短暂的。最小化表单,调整表单大小,将表单部分移出可见屏幕区域或在表单顶部打开另一个应用程序可能会破坏绘制的内容。因此,只要必须重新绘制表单,控件或其中的一部分,Windows操作系统就会通过向应用程序发送消息来实现一种巧妙的绘图机制。这会在应用程序中引发绘制事件,这意味着操作系统确定何时必须绘制(或重绘)事物。因此,绘图例程必须出现在paint事件处理程序中。
如果您想自己绘制树节点,请通过从TreeView
派生树节点来创建自己的树控件,并相应地更改DrawMode
。
public class MyTreeView : TreeView
{
public MyTreeView()
{
DrawMode = TreeViewDrawMode.OwnerDrawAll;
}
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
if (e.Node.IsVisible) {
// Draw background of node.
if (e.Node == e.Node.TreeView.SelectedNode) {
e.Graphics.FillRectangle(Brushes.LightBlue, e.Bounds);
} else {
e.Graphics.FillRectangle(Brushes.White, e.Bounds);
}
using (Pen p = new Pen(Color.Red, 5))
{
// TODO: Implement your drawing logic here
}
e.Graphics.DrawString(e.Node.Text, this.Font, Brushes.Black,
e.Bounds.Left + delta, e.Bounds.Top + 1);
}
}
}
这只是原始草图。您可能需要考虑其他详细信息,例如e.Node.IsExpanded
和e.State
。