percilacus писал(а):MIT, можно поподробнее. Какой буфер, это класс, модуль? Если модуль какое пространство имен, чтобы о нем я мог прочитать.
В самом простом случае можно использовать связку объекта Bitmap и класса Graphics. Для рендеринга можно юзать DrawImageUnscaled.percilacus писал(а):Какой буфер, это класс, модуль?
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
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
Если руки прямые, то ни единого тормоза не будет (если речь не идет про реалтайм-блюр или что-то подобное).Dmitry81 писал(а):тогда жди безбожных тормозов
Да ну да прям?Dmitry81 писал(а):И мерцания не будет
Public Class Form1
Dim P1 As Point
Dim P2 As Point
Dim pen As New Pen(Color.Black, 1)
Dim MyGrafix As System.Drawing.Graphics = Me.CreateGraphics
Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
P1.X = e.X
P1.Y = e.Y
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.Right Then
P2.X = e.X
P2.Y = e.Y
MyGrafix.DrawLine(Me.pen, Me.P1, P2)
End If
End Sub
End Class
Public Class Form1
Dim P1 As Point
Dim P2 As Point
Dim pen As New Pen(Color.Black, 1)
Dim MyGrafix As System.Drawing.Graphics = Me.CreateGraphics
Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
P1.X = e.X
P1.Y = e.Y
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
P2.X = e.X
P2.Y = e.Y
Me.MyGrafix.DrawLine(Me.pen, P1, P2)
P1 = P2
End If
End Sub
End Class
MIT писал(а):Я, конечно, извиняюсь, но это ерунда, а не код. Для кого (и для чего) тогда придумали OnPaint?
И чем же, по твоему, она непредсказуема?MIT писал(а):Да и использование Me.CreateGraphics довольно непредсказуемая затея.
MIT писал(а):Я тебе выше писал что надо сделать, что бы избавиться от мерцания, зачем ерундой заниматься?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61