F # и Winforms - PullRequest
       9

F # и Winforms

3 голосов
/ 04 января 2012

У меня есть такая программа

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"?

Иначе, есть ли способ добавить прямоугольники в качестве дочерних контроллеров на панель или симулированный объект winform?

Спасибо

1 Ответ

1 голос
/ 04 января 2012

Я не знаю, как получить эти прямоугольники таким образом.

Лучшее, что вы можете сделать, это создать класс 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.

Также обратите внимание, что, поскольку он был прокомментирован Гансом, событие Paint не сработает, пока вы не вызовете Invalidate ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...