Da bi ovo radilo na formi treba da bude Button1, Button2 i pictureBox "SlikaDest" i u direktorijumu odakle se staruje treba da bude slika.bmp
Trik koji sam uporebio je da se slika(ili slike) jednaput fiksira u memoriji i da se kasnije koristi nebrojeno puta jer iz nekog razloga nakon brisanja objekata memorija ostaje alocirana i dolazi do leak-a.
Ovo resenje je upotrebljivo samo ako se vise puta koriste iste slike u suprotnom je neupotrebljivo jer nisam provalio kako da nateram net da zaista oslobadja memoriju.
Druga losa strana ovog resenja je sto prvo mora da se pritisne button2 da bi uzeo HDC od picturebox-a sto ne moze da se ubaci u Form1_load a sto je u mom slucaju OK jer ionako odmah po startovanju programa moraju da se izaberu neke opcije.
Code:
Imports System
Public Class Form1
Inherits System.Windows.Forms.Form
Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean
<System.Runtime.InteropServices.DllImport("gdi32")> _
Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
End Function
<System.Runtime.InteropServices.DllImport("gdi32")> _
Shared Function DeleteObject(ByVal hObject As IntPtr) As Integer
End Function
Dim SlikaBase As New Bitmap("slika.bmp")
Dim SlikaMem As Graphics = Graphics.FromImage(SlikaBase)
Dim HDC4 As IntPtr = SlikaMem.GetHdc
Dim HDC5 As IntPtr
Dim flip As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Integer = 2400
If flip Then
Do
BitBlt(HDC5, 0, 0, 110, 360, HDC4, 0, n, 13369376)
n += -40
Loop Until n <= -40
Else : MsgBox("prvo mora da se pritisne taster Button2")
End If
'SlikaMem.ReleaseHdc(HDC4) 'OVO NE RADI
'SlikaDestX.ReleaseHdc(HDC5) 'TJ NE OSLOBADJA UOPSTE MEMORIJU
'SlikaMem.Dispose() 'Da bi program radio ove linije ne smeju
'SlikaDestX.Dispose() 'ukljucene
'DeleteObject(SlikaBase.GetHbitmap) 'jer ce izbrisati objekte
'SlikaBase.Dispose() 'ali na zalost nece osloboditi memoriju
End Sub
Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If flip = False Then
Static Dim SlikaDestX As Graphics = SlikaDest.CreateGraphics
HDC5 = SlikaDestX.GetHdc
flip = True
End If
End Sub
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SelectObject(HDC4, SlikaBase.GetHbitmap)
End Sub
End Class