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

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

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

Author24 — интернет-сервис помощи студентам
Приветствую! Захотел сделать свой контрол, нашел в интеренете аж целых 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2013, 22:10
Ответы с готовыми решениями:

Какой способ рисования самый быстрый?
Вот нашел интересный код рисования на WinApi, переводил с языка С++: procedure...

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

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

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

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

Добавлено через 4 часа 6 минут
Вот питаюсь сделать перересовку. В первом варианте все просто, задал в конце функции, или свойства самодельную функцию DrawProgress(), и пошло поехало. А во втором. Черт эго знает как задать. OnPaint() не катит никак...
0
16.05.2013, 19:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2013, 19:58
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru