2016-01-14 5 views
1

Почему я могу запустить следующий код без ошибок под кнопкой, но даже не под формой?Код для рисования работает в событии нажатия кнопки, но не в загрузке формы

For Each line As String In System.IO.File.ReadAllLines("c:\pos.xml") 

    If line.Contains("<POS>") = True Then 

     Dim tagless As String = StripTags(line) 

     Dim parts As String() = tagless.Split(New Char() {","}) 
     Dim XVAL As Decimal = parts(0) 
     Dim YVAL As Decimal = parts(1) 

     'paint markers... 
     Dim myBrush As New SolidBrush(Color.FromArgb(128, Color.Red)) 
     Dim formGraphics As System.Drawing.Graphics 
     formGraphics = Me.PictureBox1.CreateGraphics() 
     formGraphics.FillEllipse(myBrush, New Rectangle(XVAL - 35, YVAL - 35, 70, 70)) 

     myBrush.Dispose() 
     formGraphics.Dispose() 

    End If 
Next 

Вот функция striptag если requierd ...

Function StripTags(ByVal html As String) As String 
    ' Remove HTML tags. 
    Return Regex.Replace(html, "<.*?>", "") 
End Function 
+1

У вас есть ошибка? Что происходит? Материал, который вы нарисовываете, не будет сохраняться таким образом: перетащите что-то по форме или скройте, и оно исчезнет. – Plutonix

+1

*** какие ошибки вы получаете, если есть? *** Где он не работает? – Codexer

+0

Вы должны сделать весь свой рисунок в событии рисования формы. При загрузке формы форма по-прежнему загружается, и, таким образом, будет существовать краска даже после загрузки, которая удалит все вычеркнутые символы. –

ответ

1

Правильный способ сделать это вряд ли когда-либо с CreateGraphics. Это приведет к тому, что не сохранится. Когда область недействительна, например, форма минимизирована или другая форма/приложение перетаскивается по ней, ваши фигуры исчезнут.

Вы должны также включить Option Strict. В коде есть многочисленные ошибки типа. Например, нет конструктора Rectangle, который занимает Decimal. Это даже не правильный класс для нецелых чисел, но RectangleF не принимает десятичное значение.


Ядро проблема состоит в том, что форма показана в конце события загрузки формы. Итак, ваш код работает/рисуется до того, как форма видна, и ничего не отображается. Даже если форма была уже показана, все, что вы рисуете, не будет сохранено, если пользователь минимизирует форму или переместит другое окно через нее.

' form level list to store the data 
Private XY As New List(Of PointF)  ' pts 

Тогда в случае загрузки формы, читать данные и добавить в список

For Each line As String In System.IO.File.ReadAllLines("...") 
    If line.Contains("<POS>") = True Then 
     Dim tagless As String = StripTags(line) 

     '          c required under Option Strict 
     Dim parts As String() = tagless.Split(New Char() {","c}) 
     ' convert values to single. create a PointF 
     Dim ptF As New PointF(Convert.ToSingle(parts(0)), Convert.ToSingle(parts(1))) 
     ' add to list 
     XY.Add(ptF) 
    End If 
Next 

Следующая вещь, которая происходит должна быть форма показывается и событие краски вызывается. Эти данные используются в Paint Событие:

Dim rectF As RectangleF 
Using myB As New SolidBrush(Color.FromArgb(128, Color.Red)) 
    For Each ptF As PointF In XY 
     rectF = New RectangleF(ptF.X - 35, ptF.Y - 35, 
           70, 70) 

     e.Graphics.FillEllipse(myB, rectF) 
    Next 
End Using 

Если у вас есть другой код, чтобы добавить данные указывают, как кнопки мыши, после добавления, изменения или удаления данных, используйте Invalidate, чтобы заставить перерисовать: Me.Invaludate() это вы обращаются к форме, или PictureBox1.Invalidate(), если вы рисуете над элементом управления.

Урок состоит в том, что теперь, каждый раз, когда необходимо перекрасить форму, ваши фигуры также будут перерисовываться.