Liebe VBler,
ich bin blutiger Anfänger, was DirectX angeht. Habe mir aus diesem Grund ein Buch gekauft und folgendes Beispiel abgetippt:
Code im Modul:Module Module1
Public Structure D3DPRESENT_PARAMETERS
Public AutoDepthSteniclFormat As DepthFormat
Public BackBufferCount As Integer
Public BackBufferFormat As Format
Public BackBufferHeight As Integer
Public BackBufferWidth As Integer
Public DeviceWindow As Control
Public DeviceWindowHandle As IntPtr
Public EnableAutoDepthStencil As Boolean
Public FullScreenRefreshRateInHz As Integer
Public MultiSample As MultiSampleType
Public MultiSampleQuality As Integer
Public PresentationInterval As PresentInterval
Public PresentFlag As PresentFlag
Public SwapEffect As SwapEffect
Public Windowed As Boolean
End Structure
Public Direct3DDevice As Microsoft.DirectX.Direct3D.Device
Public vbBuffer_Dreieck As Direct3D.VertexBuffer = Nothing
Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs)
Dim vb As Direct3D.VertexBuffer = CType(sender, Direct3D.VertexBuffer)
Dim verts As Direct3D.CustomVertex.TransformedColored() = CType(vb.Lock(0, 0), _
Direct3D.CustomVertex.TransformedColored())
verts(0).X = 150
verts(0).X = 50
verts(0).Z = 0.5F
verts(0).Rhw = 1
verts(0).Color = System.Drawing.Color.Aqua.ToArgb()
verts(1).X = 250
verts(1).Y = 250
verts(1).Z = 0.5F
verts(1).Rhw = 1
verts(1).Color = System.Drawing.Color.Brown.ToArgb()
verts(2).X = 50
verts(2).Y = 250
verts(2).Z = 0.5F
verts(2).Rhw = 1
verts(2).Color = System.Drawing.Color.LightPink.ToArgb()
vb.Unlock()
End Sub
Public Sub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs)
Dim dev As Direct3D.Device = CType(sender, Direct3D.Device)
vbBuffer_Dreieck = New Direct3D.VertexBuffer(GetType(Direct3D.CustomVertex.TransformedColored) _
, 3, dev, 0, VertexFormats.Transformed, Pool.Default)
AddHandler vbBuffer_Dreieck.Created, AddressOf OnCreateVertexBuffer
OnCreateVertexBuffer(vbBuffer_Dreieck, Nothing)
End Sub
Public Function CreateDirect3DDevice(ByVal Handle As Form) As Boolean
Try
Dim presentParams As New Direct3D.PresentParameters()
presentParams.Windowed = True
presentParams.SwapEffect = SwapEffect.Discard
Direct3DDevice = New Direct3D.Device(0, DeviceType.Hardware, Handle, _
CreateFlags.HardwareVertexProcessing, presentParams)
Return True
Catch ex As DirectXException
Return False
End Try
End Function
Code in der UserForm:Public Class Form1
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
CreateDirect3DDevice(Me)
Direct3DDevice.Clear(Direct3D.ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0)
Direct3DDevice.BeginScene()
Direct3DDevice.SetStreamSource(0, vbBuffer_Dreieck, 0)
Direct3DDevice.VertexFormat = Direct3D.CustomVertex.TransformedColored.Format
Direct3DDevice.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1)
Direct3DDevice.EndScene()
Direct3DDevice.Present()
End Sub
Es soll einfach ein Dreieck auf blauem Hintergrund gezeichnet werden. Wenn ich die ZeileDirect3DDevice.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1)
auskommentiere, funktioniert der Code. Die Userform wird blau.
Mit der Zeile kommt folgende Fehlermeldung:
InvalidCallException wurde nicht behandelt
Fehler in der Anwendung
Kann mir jemand helfen?
Vielen Dank im Voraus.
Lieben Gruß,
Jan