تنتج وظيفة bitblt صورة نقطية فارغة عند تجميعها لتطبيق X86 في .NET 2.0 VB

StackOverflow https://stackoverflow.com/questions/3858389

  •  27-09-2019
  •  | 
  •  

سؤال

لدي وظيفة غلاف 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top