Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Работа с графикой Добавлено: 26.05.08 00:19  

Автор вопроса:  Юрик
Господа, помогите чайничку. Нам задали написать простенький граф. редактор типа Paint в 2005 бейсике. Такой вопрос - на чем лучше рисовать? PictureBox, на форме или еще где-то? И самое главное, в том же паинте когда рисуешь линию все ремя отображается ее силует пока не отожмешь конпку. У меня тоже отображается, но сильно мелькает(( Код примерно такой (если убрать все лишнее)

 Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBoxl.Paint
        MyG2 = PictureBoxl.CreateGraphics()
'pMode указывает какой обьект сейчас отрисовывается, линия или т.д. fStart = 1 в момент между нажатием и отпусканием клавиши, пока отрисовывается силует-контур
        If fStart = True Then
            If pMode = 1 Then MyG2.DrawLine(Pens.Black, x1, y1, x3, y3)
            If pMode = 2 Then MyG2.DrawRectangle(Pens.Black, Math.Min(x1, x3), Math.Min(y1, y3), Math.Abs(x3 - x1), Math.Abs(y3 - y1))
            If pMode = 3 Then MyG2.DrawEllipse(Pens.Black, Math.Min(x1, x3), Math.Min(y1, y3), Math.Abs(x3 - x1), Math.Abs(y3 - y1))
        End If
        PictureBoxl.Image = image1
    End Sub
Private Sub PictureBoxl_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxl.MouseDown
        MyG = Graphics.FromImage(image1)
        RSz = Me.ClientSize
        RB = Bounds()
        fStart = True
        dBorder = (RB.Size.Width - RSz.Width) \ 2
        x1 = Cursor.Position.X - RB.Left - dBorder - ToolStrip1.Width
        y1 = Cursor.Position.Y - RB.Bottom + RSz.Height + dBorder - MenuStrip1.Height
        x3 = x1 : y3 = y1
    End Sub

    Private Sub PictureBoxl_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxl.MouseUp
        x2 = Cursor.Position.X - RB.Left - dBorder - ToolStrip1.Width
        y2 = Cursor.Position.Y - RB.Bottom + RSz.Height + dBorder - MenuStrip1.Height
        fStart = False
        MyG = Graphics.FromImage(image1)
        If pMode = 1 Then MyG.DrawLine(Pens.Black, x1, y1, x2, y2)
        If pMode = 2 Then MyG.DrawRectangle(Pens.Black, Math.Min(x1, x2), Math.Min(y1, y2), Math.Abs(x2 - x1), Math.Abs(y2 - y1))
        If pMode = 3 Then MyG.DrawEllipse(Pens.Black, Math.Min(x1, x2), Math.Min(y1, y2), Math.Abs(x2 - x1), Math.Abs(y2 - y1))
        If pMode = 5 Then
            If bRect = True Then x4 = x1 : y4 = y1
            MyG.DrawLine(Pens.Black, x4, y4, x2, y2)
            bRect = False
        End If
        x4 = x2 : y4 = y2
        'PictureBoxl.BackgroundImage = image1
        PictureBoxl.Refresh()
    End Sub

    Private Sub PictureBoxl_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxl.MouseMove
        MyG = Graphics.FromImage(image1)
        x3 = Cursor.Position.X - RB.Left - dBorder - ToolStrip1.Width
        y3 = Cursor.Position.Y - RB.Bottom + RSz.Height + dBorder - MenuStrip1.Height
        If (fStart = True And pMode = 4) Then MyG.FillRectangle(Brushes.Black, x3 - 2, y3 - 2, 2, 2)
        If (fStart = True And pMode = 6) Then MyG.FillRectangle(Brushes.White, x3 - 2, y3 - 2, 4, 4)
        PictureBoxl.Refresh()
    End Sub

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 26.05.08 06:18
Рисовать лучше на битмапе в памяти. На чем впоследствии его отображать неважно.

Ответить

Номер ответа: 2
Автор ответа:
 sasha



Вопросов: 1
Ответов: 4
 Профиль | | #2 Добавлено: 29.05.08 18:49
у меня зачёт похож только редактор посложнее и на VB.NET 2008
Код формы на какой осуществляется рисование примерно такой:
Public Class frmPaint

    ;Dim d As String
    ;Dim IsDraw As Boolean = False
    ;Dim XO, YO, X, Y, XPre, YPre As Integer
    Public MyG As Graphics
    Public Pen1 As Pen = New Pen(Color.Black, 1)
    Public Pen2 As Pen = New Pen(BackColor, 2)
    ;Dim CurrentPen As Pen
    ;Dim l As Integer
    Public IsChange As Boolean 'наличие изменений в текущей форме

    Private Sub frmPaint_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'PicBox.Image = New Bitmap(128, 128)
        PicBox.Image = New Bitmap(PicBox.Width, PicBox.Height)
        MyG = picBox.CreateGraphics()

        FileOpen(1, "C:\\b.txt", OpenMode.Append)
        FileClose(1)
        Kill("C:\\b.txt";)
        FileOpen(1, "C:\\b.txt", OpenMode.Append)
        PrintLine(1, " 0";)
        PrintLine(1, "SECTION";)
        PrintLine(1, " 2";)
        PrintLine(1, "ENTITIES";)






    End Sub


    Private Sub PicBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicBox.MouseDown

        If frmMain.z = 1 Then

            XPre = e.X
            YPre = e.Y
        End If
        If frmMain.z = 2 Then

            XPre = e.X
            YPre = e.Y
        End If
        If frmMain.z = 3 Then

            XPre = e.X
            YPre = e.Y
        End If

        IsDraw = True
        'MyG = PicBox.CreateGraphics()
        MyG = Graphics.FromImage(PicBox.Image)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            CurrentPen = Pen1
        End If
        If e.Button = Windows.Forms.MouseButtons.Right Then
            CurrentPen = Pen2
        End If
    End Sub

    Private Sub PicBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicBox.MouseMove
        If frmMain.z = 0 Then
            If IsDraw Then
                XPre = X
                YPre = Y
                X = e.X
                Y = e.Y
                MyG.DrawLine(CurrentPen, XPre, YPre, X, Y)
                picBox.Invalidate()
            Else
                X = e.X
                Y = e.Y
            End If
        End If
    End Sub

    Private Sub PicBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicBox.MouseUp
        'MyG.Dispose()
        'MyG = Nothing

        If frmMain.z = 1 Then
            X = e.X
            Y = e.Y


            MyG.DrawLine(CurrentPen, XPre, YPre, X, Y)

            PrintLine(1, " 0";)
            PrintLine(1, "LINE";)
            PrintLine(1, " 8";)
            PrintLine(1, "0";)
            PrintLine(1, " 10";)
            PrintLine(1, XPre)
            PrintLine(1, " 20";)
            PrintLine(1, YPre)
            PrintLine(1, " 11";)
            PrintLine(1, X)
            PrintLine(1, " 21";)
            PrintLine(1, Y)

            picBox.Invalidate()
        End If

        If frmMain.z = 2 Then
            X = e.X
            Y = e.Y
            If XPre < X And YPre < Y Then
                MyG.DrawRectangle(CurrentPen, XPre, YPre, Math.Abs(X - XPre), Math.Abs(Y - YPre))
            Else
                If XPre < X And YPre > Y Then
                    MyG.DrawRectangle(CurrentPen, XPre, Y, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                Else
                    If XPre > X And YPre > Y Then
                        MyG.DrawRectangle(CurrentPen, X, Y, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                    Else
                        MyG.DrawRectangle(CurrentPen, X, YPre, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                    End If
                End If
                picBox.Invalidate()
            End If
            picBox.Invalidate()
        End If
        If frmMain.z = 3 Then
            X = e.X
            Y = e.Y
            If XPre < X And YPre < Y Then
                MyG.DrawEllipse(CurrentPen, XPre, YPre, Math.Abs(X - XPre), Math.Abs(Y - YPre))
            Else
                If XPre < X And YPre > Y Then
                    MyG.DrawEllipse(CurrentPen, XPre, Y, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                Else
                    If XPre > X And YPre > Y Then
                        MyG.DrawEllipse(CurrentPen, X, Y, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                    Else
                        MyG.DrawEllipse(CurrentPen, X, YPre, Math.Abs(X - XPre), Math.Abs(Y - YPre))
                    End If
                End If
                picBox.Invalidate()
            End If

            picBox.Invalidate()
        End If

        IsDraw = False
    End Sub

End Class

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам