在窗体上绘制正方形

时间:2014-01-08 22:23:26

标签: forms f#

我正在尝试使用方形对象列表在表单上绘制正方形。

let listOfSquares = ResizeArray()

type square(x : float, y : float) =
  let x = x
  let y = y
  let length = 50
  let height = 50

我正在使用下拉菜单在点击时创建一个正方形,然后我有另一个菜单按钮使表单无效

let square = create.DropDownItems.Add("Square")
let invalidate = file.DropDownItems.Add("Invalidate")
square.Click.Add(fun _ -> listOfSquares.Add(new square(50.0, 50.0)))
invalidate.Click.Add(fun _ -> form.Invalidate())

我遇到的问题是OnPaint方法不会绘制正方形,但每次单击菜单按钮方块时它都会添加到列表中。

  override form.OnPaint e = 
  let g = e.Graphics
  for square in listOfSquares do
  g.FillRectangle(Brushes.Aqua, 300, 150, 48, 48);

我尝试手动将值添加到列表中,然后运行如下所示的程序

override form.OnPaint e = 
  listOfSquares.Add(50,50)

  let g = e.Graphics
  for square in listOfSquares do
  g.FillRectangle(Brushes.Aqua, 300, 150, 48, 48);

哪个有效,我相信问题出在form.invalidate但我对f#来说很新,我找不到问题。

1 个答案:

答案 0 :(得分:2)

首先,您需要添加一种从方型中提取属性的方法。我个人只是在这里使用记录:

type Square = { X : int; Y : int; Length : int; Height: int }

有了这个,你需要点击处理程序:

square.Click.Add(fun _ -> listOfSquares.Add({ X = 50; Y = 50 ; Width = 50; Height = 50)))

您的OnPaint方法需要实际绘制正方形:

override form.OnPaint e = 
  let g = e.Graphics
  for square in listOfSquares do
    g.FillRectangle(Brushes.Aqua, square.X, square.Y, square.Length, square.Height);

请注意,这会在同一位置添加所有方块,因此它们将被堆叠。当然,你想要改变逻辑,每次都将它们放在独特的位置(改变X和Y)。


编辑:

经过进一步调查,问题实际上是在{0}的错误范围内有listOfSquares的额外let绑定,导致事件处理程序添加到错误的集合中。这意味着OnPaint覆盖正在针对与事件处理程序不同的ResizeArray进行操作。