2014-01-08 3 views
2

Я пытаюсь рисовать квадраты на форме, используя список квадратных объектов.Рисование квадратов на окнах формы

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 # I не может найти проблему.

+1

Вы никогда не используете «квадрат» в своем цикле в этом коде ..? –

+0

Кроме того, вы должны отступать от тела вашего цикла for ('g.fillrectangle' должен быть отступом еще четырьмя пробелами) –

ответ

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).


Edit:

После дальнейших исследований, проблема была на самом деле, что является дополнительным пусть обязательным для listOfSquares в том объеме, который вызывает обработчик события, чтобы добавить к неправильному коллекции. Это означало, что переопределение OnPaint работало с другим ResizeArray, чем обработчики событий.

+0

Этот OnPaint все еще выполняет рисование, когда я нажимаю на квадрат. Нажмите и аннулирует его. Раньше я пытался с обновлением, но это не имеет никакого значения. – Bobson

+0

@ user2165793 Если вы поставили там точку останова, попадет ли она? –

+0

Это ударяется по строке для квадратов в listOfSquares, но не g.FillRectangle (Brushes.Aqua, square.X, square.Y, square.Length, square.Height) – Bobson

Смежные вопросы