2012-01-04 4 views
3

私がクリックしたときに、このF#とのWinforms

let form = new Form() 
let drawArea = new Panel(Location = new Point(200,0), Height = 600, Width = 800) 
let rectBrush = new SolidBrush(Color.Blue) 
form.Controls.Add(drawArea) 

drawArea.MouseClick.Add(fun args -> 
    drawArea.Paint.Add(fun e -> 
     e.Graphics.FillRectangle(rectBrush, args.X, args.Y, 50, 50))) 

Application.Run(form) 

のようなプログラムがとても青い四角形が表示されています。しかし、これらの矩形はどこに格納されていますか? "drawArea"の一部であるすべての四角形のリストを取得する方法はありますか?

それ以外の場合、パネルまたはsimular winformオブジェクトに子コントローラとして四角形を追加する方法はありますか?

は、私はそのようにこれらの矩形を取得する方法を知らないあなたに

+2

マウスをクリックするたびに、新しいPaintイベントハンドラが追加されます。いいえ、書かれているように長方形を取り出すことはできません。 MouseClickハンドラにリストに矩形を追加させるだけです。 form.Invalidateを呼び出すと、現在動作していないペイントが再描画されます。そして、* one *を使用して、そのリストを反復するイベントハンドラをペイントします。 –

+2

ところで、これの背後にある理由は、Winformsが "即時モード"描画を使用しているためです。 WPFのような他のフレームワークは保持モードを使用します。つまり、後で再利用できるように可視構造を明示的に保存します。 http://msdn.microsoft.com/en-us/library/ff684178(v=vs.85).aspx – wmeyer

+0

ahaも参照してください。情報のおかげで、フォームが即時モードを使用していたか分からなかった。 – OlssN

答えて

1

ありがとうございます。

あなたができることは、Rectangleクラスを作成し、ControlまたはUserControlから継承させることです。次に、保護されたOnPaint(...)メソッドをオーバーライドします。たとえば:

public class FilledRectangle : UserControl 
{ 
    private readonly float x, y, w, h; 
    // also the brush here 

    public FilledRectangle(float x, float y, float w, float h) 
    { 
      this.x = x; 
      // ... 
    } 

    protected override void OnPaint(PaintEventArgs e) // not sure about the event args type name 
    { 
      e.Graphics.FillRectangle(this.myBrush, this.x, this.y, this.w, this.h); 
    } 
} 

今、あなたはそのようなControlsコレクションに、このタイプのオブジェクトを、簡単な追加することができます。

Controls.Add(new FilledRectangle(...)); 

この方法を使えば、簡単に、矩形オブジェクトのコレクションを作成し、それらを作ることができますあなたが望むように行動してください。

上記の例はC#で書かれていますが、F#に移植するのは難しいことではないことに注意してください。私がそれをしていない理由は、その構文にあまり慣れていないからです。あなたの質問は、F#固有ではなく、.NET固有のものです。

また、Hansによってコメントされているため、Invalidate()を呼び出すまでペイントイベントは発生しません。

+0

この情報をお寄せいただき、ありがとうございます。あなたのanswear +コメントが私のニーズを満たしています。 – OlssN

関連する問題