Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: как использовать IntersectRect Добавлено: 18.02.08 19:58  

Автор вопроса:  Nikolai | ICQ: 455504541 
можно поподробней msdn а уже прочитал толку нет во всяком случае для меня
ещё вопрос из MSDN:
В этом примере на форме рисуется линия.

Пример
Dim myPen As New System.Drawing.Pen(System.Drawing.Color.Red)
Dim formGraphics as System.Drawing.Graphics
formGraphics = Me.CreateGraphics()
formGraphics.DrawLine(myPen, 0, 0, 200, 200)
myPen.Dispose()
formGraphics.Dispose()
Компиляция кода
Этот метод нельзя вызвать в обработчике событий Form_Load. Если был изменен размер формы или форма была скрыта другой формой, рисунок перерисовываться не будет. Чтобы сделать автоматическую перерисовку, нужно переопределить метод OnPaint.

Отказоустойчивость
Для любого объекта, потребляющего системные ресурсы (например, объекты Pen и Graphics), всегда нужно вызывать Dispose.

вставил в Private Sub Form1_Activated...
но линии нет
может нужен Imports

Ответить

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

Номер ответа: 1
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #1 Добавлено: 18.02.08 21:58

Как я понял, ты хочешь, чтобы линия появлялась сразу с загрузкой формы
и не исчезала никогда , если это так , то тут всё просто

Делай так

Public Class Form1
    Inherits System.Windows.Forms.Form

" Код, автоматически созданный конструктором форм Windows "


    ;Dim Граф As Graphics = Me.CreateGraphics
   
    ;Dim Карандаш2 As New Pen(Color.GreenYellow, 5)
  

   

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

        Карандаш2.StartCap = Drawing2D.LineCap.RoundAnchor ‘ /для красоты у меня линия с маркером в начале, можеш так , Карандаш2.StartCap = Drawing2D.LineCap.Flat

        Граф.DrawLine(Карандаш2, 10, 20, 100, 300)


    End Sub


Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        Граф.Dispose()
        Карандаш2.Dispose()


    End Sub


End Class

Ответить

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



ICQ: 455504541 

Вопросов: 6
Ответов: 8
 Профиль | | #2 Добавлено: 19.02.08 19:46
здорово, а то линию мог нарисовать только если на форме есть PictureBox, можно ещё вопрос я вот добавил код чтоб когда нажимаешь на право координаты должны меняться но ничего не изменяеться:


    ;Dim x As Integer = 10

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

         Карандаш2.StartCap = Drawing2D.LineCap.Flat
        Карандаш2.StartCap = Drawing2D.LineCap.Custom
        Граф.DrawLine(Карандаш2, x, 20, 100, 300)


    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = Keys.Right Then
            x = x + 1
        End If
    End Sub

Ответить

Номер ответа: 3
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #3 Добавлено: 19.02.08 23:21
Опять не так всё сложно, есть такой метод, как Refresh, который перерисовывает объект, в нашем случае, форму Me.Refresh()

Стрелочки удерживай дольше пальчиком, а то, x = x + 1 означает прибавку одного пикселя

Также, если надо, поработай над координатами, длинны отрезка, ну типа

Dim z As Integer = 100 + (x * 10)
    ;Dim u As Integer = 300 + (y * 10)

Граф.DrawLine(Карандаш2, x, y, z, u)

И что это, у тебя, в событии за обработчик « Me.KeyDown » ведь надо « MyBase.KeyDown» Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown


-----------------------------------------------------------------------------------

Dim x As Integer = 10
Dim y As Integer = 20
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

         Карандаш2.StartCap = Drawing2D.LineCap.Flat
        Карандаш2.StartCap = Drawing2D.LineCap.Custom
        Граф.DrawLine(Карандаш2, x, y, 100, 300)


    End Sub

  Private Sub Form1_KeyDown1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown


        If e.KeyCode = Keys.Right Then
            x = x + 1
            Me.Refresh()
        End If

        If e.KeyCode = Keys.Left Then

            x = x - 1
            Me.Refresh()
        End If
        If e.KeyCode = Keys.Down Then

            y = y + 1
            Me.Refresh()
        End If
        If e.KeyCode = Keys.Up Then

            y = y - 1
            Me.Refresh()
        End If
    End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Nikolai



ICQ: 455504541 

Вопросов: 6
Ответов: 8
 Профиль | | #4 Добавлено: 20.02.08 18:05
Да я примеры беру со старых проектов поэтому такой вот код спасибо а как на счёт IntersectRect

Ответить

Номер ответа: 5
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #5 Добавлено: 20.02.08 23:00
А по конкретней ?

Функция IntersectRect вычисляет пересечение двух исходных прямоугольников и устанавливает координаты прямоугольника пересечения

Ответить

Номер ответа: 6
Автор ответа:
 Nikolai



ICQ: 455504541 

Вопросов: 6
Ответов: 8
 Профиль | | #6 Добавлено: 23.02.08 19:53
мне надо узнать что именно в этом месте есть картинка и когда у меня картинка двигаеться а потом упираеться в другую первая должна остановиться или если в низу ничего нет то упасть

Ответить

Номер ответа: 7
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #7 Добавлено: 25.02.08 00:12
Вот тебе прога наверно, разберешься, в коде я тебе вёс подписал

