Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перерисовка, Invalidate(), Refresh(), Линия сильно мерцает 
:(
    Опции темы
percilacus
  Дата 21.8.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



Здравствуйте!
Помогите, пожалуйста, устранить мерцание при рисовании на форме.
Перепробовал все методы в т.ч. двойную буферизацию, Control.SetStyle но ничего не помогает.
Код

Imports System.Drawing.Drawing2D
Public Class Form1
    Dim Gr As Graphics = Me.CreateGraphics
    Dim pen1 As New Pen(Color.Blue, 20)
    Dim thecol As New Collection
    Dim grpath As New GraphicsPath
    Dim last_point As New PointF(Single.NaN, Single.NaN)
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        pen1.MiterLimit = 1.5
    End Sub
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                If Not Single.IsNaN(last_point.X) Then
                    grpath.AddLine(last_point, New PointF(e.X, e.Y))
                End If
                last_point = New PointF(e.X, e.Y)
            Case Windows.Forms.MouseButtons.Right
                If grpath.PointCount <> 0 Then
                    thecol.Add(grpath)
                    grpath = New GraphicsPath
                End If
                last_point = New PointF(Single.NaN, Single.NaN)
                Invalidate()
        End Select
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If Not Single.IsNaN(last_point.X) Then
            Dim temp_grpath As GraphicsPath = grpath.Clone
            temp_grpath.AddLine(last_point, New PointF(e.X, e.Y))
            Gr.DrawPath(pen1, temp_grpath)
            Invalidate()
        End If
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        For Each obj As GraphicsPath In thecol
            Gr.DrawPath(pen1, obj)
        Next
    End Sub
End Class

PM MAIL WWW   Вверх
diadiavova
Дата 21.8.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Ьой пример сильно отличается от твоего, но советую разобраться. Что ты хотел делать левой и правой кнопкой я не понял, поэтому упростил(только левая работает). Базовый класс Shape создал на случай, если кроме линий понадобиться ещё что-то. С двойной буферизацией сам смотри нужна она тебе или нет
Код

Public Class Form1
    Dim currentPen As New Pen(Color.Blue, 20)
    Dim shapes As New List(Of Shape)
    Dim activeShape As Shape
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        currentPen.MiterLimit = 1.5
    End Sub
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim l As New Line(e.Location, e.Location, Me.currentPen)
            Me.shapes.Add(l)
        End If
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Me.activeShape.SetMousePoint(e.Location)
            Invalidate()
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        Me.activeShape = Nothing
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        For Each sh As Shape In shapes
            sh.OnPaint(e)
        Next
    End Sub

End Class
Public MustInherit Class Shape
    Public MustOverride Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Public MustOverride Sub SetMousePoint(ByVal mousePoint As Point)
End Class
Public Class Line
    Inherits Shape
    Public Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawLine(Me.Pen, Me.StartPoint, Me.EndPoint)
    End Sub
    Public Sub New(ByVal startP As Point, ByVal endP As Point, ByVal p As Pen)
        Me.StartPoint = startP
        Me.EndPoint = endP
        Me.Pen = p
    End Sub
    Public Sub New()
        Me.Pen = Pens.Black
        Me.StartPoint = New Point(0, 0)
        Me.EndPoint = New Point(100, 100)
    End Sub
    Dim _startPoint As Point
    Public Overridable Property StartPoint() As System.Drawing.Point
        Get
            Return _startPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _startPoint = value
        End Set
    End Property
    Dim _endPoint As Point
    Public Overridable Property EndPoint() As System.Drawing.Point
        Get
            Return _endPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _endPoint = value
        End Set
    End Property

    Dim _pen As Pen
    Public Overridable Property Pen() As System.Drawing.Pen
        Get
            Return _pen
        End Get
        Set(ByVal value As System.Drawing.Pen)
            _pen = value
        End Set
    End Property

    Public Overrides Sub SetMousePoint(ByVal mousePoint As System.Drawing.Point)
        EndPoint = mousePoint
    End Sub
End Class


Немного подправил код, так вроде лучше.

Это сообщение отредактировал(а) diadiavova - 21.8.2009, 22:44


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 22.8.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



diadiavova, Глубоко не вникал но сразу же ошибка вылетает на этой строчке:
16: Me.activeShape.SetMousePoint(e.Location)
зы:
На заре на столе 
Разноцветны стёклышки
Разноцветны тряпочки-
Непонятно ни хрена.
+1 smile 
PM MAIL WWW   Вверх
diadiavova
Дата 22.8.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Код

Public Class Form1
    Dim currentPen As New Pen(Color.Blue, 20)
    Dim shapes As New List(Of Shape)
    Dim activeShape As Shape
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        currentPen.MiterLimit = 1.5
    End Sub
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim l As New Line(e.Location, e.Location, Me.currentPen)
            activeShape = l
            Me.shapes.Add(l)
        End If
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Me.activeShape.SetMousePoint(e.Location)
            Invalidate()
        End If
    End Sub
    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        Me.activeShape = Nothing
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        For Each sh As Shape In shapes
            sh.OnPaint(e)
        Next
    End Sub
End Class
Public MustInherit Class Shape
    Public MustOverride Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Public MustOverride Sub SetMousePoint(ByVal mousePoint As Point)
End Class
Public Class Line
    Inherits Shape
    Public Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawLine(Me.Pen, Me.StartPoint, Me.EndPoint)
    End Sub
    Public Sub New(ByVal startP As Point, ByVal endP As Point, ByVal p As Pen)
        Me.StartPoint = startP
        Me.EndPoint = endP
        Me.Pen = p
    End Sub
    Public Sub New()
        Me.Pen = Pens.Black
        Me.StartPoint = New Point(0, 0)
        Me.EndPoint = New Point(100, 100)
    End Sub
    Dim _startPoint As Point
    Public Overridable Property StartPoint() As System.Drawing.Point
        Get
            Return _startPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _startPoint = value
        End Set
    End Property
    Dim _endPoint As Point
    Public Overridable Property EndPoint() As System.Drawing.Point
        Get
            Return _endPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _endPoint = value
        End Set
    End Property
    Dim _pen As Pen
    Public Overridable Property Pen() As System.Drawing.Pen
        Get
            Return _pen
        End Get
        Set(ByVal value As System.Drawing.Pen)
            _pen = value
        End Set
    End Property
    Public Overrides Sub SetMousePoint(ByVal mousePoint As System.Drawing.Point)
        EndPoint = mousePoint
    End Sub
End Class


Когда менял код от руки, случайно удалил нужную строку smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 23.8.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



Все равно мерцает хотя и не так
Я того же эффекта добивался вводя статик переменную в тело процедуры, тем самым пореже вызывая злополучный Invalidate
Код

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Static i As Integer : i += 1 : If i > 5 Then i = 0
        If Not Single.IsNaN(last_point.X) Then
            Dim temp_grpath As GraphicsPath = grpath.Clone
            temp_grpath.AddLine(last_point, New PointF(e.X, e.Y))
            Gr.DrawPath(pen1, temp_grpath)
            If i=5 Then Invalidate()
        End If
    End Sub

Как же тогда, скажем, в AutoCad e не мерцает совсем? Пусть он сделан не на бейсике, но способ значит имеется! А потому и в бейсике должен иметься  smile 
PM MAIL WWW   Вверх
diadiavova
Дата 23.8.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



У меня ничего не мерцает, и если ты код не менял, то и у тебя не должно.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Lines.rar 60,79 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 28.8.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



Ultimate

Код

Imports System.Drawing.Drawing2D
Public Class Form1
    Private pen1 As New Pen(Color.Blue, 20)
    Private grpath_col As New Collection
    Private grpath As New GraphicsPath
    Private temp_grpath As GraphicsPath
    Private last_point As New PointF(Single.NaN, Single.NaN)
    Private currentContext As BufferedGraphicsContext = BufferedGraphicsManager.Current
    Private buffer As BufferedGraphics
    Private Delegate Sub WhatDraw()
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.BackColor = SystemColors.Control
        pen1.MiterLimit = 1.5
    End Sub
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                If Not Single.IsNaN(last_point.X) Then
                    grpath.AddLine(last_point, New PointF(e.X, e.Y))
                End If
                last_point = New PointF(e.X, e.Y)
            Case Windows.Forms.MouseButtons.Right
                If grpath.PointCount <> 0 Then grpath_col.Add(grpath)
                grpath = New GraphicsPath
                last_point = New PointF(Single.NaN, Single.NaN)
                DrawToBuffer(AddressOf DrawAllPath)
        End Select
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If Not Single.IsNaN(last_point.X) Then
            temp_grpath = grpath.Clone
            temp_grpath.AddLine(last_point, e.Location)
            DrawToBuffer(AddressOf DrawAllPath, AddressOf DrawTempPath)
        End If
    End Sub
    Private Sub DrawAllPath()
        For Each obj As GraphicsPath In grpath_col
            buffer.Graphics.DrawPath(pen1, obj)
        Next
    End Sub
    Private Sub DrawTempPath()
        buffer.Graphics.DrawPath(pen1, temp_grpath)
    End Sub
    Private Sub DrawToBuffer(ByVal ParamArray drawsmth() As WhatDraw)
        buffer = currentContext.Allocate(Me.CreateGraphics, Me.ClientRectangle)
        buffer.Graphics.FillRectangle(New SolidBrush(SystemColors.Control), Me.DisplayRectangle) 'подложка цвета фона
        For i As Integer = 0 To UBound(drawsmth)
            drawsmth(i)()
        Next
        buffer.Render()
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        DrawToBuffer(AddressOf DrawAllPath)
    End Sub
End Class


 smile 
PM MAIL WWW   Вверх
diadiavova
Дата 28.8.2009, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Ну теперь хотябы стало ясно, что ты хотел сделать. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
percilacus
Дата 29.8.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



То был плохой вариант
Вот
Код

    Imports System.Drawing.Drawing2D
    Public Class Form1
       Dim pen1 As New Pen(Color.Blue, 20) With {.MiterLimit = 1.5!, .LineJoin = LineJoin.Round}
       Dim GP As New GraphicsPath
       Dim pnt As New List(Of Point)
       Dim Drawing As Boolean
       Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          Me.DoubleBuffered = True
       End Sub
       Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
          Select Case e.Button
             Case Windows.Forms.MouseButtons.Left
                pnt.Add(New Point(e.X, e.Y))
                If Not Drawing Then pnt.Add(New Point(e.X + 1, e.Y + 1))
                Drawing = True
             Case Windows.Forms.MouseButtons.Right
                pnt.RemoveAt(pnt.Count - 1)
                GP.StartFigure() : GP.AddLines(pnt.ToArray)
                pnt.Clear() : Invalidate()
                Drawing = False
          End Select
       End Sub
       Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
          If Not Drawing OrElse pnt.Count = 0 Then Exit Sub
          pnt(pnt.Count - 1) = New Point(e.X, e.Y)
          Invalidate()
       End Sub
       Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
          e.Graphics.SmoothingMode = SmoothingMode.HighQuality
          If GP IsNot Nothing Then e.Graphics.DrawPath(pen1, GP)
          If pnt.Count > 0 Then e.Graphics.DrawLines(pen1, pnt.ToArray)
       End Sub
    End Class

 smile 
PM MAIL WWW   Вверх
Pilger
Дата 30.8.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Ошибка при нажатии правой, когда не рисуешь^^

Это сообщение отредактировал(а) Pilger - 30.8.2009, 15:57


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
percilacus
Дата 30.8.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.8.2009
Где: RemoteDetent

Репутация: нет
Всего: нет



Out Of Memory что-ли?
Это баг такой в VB. Если новый кусочек ломаной начинаешь рисовать то иногда вылетает. Отлаживать надо. smile 
 smile 
PM MAIL WWW   Вверх
diadiavova
Дата 30.8.2009, 20:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(percilacus @  30.8.2009,  21:03 Найти цитируемый пост)
Это баг такой в VB.

VB тут не при чём. Ты изначально пошёл не по тому пути. Даже если отладишь и найдёшь проблему, то при попытке расширить возможности программы столкнёшься с кучей новых "багов". Всё, что ты делаешь уже давным давно придумано и реализовано. Не могу сказать, что моя реализация идеальна, но тут важен принцип. Привожу рабочий пример, логика прорисовки немного изменена, поскольку тут она выполняется в несколько кликов, но так просто добавил к шейпу новый производный класс и всё рисует. И если понадобится ещё какие-нибудь фигуры рисовать, то проблем с этим не будет, потому что прорисовка в самих фигурах выполняется, а не в форме, а форма только управляет процессом.
Код

Public Class Form1
    Dim currentPen As New Pen(Color.Blue, 20) With {.LineJoin = Drawing2D.LineJoin.Round, .MiterLimit = 1.5!}
    Dim shapes As New List(Of Shape)
    Dim activeShape As Shape
    Dim continueDraw As Boolean = False

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'Dim l As New Line(e.Location, e.Location, Me.currentPen)
            If Not continueDraw Then
                Dim ps = New BrokenLine(Me.currentPen, e.Location, e.Location)
                activeShape = ps
                continueDraw = True
                Me.shapes.Add(activeShape)
            Else
                CType(activeShape, BrokenLine).Lines.Add(e.Location)
            End If
            Invalidate()
        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
            continueDraw = False

        End If
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If continueDraw Then
            Me.activeShape.SetMousePoint(e.Location)
            Invalidate()
        End If
    End Sub
    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        'Me.activeShape = Nothing
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        For Each sh As Shape In shapes
            sh.OnPaint(e)
        Next
    End Sub
End Class
Public MustInherit Class Shape
    Public MustOverride Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Public MustOverride Sub SetMousePoint(ByVal mousePoint As Point)
    Dim _pen As Pen
    Public Property Pen() As Pen
        Get
            If _pen Is Nothing Then
                _pen = Pens.Black
            End If
            Return _pen
        End Get
        Set(ByVal value As Pen)
            _pen = value
        End Set
    End Property
    Dim _brush As Brush
    Public Overridable Property Brush() As System.Drawing.Brush
        Get
            If _brush Is Nothing Then
                _brush = Brushes.White
            End If
            Return _brush
        End Get
        Set(ByVal value As System.Drawing.Brush)
            _brush = value
        End Set
    End Property

End Class
Public Class Line
    Inherits Shape
    Public Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.DrawLine(Me.Pen, Me.StartPoint, Me.EndPoint)
    End Sub
    Public Sub New(ByVal startP As Point, ByVal endP As Point, ByVal p As Pen)
        Me.StartPoint = startP
        Me.EndPoint = endP
        Me.Pen = p
    End Sub
    Public Sub New()
        Me.StartPoint = New Point(0, 0)
        Me.EndPoint = New Point(100, 100)
    End Sub
    Dim _startPoint As Point
    Public Overridable Property StartPoint() As System.Drawing.Point
        Get
            Return _startPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _startPoint = value
        End Set
    End Property
    Dim _endPoint As Point
    Public Overridable Property EndPoint() As System.Drawing.Point
        Get
            Return _endPoint
        End Get
        Set(ByVal value As System.Drawing.Point)
            _endPoint = value
        End Set
    End Property

    Public Overrides Sub SetMousePoint(ByVal mousePoint As System.Drawing.Point)
        EndPoint = mousePoint
    End Sub
End Class
Public Class BrokenLine
    Inherits Shape
    Public Sub New()

    End Sub
    Public Sub New(ByVal pen As Pen, ByVal ParamArray points() As Point)
        Me.Pen = pen
        Lines.AddRange(points)
    End Sub
    Public Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        e.Graphics.DrawLines(Me.Pen, _lines.ToArray)
    End Sub

    Public Overrides Sub SetMousePoint(ByVal mousePoint As System.Drawing.Point)
        Lines(Lines.Count - 1) = mousePoint
    End Sub
    Dim _lines As New List(Of Point)
    Public Overridable Property Lines() As System.Collections.Generic.List(Of System.Drawing.Point)
        Get
            Return _lines
        End Get
        Set(ByVal value As System.Collections.Generic.List(Of System.Drawing.Point))
            _lines = value
        End Set
    End Property


End Class


Старый код(в виде класса Line трогать не стал).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 30.8.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Да нет. Там еще логическая ошибка была.

Код

          Select Case e.Button
             Case Windows.Forms.MouseButtons.Left
                pnt.Add(New Point(e.X, e.Y))
                If Not Drawing Then pnt.Add(New Point(e.X + 1, e.Y + 1))
                Drawing = True
             Case Windows.Forms.MouseButtons.Right
                pnt.RemoveAt(pnt.Count - 1)
                GP.StartFigure() : GP.AddLines(pnt.ToArray)
                pnt.Clear() : Invalidate()
                Drawing = False
          End Select


при нажатии правой кнопки не в момент рисования происходит ошибка. Он пытается удалить объект, которого нет. Надо еще проверять If Drawing = True. Однако Out of Memory тоже часто вылазит.

Это сообщение отредактировал(а) Pilger - 30.8.2009, 21:36


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 30.8.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(Pilger @  30.8.2009,  22:36 Найти цитируемый пост)
Да нет. Там еще логическая ошибка была.

Если выскакивает исключение, то ясное дело, что ошибка была. Не факт, что у меня её нет. Я говорю о гибкости подхода. О том, что расширяя возможности программы можно такую кашу получить, что исправить можно будет только полностью переписав код. Есть стандартные подходы к выведению графических элементов в контролах, можно привести ряд примеров из стандартных библиотек. Эти подходы выработаны практикой и пока ничего лучше ещё не придумали.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 30.8.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



В твоем коде подобной ошибки не было. Хороший код  smile . Очень гибкий для работы. Полностью согласен.

Единственное отличие - в его коде при нажатии на правую кнопку последняя линия убирается, а у тебя оставляется, но это всё мелочи.

Это сообщение отредактировал(а) Pilger - 30.8.2009, 23:22


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0959 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.