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:
INITDX Module 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
LoadImage 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
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




Reply With Quote