Public Function VarPtr(ByVal o As Object) As Integer
Dim gc As System.Runtime.InteropServices.GCHandle = _
System.Runtime.InteropServices.GCHandle.Alloc(o, _
System.Runtime.InteropServices.GCHandleType.Pinned)
Dim ptr As Integer = gc.AddrOfPinnedObject.ToInt32()
Return ptr
End Function
Менеджер памяти имеет право переместить переменную в другое место, если ему захочется.
GSerg писал(а):Я быстр, а ты неправ: после gc.free() переменную можно перемещать
Несмотря на то, что hdc есть (graphics.gethdc), лучше обойтись без него.
забей на любой Devoce3. Где взять hDC (например для SetDiBits)?
Это я так и не нашел.
все завсисит от конкретной ситуации
Imports System.Runtime.InteropServices
Public Class Form1
Const W As Integer = 300
Const H As Integer = 300
Private GCh As GCHandle
Private Colors(W - 1, H - 1) As Integer
Private Bmp As Bitmap
Private BmpRect As New Rectangle(0, 0, W, H)
Dim Data As Integer = Color.Blue.ToArgb
Private Sub Form1_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated
Me.DoubleBuffered = True
'зафиксировать массив в памяти
GCh = GCHandle.Alloc(Colors, GCHandleType.Pinned)
'создать битмэп
Bmp = New Bitmap( _
W, _
H, _
4 * W, _
Imaging.PixelFormat.Format32bppRgb, _
GCh.AddrOfPinnedObject)
Me.BackgroundImageLayout = ImageLayout.None
Me.BackgroundImage = Bmp
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
If GCh.IsAllocated Then GCh.Free()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const ЧислоКадров As Integer = 500
Dim Start As Date = Now
Button1.Enabled = False
For i As Integer = 1 To ЧислоКадров
For Row As Integer = 0 To W - 1
For Col As Integer = 0 To H - 1
Colors(Row, Col) = Data
Next
Next
Data = Data Xor &HFF00FF
'после каждого кадра - рефреш
Me.Invalidate(BmpRect, False)
Me.Update()
Next
Dim sec As Integer = CType(Now - Start, TimeSpan).TotalSeconds
MsgBox(ЧислоКадров / sec & " кадров в секунду")
Button1.Enabled = True
End Sub
End Class
За XNA будущее.
For Row As Integer = 0 To W - 1
For Col As Integer = 0 To H - 1
Colors(Row, Col) = Data
Next
Next
Сейчас этот форум просматривают: Google-бот и гости: 109