метод прорисовки

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

метод прорисовки

Сообщение Создатель » 19.12.2004 (Вс) 9:35

Help плиз кто чем может....

1)Как создать в новом классе метод прорисовки, чтобы при его вызове на форме отображался допустим круг или квадрат...
2)Как сделать, чтобы при наведении в его область курсором, было выполнено некоторое действие...

Заранее благодарен

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 19.12.2004 (Вс) 23:59

Вот пример, разберайся...
Будут проблемы, пиши...


Public Class Form1
    Inherits System.Windows.Forms.Form

'Код инициалиализации формы опущен...

    Dim Path As New System.Drawing.Drawing2D.GraphicsPath()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Path.AddEllipse(60, 60, 100, 100)
        Path.AddRectangle(New Rectangle(10, 10, 50, 50))
    End Sub


    Private Sub Form1_Paint(ByVal sender As ObjectByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        e.Graphics.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias

        Dim Pen As New Pen(Color.Green, 4)
        e.Graphics.DrawPath(Pen, Path)
        e.Graphics.FillPath(Brushes.Yellow, Path)
    End Sub


    Private Sub Form1_MouseDown(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        If Path.IsVisible(e.X, e.Y) Then
            MessageBox.Show("You clicked inside the GraphicsPath.")
        End If
    End Sub
End Class
С уважением,
Игорь Шувалов aka Ronin

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 20.12.2004 (Пн) 0:04

тока надо все &_n_b_s_p (без _) заменить на пробел...

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 20.12.2004 (Пн) 0:31

areh писал(а):тока надо все &_n_b_s_p (без _) заменить на пробел...


А зачем?
В ie все нормально выглядит. Это опера долбанутая, так и не научилась этот символ отображать. Ладно, вот специально для оперы...:
Код: Выделить всё
Public Class Form1
    Inherits System.Windows.Forms.Form

'Код инициалиализации формы опущен...

    Dim Path As New System.Drawing.Drawing2D.GraphicsPath()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Path.AddEllipse(60, 60, 100, 100)
        Path.AddRectangle(New Rectangle(10, 10, 50, 50))
    End Sub


    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        e.Graphics.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias

        Dim Pen As New Pen(Color.Green, 4)
        e.Graphics.DrawPath(Pen, Path)
        e.Graphics.FillPath(Brushes.Yellow, Path)
    End Sub


    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        If Path.IsVisible(e.X, e.Y) Then
            MessageBox.Show("You clicked inside the GraphicsPath.")
        End If
    End Sub
End Class
С уважением,
Игорь Шувалов aka Ronin

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 20.12.2004 (Пн) 9:59

А можно ли создать класс, в котором будет метод прорисовки, но который не наследует windows.forms.form
Чтобы в какой-нить форме я просто написал, напрмер:

Код: Выделить всё
Public Class Form1
......
dim obj as new myClass
myClass.метод прорисовки(x,y)
.....
End Class


и чтобы именно в этой форме был нарисован круг

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 20.12.2004 (Пн) 17:45

Можно наследовать элемент управления... И переопределять его метод прорисовки. Что-то не очень понятно, что ты имеешь в виду. Напиши подробнее...
С уважением,
Игорь Шувалов aka Ronin

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 20.12.2004 (Пн) 17:58

объясню чуть подробнее:
Все дело в том, что решил написать простенькую игрушку....
И вот,думаю сделать несколько классов, представляющих собой
разных персонажей...Естественно создаю базовый класс,
сочетающий в себе все общее от этих персонажей, затем
от него создаю "Наследников" ...каждый из которых должен иметь свой метод
прорисовки....

Далее создаю форму....и уже в этой форме надо сделать
их прорисовку....если бы было 1-2 персонажа, то можно было
бы написать и так :
Код: Выделить всё
.....
Private Sub Timer1_Elapsed(ByVal sender As  Timer1.Elapsed, ...)

Dim g As Graphics = CreateGraphics()

g.fillEllipse(new solidBrush(color.blueViolet), myClass1.x, myClass1.y, 5,5)

g.fillEllipse(new solidBrush(color.blueViolet), myClass2.x, myClass2.y, 5,5)

End Sub

(можно с полиформизмом сделать, но горомного плюса это не даст)

Но если таких объектов туча....то как-то тупо получиться....
в общем как мне сделать, чтобы было что-то типа этого:

Код: Выделить всё
Private Sub Timer1_Elapsed(ByVal sender As  Timer1.Elapsed, ...)

myClass1.paint
myclass2.paint

End Sub

Заранее благодарен

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.12.2004 (Пн) 18:16

Если сделать нужно именно так, тогда иначе как полиморфизмом никак :)

Либо (для извращенцев): хранить в экземпляре класса делегата на метод прорисовки,
Либо (для всех остальных)

Код: Выделить всё
public class characterbase
  public mustoverride sub paint
end class

public class char1
  public overrides sub paint

  end sub
end class
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 20.12.2004 (Пн) 18:16

Ага, ну на форме, обьекты представляются контроллами. Создай базовый класс, от него наследуй для каждого персонажа, а потом переопределяй метод прорисовки каждого дочернего класса.
Ну например:
Код: Выделить всё
Class Person
    Inherits System.Windows.Forms.Control
    '...
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        'Здесь определяешь методы прорисовки
    End Sub
End Class

Class NewPerson
    Inherits Person

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        'Точно так-же переопределяешь методы...
    End Sub
End Class



Вроде так.
Или ты хочешь, что-бы классы рисовали прямо на форме? Тогда нужно в классах создавать методы Paint (или как-нибудь так) и передавать туда ссылку на форму… И рисовать… Я это так понимаю…
С уважением,
Игорь Шувалов aka Ronin

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.12.2004 (Пн) 18:17

А вообще, ты уверен, что методы прорисовки принципиально отличаются? Может, принципиально отличаются только картинки? :) И тогда достаточно иметь главный метод отрисовки, а просто ставить экземпляру его картинку при создании? :) И тогда вообще не нужно наследование?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 20.12.2004 (Пн) 19:12

