Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Gelo123321
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282

Какой способ рисования в 2D лучше?

15.05.2013, 22:10. Показов 992. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Захотел сделать свой контрол, нашел в интеренете аж целых 2 решение моей задачи. З первым вариантом разобрался, второй разбираю сейчас. Но хотелось бы узнать, какой из способов рисования 2Д лучше. Вот примеры:

Первый вариант
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
Public Class UserProgressBar
    Inherits System.Windows.Forms.Control ' наследуем Control
    Dim min As UInteger
    Dim max As UInteger
    Dim CurVal As UInteger
    Dim orient As OrientationEnum
    Dim UText As String
    Dim Pimg As Bitmap
    Dim Gr As Graphics
    Dim Fclr As Color
    Dim WrText As WTenum
    Dim FS As FillStyleEnum
 
#Region "PublicProperties"
    Public Property Minimum() As UInteger
        Get
            Minimum = min
        End Get
        Set(ByVal value As UInteger)
            min = value
            DrawProgress()
        End Set
    End Property
    Public Property Maximum() As UInteger
        Get
            Maximum = max
        End Get
        Set(ByVal value As UInteger)
            max = value
            DrawProgress()
        End Set
    End Property
    Public Property CurrentValue() As UInteger
        Get
            CurrentValue = CurVal
        End Get
        Set(ByVal value As UInteger)
            CurVal = value
            DrawProgress()
        End Set
    End Property
    Public Property ProgressOrientation() As OrientationEnum
        Get
            ProgressOrientation = orient
        End Get
        Set(ByVal value As OrientationEnum)
            orient = value
            DrawProgress()
        End Set
    End Property
    Public Property FillColor() As Color
        Get
            FillColor = Fclr
        End Get
        Set(ByVal value As Color)
            Fclr = value
            DrawProgress()
        End Set
    End Property
    Public Property WrittenText() As WTenum
        Get
            WrittenText = WrText
        End Get
        Set(ByVal value As WTenum)
            WrText = value
            DrawProgress()
        End Set
    End Property
    Public Property FillStyle() As FillStyleEnum
        Get
            FillStyle = FS
        End Get
        Set(ByVal value As FillStyleEnum)
            FS = value
            DrawProgress()
        End Set
    End Property
#End Region
 
#Region "Enums"
    Public Enum OrientationEnum As Integer
        Horisontal = 0
        Vertical = 1
    End Enum
    Public Enum WTenum As Integer
        Text = 0
        Percentage = 1
        PercentageWithSumbol = 2
        PartOfOne = 3
        None = 4
    End Enum
    Public Enum FillStyleEnum As Integer
        Solid = 0
        Texture = 1
    End Enum
