Code: Select all
Procedure CreateBitmapFromHDC( hDc )
SizeOfBitMapInfoHeader = SizeOf(BITMAPINFOHEADER)
SizeOfBitMapFileHeader = SizeOf(BITMAPFILEHEADER)
hBitmap = GetCurrentObject_(hDc, #OBJ_BITMAP)
GetObject_(hBitmap, SizeOf(BITMAP), @bm.BITMAP)
myBMBytes = (54) + (((bm\bmWidth * 3) + (bm\bmWidth % 4)) * bm\bmHeight)
bmfh.BITMAPFILEHEADER
bmih.BITMAPINFOHEADER
bmfh\bfOffBits = 54
bmfh\bfReserved1 = 0
bmfh\bfReserved2 = 0
bmfh\bfSize = myBMBytes
bmfh\bfType= $4D42
bmih\biSize = SizeOfBitMapInfoHeader
bmih\biBitCount = 24
bmih\biClrImportant = 0
bmih\biClrUsed = 0
bmih\biCompression = 0
bmih\biHeight = bm\bmHeight
bmih\biPlanes = bm\bmPlanes
bmih\biSizeImage = (3 * (bm\bmWidth * bm\bmHeight) )
bmih\biWidth = bm\bmWidth
bmih\biXPelsPerMeter = 0
bmih\biYPelsPerMeter = 0
*bmpBuffer = AllocateMemory( myBMBytes )
*bmpBits = *bmpBuffer + (54)
CopyMemory(@bmfh, *bmpBuffer, SizeOfBitMapFileHeader)
CopyMemory(@bmih, *bmpBuffer + SizeOfBitMapFileHeader, SizeOfBitMapInfoHeader)
hResult = GetDIBits_(hDc, hBitmap, 0, bm\bmHeight, *bmpBits, @bmih, #DIB_RGB_COLORS)
Select hResult
Case 0
FreeMemory(*bmpBuffer)
*bmpBuffer = 0
Case #ERROR_INVALID_PARAMETER
FreeMemory(*bmpBuffer)
*bmpBuffer = 0
Case bm\bmHeight
Default
FreeMemory(*bmpBuffer)
*bmpBuffer = 0
EndSelect
ProcedureReturn *bmpBuffer
EndProcedure
Don't forget to FreeMemory() the pointer returned by this function.....
Example:
Code: Select all
hWnd = OpenWindow(1, 0, 0, 500, 500, "Test Window", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
StringGadget(1, 10, 10, 150, 20, "This is a test!")
hdc = GetDC_(hWnd)
Repeat : Until WaitWindowEvent() = 16
*myImgPtr = CreateBitmapFromHDC(hDc)
CloseWindow(1)
myImage = CatchImage(#PB_Any, *myImgPtr)
SaveImage(myImage, "c:\users\justin\desktop\Test.bmp")
FreeImage(myImage)
FreeMemory(*myImgPtr)