Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 1
Регистрация: 26.03.2013
Сообщений: 37

Как убрать мерцание

30.03.2013, 12:22. Показов 3084. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Написал програму с простой анимацией движения шариков и прямоугольника, все хорошо работает, но очень сильно раздражает мерцание при движении. Я добавил функцию bitblt, но она написана для VB6 и вроде как не работает в .NET. Если кто поможет буду очень благодарен!

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
Public Class Form1
    Dim Balls(5) As OvalShape
    Dim MoveRight(5) As Boolean
    Dim MoveUp(5) As Boolean
    Dim x As Integer
    Dim Speed(5) As Integer
    Dim MoveR As Boolean
    Dim MoveU As Boolean
    Dim SpR As Long
    Dim SpU As Long
    Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Dim SpeedT As Long, SpeedR As Long
 
    Function Draw() ' Функция Draw, много ошибок связанных с bitblt
        Form1.Cls()
        BitBlt(Form1.hDC, SpeedT, SpeedR, Balls(x).ScaleWidth, Balls(x).ScaleHeight, Balls(x).hDC, 0, 0, vbSrcCopy)
        BitBlt(Form1.hDC, SpU, SpR, RectangleShape1.ScaleWidth, RectangleShape1.ScaleHeight, RectangleShape1.hDC, 0, 0, vbSrcCopy)
        Form1.Refresh()
    End Function
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 
 
        For Me.x = 1 To 5
            If MoveRight(x) = True Then
                SpeedR += Speed(x)
            Else
                SpeedR -= Speed(x)
            End If
            If MoveUp(x) = True Then
                SpeedT -= Speed(x)
            Else
                SpeedT += Speed(x)
            End If
 
 
            If Balls(x).Left <= Me.ClientRectangle.Left Then
                MoveRight(x) = True
 
            ElseIf (Balls(x).Left <= RectangleShape1.Right) And (Balls(x).Left > RectangleShape1.Right - 60) And (Balls(x).Top < RectangleShape1.Bottom) And (Balls(x).Bottom > RectangleShape1.Top) Then
                MoveRight(x) = True
                If MoveR = True Then
                    SpR = SpR - 1
                Else
                    SpR = SpR + 1
                End If
 
            ElseIf Balls(x).Right >= Me.ClientRectangle.Right Then
                MoveRight(x) = False
 
            ElseIf (Balls(x).Right >= RectangleShape1.Left) And (Balls(x).Right < RectangleShape1.Left + 60) And (Balls(x).Top < RectangleShape1.Bottom) And (Balls(x).Bottom > RectangleShape1.Top) Then
                MoveRight(x) = False
                If MoveR = True Then
                    SpR = SpR + 1
                Else
                    SpR = SpR - 1
                End If
 
            ElseIf Balls(x).Top <= Me.ClientRectangle.Top Then
                MoveUp(x) = False
 
            ElseIf (Balls(x).Top <= RectangleShape1.Bottom) And (Balls(x).Top > RectangleShape1.Bottom - 60) And (Balls(x).Left < RectangleShape1.Right) And (Balls(x).Right > RectangleShape1.Left) Then
                MoveUp(x) = False
                If MoveU = True Then
                    SpU = SpU + 1
                Else
                    SpU = SpU - 1
                End If
            ElseIf Balls(x).Bottom >= Me.ClientRectangle.Bottom Then
                MoveUp(x) = True
 
            ElseIf (Balls(x).Bottom >= RectangleShape1.Top) And (Balls(x).Bottom < RectangleShape1.Top + 60) And (Balls(x).Left < RectangleShape1.Right) And (Balls(x).Right > RectangleShape1.Left) Then
                MoveUp(x) = True
                If MoveU = True Then
                    SpU = SpU - 1
                Else
                    SpU = SpU + 1
                End If
                Draw()
            End If
        Next
 
        If MoveR = True Then
            SpR += SpR
        Else
            SpR -= SpR
        End If
        If MoveU = True Then
            SpU -= SpU
        Else
            SpU += SpU
        End If
 
        If RectangleShape1.Left <= Me.ClientRectangle.Left Then
            SpR = 1
            MoveR = True
 
        End If
        If RectangleShape1.Right >= Me.ClientRectangle.Right Then
            SpR = 1
            MoveR = False
 
        End If
        If RectangleShape1.Top <= Me.ClientRectangle.Top Then
            SpU = 1
            MoveU = False
 
        End If
        If RectangleShape1.Bottom >= Me.ClientRectangle.Bottom Then
            SpU = 1
            MoveU = True
        End If
 
    End Sub
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Balls(1) = OvalShape1
        Balls(2) = OvalShape2
        Balls(3) = OvalShape3
        Balls(4) = OvalShape4
        Balls(5) = OvalShape5
 
        MoveUp(1) = True
        MoveUp(2) = False
        MoveUp(3) = False
        MoveUp(4) = True
        MoveUp(5) = False
 
        MoveRight(1) = True
        MoveRight(2) = True
        MoveRight(3) = False
        MoveRight(4) = False
        MoveRight(5) = False
        For Me.x = 1 To 5
            Speed(x) = x
            Draw()
        Next
 
    End Sub
 
 
End Class
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2013, 12:22
Ответы с готовыми решениями:

Как можно устранить мерцание графики?
Доброго времени суток! В программе при каждом срабатывании таймера должна перерисовываться ломаная линия из 500 точек. При этом другие...

Как убрать мерцание ?
Использую команду Form1.Repaint для перерисовки изображения,но при движении объекта экран мерцает.Всё делаю в таймере,можно как-то убрать...

как убрать мерцание
посоветуйте пожалуйста как убрать мерцание изображения при рисовании подвижного графика структура такая цикл по времени ...

4
 Аватар для scripVB
6 / 6 / 2
Регистрация: 06.03.2013
Сообщений: 79
01.04.2013, 00:01
SeRaFuMkA, в visual studio есть стандартные исходники видел там как раз передвигающиеся шарики пример с gui посмотрите как там это реализовано! если не поймете тогда будем помогать)
0
Заблокирован
01.04.2013, 11:47
Нужна двойная буферизация без всяких Form1.Cls() и Form1.Refresh()
Рисуешь графику в битмап, затем получаешь у формы объект Graphics и одним махом отрисовываешь его на форме.
0
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 24
01.04.2013, 17:31
Цитата Сообщение от NightmareZ Посмотреть сообщение
Рисуешь графику в битмап, затем получаешь у формы объект Graphics и одним махом отрисовываешь его на форме.
А можно пример?
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
01.04.2013, 21:11
Что именно должна делать программа?
Вот например:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Public Class Form1
 
    Dim Bmp As New Bitmap(500, 500)
    Dim NewBmp As New Bitmap(500, 500)
    Dim Ball As New Bitmap(50, 50)
    Dim PictureBox1 As New PictureBox
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 1
        Timer2.Interval = 10
        PictureBox1.Width = 500
        PictureBox1.Height = 500
        PictureBox1.Location = New Point(0, 0)
        Me.Width = 517
        Me.Height = 538
        Me.Controls.Add(PictureBox1)
        For i = 0 To Bmp.Width - 1 Step 1
            For j = 0 To Bmp.Height - 1 Step 1
                Bmp.SetPixel(i, j, Color.DarkSeaGreen)
            Next
        Next
        For i = 0 To Ball.Width - 1 Step 1
            For j = 0 To Ball.Height - 1 Step 1
                Ball.SetPixel(i, j, Color.Red)
            Next
        Next
        NewBmp = Bmp
        PictureBox1.Image = NewBmp
        Timer2.Start()
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        PictureBox1.Image = NewBmp
    End Sub
 
    Dim SpeedX As Integer = 1.2
    Dim SpeedY As Integer = 1
    Dim Pos As New Point(0, 0)
 
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Timer1.Stop()
        Dim G As Graphics = Graphics.FromImage(NewBmp)
        G.Clear(Color.DarkSeaGreen)
        G.DrawImage(Ball, Pos)
        Pos = New Point(Pos.X + SpeedX, Pos.Y + SpeedY)
        If Pos.X + Ball.Width >= Me.Width - 10 Then
            SpeedX = -Math.Abs(SpeedX)
        ElseIf Pos.X <= 0 Then
            SpeedX = Math.Abs(SpeedX)
        ElseIf Pos.Y + Ball.Height >= Me.Height - 32 Then
            SpeedY = -Math.Abs(SpeedY)
        ElseIf Pos.Y <= 0 Then
            SpeedY = Math.Abs(SpeedY)
        End If
        G.Dispose()
        Timer1.Start()
    End Sub
 
End Class
И еще:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Public Class Form1
 
    Dim rect As New Rectangle(0, 0, 50, 50)
    Dim g As New BufferedGraphicsContext
    Dim buf As BufferedGraphics
    Dim WithEvents Timer1 As New Timer
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        buf = g.Allocate(Me.CreateGraphics, Me.DisplayRectangle)
        buf.Graphics.FillRectangle(Brushes.DarkSeaGreen, Me.DisplayRectangle)
        buf.Graphics.FillRectangle(Brushes.DarkRed, rect)
        buf.Render()
        buf.Dispose()
    End Sub
 
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.Right
                rect.X += 1
            Case Keys.Left
                rect.X -= 1
            Case Keys.Up
                rect.Y -= 1
            Case Keys.Down
                rect.Y += 1
        End Select
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = 1
        Timer1.Start()
    End Sub
 
End Class
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2013, 21:11
Помогаю со студенческими работами здесь

Эффект воды. Как убрать мерцание ?
WaterEffect.pas unit WaterEffect; interface uses Winapi.Windows, System.SysUtils, Vcl.Graphics, Math; const ...

Текстовое поле - как убрать мерцание?
Написал небольшой код, который делает стандартное текстовое поле с прозрачностью. Суть в том что я просто перерисовываю само текстовое...

Как убрать мерцание картинки во время её движения?
Как убрать мерцание картинки во время её движения? Я уже пробовал и LockDrawing и LockDrawingObjects - ничего не помогает. Эта картинка как...

Как убрать мерцание формы при перерисовке?
у меня в бекграундвокере каждую миллисекунду перерисовывается интерфейс прям на форме и мерцает капец, перепробовал дафига всяких штучек, и...

Как убрать мерцание картинок при перерисовке?
всем привет, помогите столкнулся с такой проблемой, когда у меня картинка в формате jpg спускается вниз автоматически по Timer он начинает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru