2017-11-15 13 views
-1

だからここに私は自分のフォームクラスを持っているコードです:Windowsフォーム:Graphics.Drawline doesntの仕事

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); 
     } 
} 

しかし、何も描画しません。どのようにこの問題を解決するのか分かりません。

+1

ここで 'treeOutput'メソッドを呼び出していますか?関連するコードを表示してください(とあなたのデバッグ作業) – UnholySheep

+0

問題を再現するテスト可能なコードを提供してください。ここで欠けている部分が多すぎます。 'pt'とは何ですか? 'Node'とは何ですか?私はそれらの部分が単に省略され、問題を再現できると思う。 –

+0

まあ、デバッグについて言えば、描画メソッドが適切に管理し、すべての正しい入力パラメータを取得すると言うことができます – WhiteRaven

答えて

1

ビットマップの描画は静的であり、独自のGraphicsオブジェクトを使用して描画できます。しかし、図面は非常に一時的なので、WinFormsでの描画は非常に動的です。フォームの最小化、フォームのサイズ変更、フォームを表示画面領域から部分的に移動する、またはフォームの上に別のアプリケーションを開くと、描画されたものが破壊される可能性があります。したがって、Windowsオペレーティングシステムは、フォーム、コントロール、またはそれらの一部を再描画する必要があるときはいつでも、アプリケーションにメッセージを送信することによって、巧妙な描画メカニズムを実装します。これにより、アプリケーション内のペイントイベントが発生し、OSが描画(または再描画)するタイミングを決定することを意味します。そのため、描画ルーチンはペイントイベントハンドラ内で実行する必要があります。

ツリーノードを自分で描画する場合は、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.IsExpandede.Stateのような他の詳細を考慮する必要があるかもしれません。

関連する問題