Смысл такой, когда Лайба(метка lblBall ) ,проходит над PictureBox1, то Лайба меняет цвет и появляется надпись "Это жёлтый квадрат" продолжает, двигается дальше, а когда натыкается на кнопку tmrBounce , то падает вниз и прыгает как мяч появляется надпись "Ой кнопка !!!"

Public Class Form1
    Inherits System.Windows.Forms.Form

" Код, автоматически созданный конструктором форм Windows "


Dim Ys As Boolean = False
    ;Dim Да As Boolean = False

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        tmrBounce.Enabled = False 'Отключаем таймер
        tmrBounce.Interval = 50 'Устанавливаем скорость таймера
        Timer1.Enabled = False 'Отключаем таймер
        Timer1.Interval = 10 'Устанавливаем скорость таймера
        'Назначаем шрифт
        Label2.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(204, Byte))
        'Назначаем шрифт
        Label3.Font = New System.Drawing.Font("Microsoft Sans Serif", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(204, Byte))
    End Sub


    Private Sub butStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butStart.Click
        tmrBounce.Enabled = True 'Включаем таймер
    End Sub

    ;Dim gDirX As Integer = 1

    ;Dim gDirY As Integer = 1

    Private Sub tmrBounce_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrBounce.Tick
        lblBall.BringToFront() 'Помещаем Лайбу на передний план

        lblBall.Left = lblBall.Left - 5 * gDirX
        lblBall.Top = lblBall.Top - 5 * gDirY

        ' Отскок от левого края формы
        If lblBall.Left <= 0 Then
            gDirX = -1
        End If

        ' Отскок от правого края формы. Учитываем ширину мячика
        If lblBall.Left >= ClientSize.Width - lblBall.Width Then
            gDirX = 1
        End If

        ' Отскок от верхнего края формы
        If lblBall.Top <= 0 Then
            gDirY = -1
        End If

        ' Отскок от нижнего края формы. Учитываем ширину мячика
        If lblBall.Top >= ClientSize.Height - lblBall.Height Then
            gDirY = 1
        End If

        Label1.Text = "Координаты верхнего левого угла Лайбы : " & lblBall.Location.ToString
        Label1.Refresh() 'Перерисовка Лайбы


    End Sub

    ' Текущая позиция объекта
    ;Dim cy As Integer
    ' Нижняя граница формы
    ;Dim floorY As Integer = ClientSize.Height
    ' Скорость падения
    ;Dim ymov As Integer
    ' Сила притяжения
    ;Dim gravity As Integer = 1
    ' Коэффициент затухания
    ;Dim decay As Single = 0.9

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Задаём движение Лайбы
        ymov += gravity
        cy = lblBall.Top + ymov ' Падаем вниз
        lblBall.Top = cy

        If lblBall.Height + lblBall.Top >= floorY Then
            ' Если достигли нижней границы формы,
            ' то отскакиваем вверх, меняя направление движения
            ' с затуханием скорости
            ymov *= CInt(-1 * 0.9)
            lblBall.Top = floorY - lblBall.Height

        End If

    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

        ;Dim g As Graphics = Me.CreateGraphics() 'Создаём объект рисования
        ;Dim p As New Pen(Color.Green, 3) 'Назначаем карандаш

        'Создаём прямоугольник равный размерам кнопки и на том же месте

        ;Dim newRectangle As New Rectangle(butStart.Left, butStart.Top, butStart.Width, butStart.Height)
        g.DrawRectangle(p, newRectangle) 'Рисуем на форме
        'Самое важное в этой программе. Если указанная точка принадлежит указанной области, то True. Я взял заточку lblBall.Location , а область newRectangle
        If newRectangle.Contains(lblBall.Location) Then
            Ys = True
        End If
        If Ys Then

            tmrBounce.Enabled = False 'отключаем таймер
            Timer1.Enabled = True 'Включаем таймер
            Label3.Text = "Ой кнопка !!!"

        End If

    End Sub

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

    End Sub

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

        ;Dim g As Graphics = Me.CreateGraphics() 'Создаём объект рисования
        ;Dim p As New Pen(Color.Gold, 10) 'Назначаем карандаш
        'Создаём прямоугольник равный размерам PictureBox1 и на том же месте
        ;Dim Rectangle As New Rectangle(PictureBox1.Left, PictureBox1.Top, PictureBox1.Width, PictureBox1.Height)

        g.DrawRectangle(p, Rectangle)

        If Rectangle.Contains(lblBall.Location) Then
            Да = True

        End If
        If Да Then

            Label2.Text = "Это жёлтый квадрат"

            lblBall.BackColor = Color.Green
            Да = False

        ElseIf Да = False Then

            Label2.Text = ""

            lblBall.BackColor = Color.Red
        End If


    End Sub

    Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

    End Sub

    Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click

    End Sub

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub lblBall_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblBall.Click

    End Sub
End Class

Ответить

Номер ответа: 8
Автор ответа:
 Георгич



Вопросов: 16
Ответов: 52
 Профиль | | #8 Добавлено: 25.02.08 16:32
Да, добавь в окне свойств для PictureBox1.Location = 40; 88 , для butStart.Location = 168; 88 и для Form1 Size = 344; 280

Или тоже самое в событии Form1_Load впиши
PictureBox1.Location = New System.Drawing.Point(40, 88)
butStart.Location = New System.Drawing.Point(168, 88)
Me.Width = 344
Me.Height = 280


И не забудь меня похвалить или поругать

Ответить

Страница: 1 |

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



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