Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / gdi+ redraw / 8 сообщений из 8, страница 1 из 1
12.09.2008, 14:02
    #35536453
Mr.Power
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Нужна помощь!
Рисую с помощью GDI+ png изображение в форму.
Размер формы может изменятся во время работы приложения.

Как сделать лучшую прорисовку без мерцания?

P.S. Хит парад то что я уже пробовал...
...
Рейтинг: 0 / 0
12.09.2008, 16:02
    #35536799
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Mr.Power,
в общих чертах (набросок). Пусть на форме есть Picture1 с AutoRedraw=True. Тогда отрисовка и изменение размера могут отрабатываться так:
Код: plaintext
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.
Private Function MyDraw( _
   ByVal pbDest As PictureBox, ByVal nBitmap As Long, _
   Optional ByVal Interpolation As InterpolationMode = InterpolationModeDefault, _
   Optional ByVal Smoothing As SmoothingMode = SmoothingModeDefault, _
   Optional ByVal PixelOffset As PixelOffsetMode = PixelOffsetModeDefault, _
   Optional ByVal CompositingQuality As CompositingQualityMode = CompositingQualityDefault, _
   Optional ByVal CompositingMode As CompositingModeMode = CompositingModeSourceOver) _
   As Long

 Dim nStatus As Status
 Dim nGraphics As Long
 Dim w As Single
 Dim h As Single

 nStatus = GdipCreateFromHDC(pbDest.hDC, nGraphics)
 If nStatus = OK Then
    nStatus = GdipSetSmoothingMode(nGraphics, Smoothing)
    nStatus = GdipSetInterpolationMode(nGraphics, Interpolation)
    nStatus = GdipSetPixelOffsetMode(nGraphics, PixelOffset)
    nStatus = GdipSetCompositingQuality(nGraphics, CompositingQuality)
    nStatus = GdipSetCompositingMode(nGraphics, CompositingMode)
    
    w = pbDest.ScaleX(pbDest.ScaleWidth, pbDest.ScaleMode, vbPixels)
    h = pbDest.ScaleY(pbDest.ScaleHeight, pbDest.ScaleMode, vbPixels)
    nStatus = GdipDrawImageRect(nGraphics, nBitmap,  0 ,  0 , w, h)
            
    nStatus = GdipDeleteGraphics(nGraphics)
 End If
End Function

Private Sub Form_Resize()
 On Error Resume Next
 Picture1.Move Picture1.Left, Picture1.Top, _
               ScaleWidth - Picture1.Left, ScaleHeight - Picture1.Top
 'm_nBitmap сформирован заранее, GdipLoadImageFromFile() в простом случае
 MyDraw Picture1, m_nBitmap 
 Picture1.Picture = Picture1.Image
End Sub
...
Рейтинг: 0 / 0
12.09.2008, 18:02
    #35537098
Mr.Power
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Вот мой код для прорисобки в форму

Код: plaintext
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.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
'Модуль
Public Const GdiPlusVersion As Long =  1 &

Public Const QualityModeInvalid As Long = - 1 &
Public Const QualityModeDefault As Long =  0 &
Public Const QualityModeLow As Long =  1 &
Public Const QualityModeHigh As Long =  2 &

Public Type GDIPlusStartupInput
    GdiPlusVersion As Long
    DebugEventCallback As Long
    SuppressBackgroundThread As Long
    SuppressExternalCodecs As Long
End Type

Public Enum szmode
StreachSZ =  1 
AutoSZ =  2 

End Enum

Public Enum Status 'GDI+ Status
    OK =  0 
    GenericError =  1 
    InvalidParameter =  2 
    OutOfMemory =  3 
    ObjectBusy =  4 
    InsufficientBuffer =  5 
    NotImplemented =  6 
    Win32Error =  7 
    WrongState =  8 
    Aborted =  9 
    FileNotFound =  10 
    ValueOverflow =  11 
    AccessDenied =  12 
    UnknownImageFormat =  13 
    FontFamilyNotFound =  14 
    FontStyleNotFound =  15 
    NotTrueTypeFont =  16 
    UnsupportedGdiplusVersion =  17 
    GdiplusNotInitialized =  18 
    PropertyNotFound =  19 
    PropertyNotSupported =  20 
    ProfileNotFound =  21 
End Enum

Public Enum InterpolationMode
    InterpolationModeInvalid = QualityModeInvalid
    InterpolationModeDefault = QualityModeDefault
    InterpolationModeLowQuality = QualityModeLow
    InterpolationModeHighQuality = QualityModeHigh
    InterpolationModeBilinear = QualityModeHigh +  1 
    InterpolationModeBicubic = QualityModeHigh +  2 
    InterpolationModeNearestNeighbor = QualityModeHigh +  3 
    InterpolationModeHighQualityBilinear = QualityModeHigh +  4 
    InterpolationModeHighQualityBicubic = QualityModeHigh +  5 
