我正在尝试使用一系列正方形对象在表格上绘制正方形。
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#来说还是很新,我找不到问题。
首先,您需要添加一种从方形类型中提取属性的方法。我个人只是在这里使用记录:
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)。
编辑:
经过进一步调查,问题实际上是listOfSquares
在错误的范围内还有一个额外的let绑定,这导致事件处理程序添加到错误的集合中。这意味着OnPaint
重写ResizeArray
与事件处理程序的作用不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句