同学在vc的程序中把位图拷贝到内存中,我要在vb的程序中把位图读出来,看了斑竹zyl910以前的一些文章,试着做,可惜搞不定,希望大家能帮帮忙了。
vc中相关的程序段:
LPBITMAPINFOHEADER lpbi = pspview->GetGraph();
ihl.lDIB = GlobalSize((HANDLE)lpbi);
memcpy(lpData,lpbi,ihl.lDIB);
GlobalFree((HANDLE)lpbi); /*free memory*/
我在vb的module中的相关程序段,
Dim MyBMIH As BITMAPINFOHEADER
Dim MyWidthBytes As Long
Dim MyPtr As Long
Dim MyhDIB As Long
Dim MyhDC As Long
Dim hOldMap As Long
Dim MapAddress as long
Dim MapHandle as Long
MapHandle = OpenFileMapping(FILE_MAP_READ, False, "PrintMap")
MapAddress = MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0)'找到映射文件的地址 CopyMemory MyBMIH, ByVal (MapAddress), Len(MyBMIH)
MyhDC = CreateCompatibleDC(0)
MyhDIB = CreateDIBSection(MyhDC, MyBMIH, 0, MyPtr, 0, 0)
hOldMap = SelectObject(MyhDC, MyhDIB)
'下面有问题,不知道该怎么解决
CopyMemory ByVal MyPtr, ByVal MapAddress,MyBMIH.biSizeImage
BitBlt Form1.Picture1.hdc, 0, 0, Form1.Picture1.ScaleWidth, Form1.Picture1.ScaleHeight, MyhDC, 0, 0, vbSrcCopy '传输位图数据
DeleteObject SelectObject(MyhDC, hOldMap)
DeleteObject MyhDC
vc中相关的程序段:
LPBITMAPINFOHEADER lpbi = pspview->GetGraph();
ihl.lDIB = GlobalSize((HANDLE)lpbi);
memcpy(lpData,lpbi,ihl.lDIB);
GlobalFree((HANDLE)lpbi); /*free memory*/
我在vb的module中的相关程序段,
Dim MyBMIH As BITMAPINFOHEADER
Dim MyWidthBytes As Long
Dim MyPtr As Long
Dim MyhDIB As Long
Dim MyhDC As Long
Dim hOldMap As Long
Dim MapAddress as long
Dim MapHandle as Long
MapHandle = OpenFileMapping(FILE_MAP_READ, False, "PrintMap")
MapAddress = MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0)'找到映射文件的地址 CopyMemory MyBMIH, ByVal (MapAddress), Len(MyBMIH)
MyhDC = CreateCompatibleDC(0)
MyhDIB = CreateDIBSection(MyhDC, MyBMIH, 0, MyPtr, 0, 0)
hOldMap = SelectObject(MyhDC, MyhDIB)
'下面有问题,不知道该怎么解决
CopyMemory ByVal MyPtr, ByVal MapAddress,MyBMIH.biSizeImage
BitBlt Form1.Picture1.hdc, 0, 0, Form1.Picture1.ScaleWidth, Form1.Picture1.ScaleHeight, MyhDC, 0, 0, vbSrcCopy '传输位图数据
DeleteObject SelectObject(MyhDC, hOldMap)
DeleteObject MyhDC
Const GMEM_MOVEABLE = &H2
Const GMEM_ZEROINIT = &H40Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)Private Declare Function GlobalAlloc Lib "kernel32" ( _
ByVal wFlags As Long, _
ByVal dwBytes As Long) As LongPrivate Declare Function GlobalSize Lib "kernel32" ( _
ByVal hMem As Long) As LongPrivate Declare Function GlobalLock Lib "kernel32" ( _
ByVal hMem As Long) As LongPrivate Declare Function GlobalUnlock Lib "kernel32" ( _
ByVal hMem As Long) As LongConst PictureID = &H746C&Private Type PictureHeader
Magic As Long
Size As Long
End TypePublic Function Array2Picture(aBytes() As Byte) As StdPicture
Dim oIPS As IPersistStream
Dim oStream As IStream
Dim hGlobal As Long
Dim lPtr As Long
Dim lSize As Long
Dim Hdr As PictureHeader
' Create a new empty
' picture object
Set Array2Picture = New StdPicture
' Get the IPersistStream interface
Set oIPS = Array2Picture
' Calculate the array size
lSize = UBound(aBytes) - LBound(aBytes) + 1
' Allocate global memory
hGlobal = GlobalAlloc(GHND, lSize + Len(Hdr))
If hGlobal Then
' Get a pointer to the memory
lPtr = GlobalLock(hGlobal)
' Initialize the header
Hdr.Magic = PictureID
Hdr.Size = lSize
' Write the header
MoveMemory ByVal lPtr, Hdr, Len(Hdr)
' Copy the byte array to
' the global memory
MoveMemory ByVal lPtr + Len(Hdr), aBytes(0), lSize
' Release the pointer
GlobalUnlock hGlobal
' Create a IStream object
' with the global memory
Set oStream = CreateStreamOnHGlobal(hGlobal, True)
' Load the picture
' from the stream
oIPS.Load oStream
' Release the IStream
' object
Set oStream = Nothing
End If
End Function以上代码需要OLELIB.tlb支持,如有需要请留E-Mail
Public Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFOHEADER, ByVal un As Long, lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
CreateDIBSection我不太熟悉,看你的程序,似乎MyPtr指向的内存包含了BITMAPINFOHEADER位图头结构。不知道这个参数是不是仅仅包含位图数据还是要包括整个位图文件数据。
http://search.csdn.net/expert/topic/51/5101/2003/5/3/1736081.htm