End Enum

Public Enum SmoothingMode
    SmoothingModeInvalid = QualityModeInvalid
    SmoothingModeDefault = QualityModeDefault
    SmoothingModeHighSpeed = QualityModeLow
    SmoothingModeHighQuality = QualityModeHigh
    SmoothingModeNone = QualityModeHigh +  1 
    SmoothingModeAntiAlias8x4 = QualityModeHigh +  2 
    SmoothingModeAntiAlias = SmoothingModeAntiAlias8x4
    'SmoothingModeAntiAlias8x8
End Enum

Public Enum PixelOffsetMode
    PixelOffsetModeInvalid = QualityModeInvalid
    PixelOffsetModeDefault = QualityModeDefault
    PixelOffsetModeHighSpeed = QualityModeLow
    PixelOffsetModeHighQuality = QualityModeHigh
    PixelOffsetModeNone = QualityModeHigh +  1 
    PixelOffsetModeHalf = QualityModeHigh +  2 
End Enum

Public Enum CompositingQualityMode
    CompositingQualityInvalid = QualityModeInvalid
    CompositingQualityDefault = QualityModeDefault
    CompositingQualityHighSpeed = QualityModeLow
    CompositingQualityHighQuality = QualityModeHigh
    CompositingQualityGammaCorrected = QualityModeHigh +  1 
    CompositingQualityAssumeLinear = QualityModeHigh +  2 
End Enum

Public Enum CompositingModeMode
    CompositingModeSourceOver =  0 
    CompositingModeSourceCopy =  1 
End Enum

Private Declare Function GdiplusStartup Lib "gdiplus" _
    (ByRef token As Long, ByRef lpInput As GDIPlusStartupInput, _
    Optional ByRef lpOutput As Any) As Status

Private Declare Function GdiplusShutdown Lib "gdiplus" _
    (ByVal token As Long) As Status

Private Declare Function GdipLoadImageFromFile Lib "gdiplus" _
    (ByVal FileName As Long, ByRef Image1 As Long) As Status

Private Declare Function GdipCreateFromHDC Lib "gdiplus" _
    (ByVal hdc As Long, ByRef graphics As Long) As Status

Private Declare Function GdipDeleteGraphics Lib "gdiplus" _
    (ByVal graphics As Long) As Status

Private Declare Function GdipDrawImageRect Lib "gdiplus" _
    (ByVal graphics As Long, ByVal Image1 As Long, _
    ByVal x As Single, ByVal y As Single, ByVal Width As Single, _
    ByVal Height As Single) As Status

Private Declare Function GdipGetImageDimension Lib "gdiplus" _
    (ByVal Image1 As Long, ByRef Width As Single, _
    ByRef Height As Single) As Status

Private Declare Function GdipDisposeImage Lib "gdiplus" _
    (ByVal Image1 As Long) As Status

Private Declare Function GdipSetInterpolationMode Lib "gdiplus" _
    (ByVal graphics As Long, ByVal InterpolationMode As _
    InterpolationMode) As Status

Private Declare Function GdipGetInterpolationMode Lib "gdiplus" _
    (ByVal graphics As Long, ByRef InterpolationMode As _
    InterpolationMode) As Status

Private Declare Function GdipSetSmoothingMode Lib "gdiplus" _
    (ByVal graphics As Long, ByVal SmoothingMode As _
    SmoothingMode) As Status

Private Declare Function GdipGetSmoothingMode Lib "gdiplus" _
    (ByVal graphics As Long, ByRef SmoothingMode As _
    SmoothingMode) As Status

Private Declare Function GdipSetPixelOffsetMode Lib "gdiplus" _
    (ByVal graphics As Long, ByVal PixelOffsetMode As _
    PixelOffsetMode) As Status

Private Declare Function GdipGetPixelOffsetMode Lib "gdiplus" _
    (ByVal graphics As Long, ByRef PixelOffsetMode As _
    PixelOffsetMode) As Status

Private Declare Function GdipSetCompositingQuality Lib "gdiplus" _
    (ByVal graphics As Long, ByVal CompositingQuality As _
    CompositingQualityMode) As Status

Private Declare Function GdipGetCompositingQuality Lib "gdiplus" _
    (ByVal graphics As Long, ByRef CompositingQuality As _
    CompositingQualityMode) As Status

Private Declare Function GdipSetCompositingMode Lib "gdiplus" _
    (ByVal graphics As Long, ByVal CompositingMode As _
    CompositingModeMode) As Status

Private Declare Function GdipGetCompositingMode Lib "gdiplus" _
    (ByVal graphics As Long, ByRef CompositingMode As _
    CompositingModeMode) As Status

Public GdipToken As Long
Public GdipInitialized As Boolean

Dim ret2Status As Status
    Dim lBitmap As Long
    Dim lngGraphics As Long
    Dim ImageWidth As Single
    Dim ImageHeight As Single
    Dim IW As Single
    Dim IH As Single
Public szmodeL As szmode
Public Function StartUpGDIPlus(ByVal GdipVersion As Long) As Status
    ' Initialisieren der GDI+ Instanz
    Dim GdipStartupInput As GDIPlusStartupInput
    GdipStartupInput.GdiPlusVersion = GdipVersion
    StartUpGDIPlus = GdiplusStartup(GdipToken, GdipStartupInput, ByVal  0 )
End Function

Public Function ShutdownGDIPlus() As Status

    ShutdownGDIPlus = GdiplusShutdown(GdipToken)
End Function






Public Function Execute(ByVal lReturn As Status) As Status
    Dim lCurErr As Status
    If lReturn = Status.OK Then
        lCurErr = Status.OK
    Else
        lCurErr = lReturn
  
    End If
    Execute = lCurErr
End Function

'функция для загрузки изображения.
Public Function loadIMG(ipath As String, Istile As SmoothingMode)
GdipCreateFromHDC Form1.hdc, lngGraphics
GdipSetSmoothingMode lngGraphics, Istile
GdipSetInterpolationMode lngGraphics, InterpolationModeInvalid
GdipSetPixelOffsetMode lngGraphics, PixelOffsetModeHighQuality
GdipSetCompositingQuality lngGraphics, CompositingQualityHighQuality
GdipSetCompositingMode lngGraphics, CompositingModeSourceOver
GdipLoadImageFromFile StrPtr(ipath), lBitmap
GdipGetImageDimension lBitmap, ImageWidth, ImageHeight


End Function

'функция для отрисовки.

Public Function Drawimg()

DoEvents
Dim w, h As Long
If szmodeL = StreachSZ Then
w = Form1.ScaleX(Form1.Width,  1 ,  3 )
h = Form1.ScaleY(Form1.Height,  1 ,  3 )
Else
w = ImageWidth
h = ImageHeight
End If
GdipDeleteGraphics lngGraphics
GdipCreateFromHDC Form1.hdc, lngGraphics

GdipDrawImageRect lngGraphics, lBitmap,  0 ,  0 , w, h
GdipDeleteGraphics lngGraphics
End Function






модуль формы

Код: plaintext
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.
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type


Private Declare Function InvalidateRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT, ByVal bErase As Long) As Long
Private Declare Function UpdateWindow Lib "user32.dll" (ByVal hwnd As Long) As Long


Private Sub Form_Load()
 Dim retStatus As Status
    GdipInitialized = False
    
    retStatus = Execute(StartUpGDIPlus(GdiPlusVersion))
    If retStatus = OK Then
        GdipInitialized = True
    Else
 
    End If
    szmodeL = StreachSZ
    Me.Show
    loadIMG "E:\undo_round_64_h.png", SmoothingModeAntiAlias8x4

    Call Drawimg
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
 Dim retStatus As Status

    If GdipInitialized = True Then
        retStatus = Execute(ShutdownGDIPlus)
    End If

End Sub


Private Sub Timer1_Timer()

Call Drawimg

End Sub
как доработать код чтобы не было мерцания???
...
Рейтинг: 0 / 0
12.09.2008, 18:56
    #35537199
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Mr.Power,
Рисуй в PictureBox.hDC, а не в Form.hDC, иначе придётся возиться с сабклассингом, чувствую, для перекрытия WM_ERASEBKGND или/и WM_PAINT.
Как я понимаю, png с прозрачностью? Тогда очищай картинку в PictureBox перед вызовом процедуры отрисовки:
Код: plaintext
Set Picture1.Picture = Nothing
...
Рейтинг: 0 / 0
12.09.2008, 19:08
    #35537219
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Код: plaintext
Dim w, h As Long
равносильно
Код: plaintext
Dim w As Variant, h As Long
Там, кстати, Single нужны.
Вот это
Код: plaintext
1.
w = Form1.ScaleX(Form1.Width,  1 ,  3 )
h = Form1.ScaleY(Form1.Height,  1 ,  3 )
неверно, размер клиентской части Form1.ScaleWidth * Form1.ScaleHeight.
...
Рейтинг: 0 / 0
13.09.2008, 09:08
    #35537515
Mr.Power
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
А что если использовать место формы USERCONTROL?
...
Рейтинг: 0 / 0
15.09.2008, 12:29
    #35539292
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Mr.PowerА что если использовать место формы USERCONTROL?Что-то не работает с PictureBox?
С UserControl - так же, положить на него PictureBox. Или вопрос про UserControl с прозрачным фоном?
...
Рейтинг: 0 / 0
15.09.2008, 13:55
    #35539506
Mr.Power
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi+ redraw
Бенедикт Mr.PowerА что если использовать место формы USERCONTROL?Что-то не работает с PictureBox?
С UserControl - так же, положить на него PictureBox. Или вопрос про UserControl с прозрачным фоном?
да скорее 2
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / gdi+ redraw / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]