I was using DirectX and VB6 to load an image on the backbuffer.

I used a function enclosed in a method in VB6 to load the image to the backbuffer.

Then I copied the backbuffered image to the screen buffer.

However It crashes every time I try to load the program but the VB6 compiler doesn't pick up any errors.

I found out that it is having problems copying the image from the backbuffer to the screen buffer.......

I used the DirectX8 Copy.Rects function but something is going wrong.

When I use the function in the form it works great but when its in the method it crashes.

What is going on here? Sorry if its a simple mistake as I am still learning VB6 and DirectX.

Form1 Code:
Code:
Option Explicit
Option Base 0

Const SCREENWIDTH As Long = 640
Const SCREENHEIGHT As Long = 480
Const FULLSCREEN As Boolean = False
Const C_BLACK As Long = &H0
Dim surface As Direct3DSurface8
Dim backbuffer As Direct3DSurface8

Private Sub Form_Load()

'Set up form size
Form1.Width = Screen.TwipsPerPixelX * (SCREENWIDTH + 12)
Form1.Height = Screen.TwipsPerPixelY * (SCREENHEIGHT + 30)
Form1.Show

'Starts DirectX
InitDirect3D Me.hwnd, SCREENWIDTH, SCREENHEIGHT, FULLSCREEN

'get reference to the back buffer
Set backbuffer = d3ddev.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)

'load the bitmap file
Set surface = LoadSurface(App.Path & "\pic.bmp")

End Sub

Private Sub Form_Paint()

'copy image to backbuffer
d3ddev.CopyRects surface, ByVal 0, 0, backbuffer, ByVal 0

'draw the backbuffer to the screen
d3ddev.Present ByVal 0, ByVal 0, 0, ByVal 0

End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Shutdown

End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

'ESC Key
If KeyCode = 27 Then Shutdown

End Sub
INITDX Module Code:

Code:
Option Explicit
Option Base 0

Global dx As DirectX8
Global d3d As Direct3D8
Global d3dpp As D3DPRESENT_PARAMETERS
Global dispmode As D3DDISPLAYMODE
Global d3ddev As Direct3DDevice8
Global d3dx As New D3DX8

Public Sub InitDirect3D( _
ByVal hwnd As Long, _
ByVal lWidth As Long, _
ByVal lHeight As Long, _
ByVal bFullscreen As Boolean)

On Local Error GoTo fatal_error

Set dx = New DirectX8

Set d3d = dx.Direct3DCreate()

If d3d Is Nothing Then
MsgBox "Error init Direct3D!"
Shutdown
End If

d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, dispmode

Dim d3dpp As D3DPRESENT_PARAMETERS
d3dpp.hDeviceWindow = hwnd
d3dpp.BackBufferCount = 1
d3dpp.BackBufferWidth = lWidth
d3dpp.BackBufferHeight = lHeight
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
d3dpp.BackBufferFormat = dispmode.Format

If bFullscreen Then
    d3dpp.Windowed = 0
Else
    d3dpp.Windowed = 1
End If

d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE
d3dpp.AutoDepthStencilFormat = D3DFMT_D32

Set d3ddev = d3d.CreateDevice( _
D3DADAPTER_DEFAULT, _
D3DDEVTYPE_HAL, _
hwnd, _
D3DCREATE_SOFTWARE_VERTEXPROCESSING, _
d3dpp)

If d3ddev Is Nothing Then
    MsgBox "Error creating the Direct3D device"
    Shutdown
End If

Exit Sub

fatal_error:
    MsgBox "Critical error in Start_Direct3D!"
    Shutdown
End Sub

Public Sub Shutdown()

Set d3ddev = Nothing
Set d3d = Nothing
Set dx = Nothing
End

End Sub
LoadImage Module Code:

Code:
Public Function LoadSurface(ByVal filename As String) As Direct3DSurface8

On Local Error GoTo fatal_error

Dim surf As Direct3DSurface8

Set LoadSurface = Nothing

Set surf = d3ddev.CreateImageSurface(SCREENWIDTH, SCREENHEIGHT, dispmode.Format)

If surf Is Nothing Then
    MsgBox "Error creating surface!"
    Exit Function
End If

d3dx.LoadSurfaceFromFile _
surf, _
ByVal 0, _
ByVal 0, _
filename, _
ByVal 0, _
D3DX_DEFAULT, _
0, _
ByVal 0

If surf Is Nothing Then
    MsgBox "Error loading " & filename & "!"
    Exit Function
End If

fatal_error:
    Exit Function
End Function