#End Region
 
    Public Sub New()
        ' задаем значения по-умолчанию и отрисовываем
        Me.Minimum = 0
        Me.Maximum = 1000
        Me.CurrentValue = 0
        Me.WrText = WTenum.PercentageWithSumbol
        Me.ProgressOrientation = OrientationEnum.Horisontal
        Me.Size = New Size(200, 20)
        Me.BackgroundImageLayout = ImageLayout.Stretch
        Me.FillColor = Color.Green
        Me.BackColor = SystemColors.Window
        Me.FillStyle = FillStyleEnum.Solid
        DrawProgress()
    End Sub
    Private Sub DrawProgress()
        Try
            Me.Pimg = New Bitmap(Me.Width, Me.Height, Imaging.PixelFormat.Format32bppArgb)
            Gr = Graphics.FromImage(Pimg)
            Gr.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
            Gr.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
            'создаем кисть с учетом стиля заливки и ориентации
            Dim br As Brush
            If Me.FillStyle = FillStyleEnum.Solid Then
                br = New SolidBrush(Me.FillColor)
            Else
                If Me.ProgressOrientation = OrientationEnum.Horisontal Then
                    br = Brushes.AliceBlue
                Else
                    br = Brushes.AliceBlue
                End If
            End If
            ' объявляем прясоугольник заполненной области и вычисляем его размеры с учетом состояния свойства ProgressOrientation
            Dim FillRect As Rectangle
            If Me.ProgressOrientation = OrientationEnum.Horisontal Then
                FillRect = New Rectangle(0, 0, CInt(CurVal / max * Me.Width), Me.Height)
            Else
                FillRect = New Rectangle(0, Me.Height - CInt(CurVal / max * Me.Height), Me.Width, CInt(CurVal / max * Me.Height))
            End If
            ' заливаем прямоугольник
            Gr.FillRectangle(br, FillRect)
            ' формируем строку для рисования с учетом свойства WrittenText
            Dim s As String = String.Empty
            Select Case WrittenText
                Case Is = WTenum.None
                    s = String.Empty
                Case Is = WTenum.PartOfOne
                    s = CInt(CurVal / max)
                Case Is = WTenum.Percentage
                    s = CInt(CurVal / max * 1000)
                Case Is = WTenum.PercentageWithSumbol
                    '   s = CInt(CurVal / max * 100.0) & "%"
                Case Is = WTenum.Text
                    s = Me.Text
            End Select
            ' форматируем строку ( выравнивание - в центр области, поворот - по свойству ProgressOrientation)
            Dim drawformat As New StringFormat
            drawformat.Alignment = StringAlignment.Center
            drawformat.LineAlignment = StringAlignment.Center
            If Me.ProgressOrientation = OrientationEnum.Vertical Then drawformat.FormatFlags = StringFormatFlags.DirectionVertical
            ' рисуем строку
            Gr.DrawString(s, Me.Font, New SolidBrush(Me.ForeColor), New Rectangle(0, 0, Me.Width, Me.Height), drawformat)
            Me.BackgroundImage = Pimg
        Catch
        End Try
    End Sub
 
    ' в этом событии отслеживаются события контрола, при которых нам потребуется его перерисовка
    Private Sub UserProgressBar_Changed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize, Me.ForeColorChanged, Me.FontChanged, Me.BackColorChanged
        Me.Pimg = New Bitmap(Me.Width, Me.Height, Imaging.PixelFormat.Format32bppArgb)
        DrawProgress()
    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
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
Imports System.Drawing.Drawing2D
#Region "UICheckBox"
Public Class UICheckBox
    'by Gelo123321 
    Inherits Control
    Public Checked As Boolean
    Dim B As Bitmap, G As Graphics
    Dim C1, C2, C3, C4 As Color, P1, P2 As Pen, B1, B2, B5, B6 As Brush
    Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint, True)
        C1 = Color.FromArgb(209, 209, 209) 'Колір Enable[on]
        C2 = Color.FromArgb(155, 205, 255) 'Колір Disable[off]
        C3 = Color.FromArgb(233, 233, 233) 'Колір кордонів[default]
        C4 = Color.FromArgb(255, 255, 255) 'Колір кордонів  при наведенні
        B5 = New SolidBrush(Color.FromArgb(100, 100, 100)) 'Колір тексту
        B6 = New SolidBrush(Color.FromArgb(25, 25, 25))
        Font = New Font("Calibri", 10.0F) 'Шрифт тексту
        P1 = New Pen(C3)
        P2 = New Pen(C4)
        B1 = New SolidBrush(C1)
        B2 = New SolidBrush(C2)
    End Sub
    Private State, St As Integer
    Protected Overrides Sub OnMouseLeave(e As EventArgs)
        St = 0
        Invalidate()
    End Sub
    Protected Overrides Sub OnMouseEnter(e As EventArgs)
        St = 1
        Invalidate()
    End Sub
    Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
        If State = 0 Then
            State = 1
        Else : State = 0
        End If
        Invalidate()
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        B = New Bitmap(Width, Height)
        G = Graphics.FromImage(B)
        G.FillRectangle(B1, ClientRectangle)
        G.FillRectangle(B1, 3, 3, 14, 14)
        G.DrawLine(P1, 2, 2, 17, 2)
        G.DrawLine(P1, 17, 17, 2, 17)
        G.DrawLine(P1, 2, 17, 2, 2)
        G.DrawLine(P1, 17, 2, 17, 17)
        G.DrawString(Text, Font, B5, 20, 0)
        Select Case State
            Case 0 'On Click
                G.FillRectangle(B1, 3, 3, 14, 14)
                G.DrawString(Text, Font, B5, 20, 0)
                Checked = False
            Case 1 'Off Click
                G.FillRectangle(B2, 3, 3, 14, 14)
                G.DrawString(Text, Font, B6, 20, 0)
                Checked = True
        End Select
        Select Case St
            Case 0 'Mouse Leave
                G.DrawLine(P1, 2, 2, 17, 2)
                G.DrawLine(P1, 17, 17, 2, 17)
                G.DrawLine(P1, 2, 17, 2, 2)
                G.DrawLine(P1, 17, 2, 17, 17)
            Case 1 'Mouse Enter
                G.DrawLine(P2, 2, 2, 17, 2)
                G.DrawLine(P2, 17, 17, 2, 17)
                G.DrawLine(P2, 2, 17, 2, 2)
                G.DrawLine(P2, 17, 2, 17, 17)
        End Select
        Dim S As SizeF = G.MeasureString(Text, Font)
        Me.Width = S.Width + 20
        Me.Height = 20
        e.Graphics.DrawImage(B, 0, 0)
        G.Dispose()
        B.Dispose()
    End Sub
    Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)
    End Sub
