Hi All,
I have a BitBlt wrapper function in my VB project. It works just fine when compiled as Any CPU, but when I aim it at x86 it creates an empty bitmap. I must use x86 as other parts of the app require it. Any ideas what could be wrong? Here is the code:
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
Thanks, brian