Это понял...вот только еще один вопрос,насколько правильно будет сделать такой метод прорисовки:


в классе per1 , наследуемом из PERSON (например)

Код: Выделить всё
Public Overrides Sub OnPaint(ByVal hwnd As IntPtr)

        Dim g As Graphics = Graphics.FromHwnd(hwnd)
        Dim br As New Pen(Color.Black)
        g.DrawLine(br, 50, 50, x, x)

End Sub


а из формы вызывать так

Код: Выделить всё
per1.OnPaint(me.handle)

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 20.12.2004 (Пн) 19:25

А может быть просто ссылку на g передавать? Попробуй...
С уважением,
Игорь Шувалов aka Ronin

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 20.12.2004 (Пн) 20:10

В смысле????? можно код?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 20.12.2004 (Пн) 20:27

Ну а что не понятно? Впринципе так-же как и ты делаешь... Просто в Классах будет процедура (переопределяемая), например Dr...
Например:

Код: Выделить всё
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dr(e.Graphics)
    End Sub

   'или

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        Dim g As Graphics = Graphics.FromHwnd(Me.Handle)
        Dr(g)
    End Sub

   'А здесь твоя процедура прорисовки

    Sub Dr(ByRef g As Graphics)
        Dim br As New Pen(Color.Black)
        g.DrawLine(br, 50, 50, 60, 60)
    End Sub
С уважением,
Игорь Шувалов aka Ronin

Создатель
Постоялец
Постоялец
 
Сообщения: 422
Зарегистрирован: 21.04.2004 (Ср) 3:32
Откуда: Новосибирск

Сообщение Создатель » 21.12.2004 (Вт) 4:38

Огромное всем спасибо !!!!
Наконец-то все получается....


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList