我有一个枚举:
type Tool =
| Rectangle = 0
| Circle = 1
用于保存枚举值的变量:
let mutable selectedTool : Tool = Tool.Rectangle
我有两个按钮:
let btn (location:Point) (size:Size) =
let bt = new Button()
do bt.Location <- location
do bt.Size <- size
bt
// These badboys right here:
let rectangleButton = btn (Point(0, 0)) (Size(50,50))
let ellipseButton = btn (Point(50, 0)) (Size(50,50))
他们每人都有一个事件连接到他们:
let btnRectEvent = rectangleButton.Click.Add(fun(x) -> selectedTool <-Tool.Rectangle)
let btnElliEvent = ellipseButton.Click.Add(fun(x) -> selectedTool <- Tool.Circle)
我希望我的事件能够更改selectedTool变量的值。
目前,它不起作用。
然后我在我的绘图区域记录我的MouseDown事件以使用此事件绘制形状:
let mouseEvent =
let x = selectedTool
form.MouseDown
|> Event.add ( fun (evArgs1) ->
if x = Tool.Circle then
graphics.Graphics.DrawEllipse(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
else
graphics.Graphics.DrawRectangle(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
form.Refresh())
表单运行如下:
form.Controls.Add(rectangleButton)
form.Controls.Add(ellipseButton)
form.Show()
while form.Created do
Application.DoEvents()
奖金问题但不需要回答:
是否有可能在按钮上捕捉点击事件,等待绘图区域上的mousedown事件,放置我的形状的第一个角落,当我移动鼠标时预览形状,并设置第二个角落在mouseUp上,以一种不太过分的方式?
TL; DR红利问题:我可以像在MSPaint中一样轻松地进行矩形绘制工作吗?
答案 0 :(得分:1)
所以我发现了这个问题:
当你做
时let x = selectedTool
form.MouseDown
|> Event.add ( fun (evArgs1) ->
Something goes here
lambda x内部不会改变。您可能想要在lambda之前删除let x = ...
或使用这样的ref单元格:
let selectedTool = ref Rectangle
然后你用
分配selectedTool := Circle
并使用
获取值if (!selectedTool) = Circle
虽然比赛会更常见 - 比如说
form.MouseDown
|> Event.add ( fun (evArgs1) ->
match (!selectedTool) with
|Circle -> graphics.Graphics.DrawEllipse(whitePen, evArgs1.X, evArgs1.Y, 15, 15)
|Rectangle -> graphics.Graphics.DrawRectangle(whitePen, evArgs1.X, evArgs1.Y, 15,15)
form.Refresh())