End Class
#End Region
Какой способ рисования в 2D лучше?
Ой, я напутал, со вторым разобрался) а не с первым) Но это и не важно, суть не в том))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2013, 22:10
Ответы с готовыми решениями:

Какой способ рисования самый быстрый?
Вот нашел интересный код рисования на WinApi, переводил с языка С++: procedure TForm1.Button1Click(Sender: TObject); var hMemDC:HDC;...

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

Какой способ восстановления ВЖД лучше
Restore Remap Erase

6
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
15.05.2013, 22:39
Цитата Сообщение от Gelo123321 Посмотреть сообщение
Какой способ рисования в 2D лучше?
а чем они отличаются в первом и втором примерах? И там там используется буферная битовая карта, на которой все и рисуется, а она потом отображается.
0
 Аватар для Gelo123321
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282
15.05.2013, 22:56  [ТС]
Юпатов Дмитрий, вообщем то да, но в 1 примере кое что не работает, то что прекрасно работает во 2. Так что там все же кое чем отличаеться. Я просто хочу узнать как лучше делать, 1 или 2 способом?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
16.05.2013, 11:30
Цитата Сообщение от Gelo123321 Посмотреть сообщение
но в 1 примере кое что не работает, то что прекрасно работает во 2
Что именно? Контролы то совершенно разные по назначению в примерах.
0
 Аватар для Gelo123321
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282
16.05.2013, 14:57  [ТС]
Юпатов Дмитрий , я знаю что разные, один прогресс бар, второй чек бокс. Во втором используется OnPaint, для рисования, а в первом какая функция Драв... Во втором примере не могу вызвать перерисовку контрола при эго загрузке. Тоесть например когда программа загружается, и задает что чекс бокс 1 активирован, это на отображается (хотя на самом то деле он активирован, но это не видно). В 1 примере это все отлично работает. Как такое сделать во 2 примере? Я никак понять не могу...
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
16.05.2013, 15:46
а в том примере в Sub New не производится проверки значения Checked и соответствующей закраски квадратика. Ты об этом?
0
 Аватар для Gelo123321
22 / 22 / 8
Регистрация: 05.01.2012
Сообщений: 282
16.05.2013, 19:58  [ТС]
Юпатов Дмитрий да. Я могу там вставить если Чекед = тру, то закрасить эго ( state = 1) но тогда он постоянно будет таким, и уже когда жать на него эго не будет ничего менять... вот(

Добавлено через 4 часа 6 минут
Вот питаюсь сделать перересовку. В первом варианте все просто, задал в конце функции, или свойства самодельную функцию DrawProgress(), и пошло поехало. А во втором. Черт эго знает как задать. OnPaint() не катит никак...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2013, 19:58
Помогаю со студенческими работами здесь

Логи - какой способ лучше выбрать ?
Доброго времени суток. Подскажите какой способ лучше выбрать для ведения логов, для такой задачи: есть приложение Клиент-сервер, на...

Какой способ разгона процессора лучше?
Вопрос к знатокам оверлокерам, каким способом лучше разгонять процессор: при помощи множителя процессора или базового генератора? ...

Какой способ работы с файлами лучше?
Мне известно по крайней мере три способа: 1 TStringList::LoadFromFile 2 std::ofstream 3 FILE *fp = fopen Чем отличаются...

Какой способ конкатенации строк лучше использовать?
Всем доброго времени суток. Я запутался с объединением строк на С++. Несколько классов про string запутывают как-то. Вот например есть...

Какой способ реализации горячих клавиш лучше?
Прочитал множество топиков на форуме и статей в инете на эту тему, и так и не понял, какой вариант является "каноничным". В...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru