我正在尝试使用方形对象列表在表单上绘制正方形。
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#来说很新,我找不到问题。
答案 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
进行操作。