перерисовка формы

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

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

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

перерисовка формы

Сообщение Ramzes » 04.03.2006 (Сб) 13:09

Заливаю форму градиентом при размере формы
Код: Выделить всё

    Private Sub MainFrm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim Gr As New LinearGradientBrush(e.ClipRectangle, Color.DodgerBlue, Color.RoyalBlue, LinearGradientMode.Horizontal)
        e.Graphics.Clear(Drawing.SystemColors.Control)
        e.Graphics.FillRectangle(Gr, New Rectangle(0, 0, Me.Width, Me.Height))
        e.Graphics.FillRectangle(Gr, e.ClipRectangle)
    End Sub


Но при изминение размера под контролами остаются пятна :(

как от них избавится, как перерисововать поверх старого?

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

Сообщение GSerg » 04.03.2006 (Сб) 13:31

Типа
Код: Выделить всё
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    Dim Gr As New Drawing2D.LinearGradientBrush(e.ClipRectangle, Color.DodgerBlue, Color.RoyalBlue, Drawing2D.LinearGradientMode.Horizontal)

    With Me.CreateGraphics
      .FillRectangle(Gr, Me.ClientRectangle)
      .Dispose()
    End With

    Gr.Dispose()
  End Sub
?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 04.03.2006 (Сб) 14:21

GSerg
Не совсем то...
Мой код заливает один раз...
а твой :roll:
выполни и сам все увидешь (если контролов много)

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

Сообщение GSerg » 04.03.2006 (Сб) 14:29

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

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 04.03.2006 (Сб) 14:47

GSerg
твой заливате много градиентов....т.е. размер градиента = размер кнопкам :(

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 04.03.2006 (Сб) 14:53

Может у кого примерчик завалялся? Мне просто заодно нужне все контролы залить...и еще...после заливки, если другое окно проежает, то градиент смазывается :cry:

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 04.03.2006 (Сб) 19:33

у тебя градиент рисуется рандомно? я чтото ничего не понял, e.ClipRectangle может быть любой.

может тебе кисть сделать постоянной? (ну, рект)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.03.2006 (Сб) 22:21

Попробуй так, у меня нормально:

Код: Выделить всё
Imports System.Drawing.Drawing2D

Public Class MainFrm
    Dim Gr As LinearGradientBrush

    Private Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.DoubleBuffered = True

    End Sub


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

        Gr = New LinearGradientBrush(Me.ClientRectangle, Color.DodgerBlue, Color.Red, LinearGradientMode.Horizontal)
        e.Graphics.FillRectangle(Gr, e.ClipRectangle)

    End Sub


    Private Sub MainFrm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

       Me.Invalidate()

    End Sub
End Class

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 05.03.2006 (Вс) 0:48

или так

Код: Выделить всё
Imports System.Drawing.Drawing2D

Public Class MainFrm
    Dim Gr As LinearGradientBrush
    Dim Col1 As Color = Color.DodgerBlue
    Dim Col2 As Color = Color.Red
    Dim R As New Rectangle(0, 0, 100, 100)

    Private Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.SetStyle(ControlStyles.ResizeRedraw, True)

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        R.Size = Me.ClientSize
        Gr = New LinearGradientBrush(R, Col1, Col2, LinearGradientMode.Horizontal)
        e.Graphics.FillRectangle(Gr, e.ClipRectangle)

    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        If m.Msg = &H14 Then
            'msg=0x14 (WM_ERASEBKGND) hwnd=0x2e032c wparam=0x1010056 lparam=0x0 result=0x1
            Exit Sub
        Else
            MyBase.WndProc(m)
        End If

    End Sub

End Class

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 05.03.2006 (Вс) 11:49

А еще можно так :D

Код: Выделить всё
Imports System.Drawing.Drawing2D

Public Class Frm1
    Dim LGB As LinearGradientBrush
    Const BmW As Integer = 640
    Const BmH As Integer = 480
    Dim BM As New Bitmap(BmW, BmH, Imaging.PixelFormat.Format32bppRgb)
    Dim R As New Rectangle(0, 0, BmW - 1, BmH - 1)

    Private Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Using Grfx As Graphics = Graphics.FromImage(BM)
            LGB = New LinearGradientBrush(R, Color.DodgerBlue, Color.Red, LinearGradientMode.Vertical)
            Grfx.FillRectangle(LGB, R)
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
        End Using

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        e.Graphics.DrawImage(BM, Me.ClientRectangle)

    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        If m.Msg = &H14 Then
            'msg=0x14 (WM_ERASEBKGND) hwnd=0x2e032c wparam=0x1010056 lparam=0x0 result=0x1
            Exit Sub
        Else
            MyBase.WndProc(m)
        End If

    End Sub

End Class


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

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

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

    TopList