تنتج وظيفة bitblt صورة نقطية فارغة عند تجميعها لتطبيق X86 في .NET 2.0 VB
سؤال
لدي وظيفة غلاف bitblt في مشروع VB الخاص بي. إنه يعمل بشكل جيد عند تجميعه كأي وحدة المعالجة المركزية ، لكن عندما أهدف إلى x86 ، فإنه يخلق صورة نقطية فارغة. يجب أن أستخدم x86 لأن أجزاء أخرى من التطبيق تتطلب ذلك. اي افكار عن ما قد يكون خاطئ؟ هنا هو الرمز:
Imports System.Drawing.Imaging
''' <summary>
''' Provides the static method ControlCapture used to
''' take screenshots of the specified control.
''' </summary>
''' <remarks>This fails unless compiled targeting Any CPU!!!</remarks>
Public Class ControlCapture
''' <summary>
''' Pointer to gdi.exe win32 function.
''' </summary>
''' <param name="hDestDC">destination device context</param>
''' <param name="x">x coord. of output rectangle</param>
''' <param name="y">y coord. of output rectangle</param>
''' <param name="nWidth">width of source and dest. rectangle</param>
''' <param name="nHeight">height of source and dest. rectangle</param>
''' <param name="hSrcDC">source device context</param>
''' <param name="xSrc">x coord. of rectangle to capture</param>
''' <param name="ySrc">y coord. of rectangle to capture</param>
''' <param name="dwRop">mode (raster op)</param>
''' <returns>0 on failure, non-zero on success</returns>
''' <remarks>from http://support.microsoft.com/kb/147810 </remarks>
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, _
ByVal ySrc As Long, ByVal dwRop As Long) As Long
''' <summary>
''' Grab a screen capture of the given control.
''' </summary>
''' <param name="control">control to grab</param>
''' <returns>Bitmap image</returns>
''' <remarks>used by mappoint map viewer and bing map viewer</remarks>
Public Shared Function ControlCapture(ByVal control As Control) As Bitmap
'capture params
Dim width As Integer = control.Width
Dim height As Integer = control.Height
'output object
Dim bitmap As Bitmap = New Bitmap(width, height, PixelFormat.Format32bppArgb)
'get handles to source and destination objects as graphics
Dim sourceGraphics As Graphics = control.CreateGraphics()
Dim destGrahpics As Graphics = Drawing.Graphics.FromImage(bitmap)
'actual handles
Dim sourceGraphicsPointer As System.IntPtr = sourceGraphics.GetHdc()
Dim destGraphicsPointer As System.IntPtr = destGrahpics.GetHdc()
'get references as ints
Dim destAddress As Integer = destGraphicsPointer
Dim sourceAddress As Integer = sourceGraphicsPointer
'call win32 api
BitBlt(destAddress, 0, 0, width, height, sourceAddress, 0, 0, Codes.SourceCopy)
'clean up
sourceGraphics.ReleaseHdc(sourceGraphicsPointer)
destGrahpics.ReleaseHdc(destGraphicsPointer)
Return bitmap
End Function
''' <summary>
''' SRCCOPY(CC0020) Copies the source bitmap to destination bitmap.
''' </summary>
''' <remarks>From http://support.microsoft.com/kb/147810 </remarks>
Private Enum Codes
SourceCopy = &HCC0020
End Enum
End Class
شكرا يا براين
المحلول
إنها مشكلة كلاسيكية جميلة مع VB.NET ، إعلان Pinvoke خاطئ. اللغة التي تستخدمها تعمل فقط مع VB6 ، وهي لغة تستخدم لأسباب تاريخية عدد صحيح لرقم 16 بت ، طويل لرقم 32 بت. هذا يعود إلى الإصدارات المبكرة من VB التي تم تشغيلها على أنظمة التشغيل 16 بت. تم إعادة تصميم VB.NET للعمل بشكل جيد على أنظمة التشغيل 32 بت ، بله عدد صحيح 32 بت ، وطوله 64 بت. عليك أن تعلن الحجج على أنها عدد صحيح. إنه يعمل في وضع 64 بت عن طريق الصدفة.
يستخدم pinvoke.net للحصول على الإعلان المناسب.
وإلقاء نظرة جيدة على الرسومات. copyfromscreen و control.drawtobitmap لوظائف مماثلة للغاية دون الحاجة إلى pinvoke.