Hi there,
snippet below shows how to load a bitmap w/o using LoadImage.
The BMP is display on the upper right of the dialog.
There is a problem in WM_Paint :
MEMCOPYD hMem + DATASTART, bm.bmBits, bm.bmWidthBytes * bm.bmHeight
the destination is wrong ( bm.bmBits ). The image shifts left.
Does anyone know why ?
Ralph
------------------
snippet below shows how to load a bitmap w/o using LoadImage.
The BMP is display on the upper right of the dialog.
There is a problem in WM_Paint :
MEMCOPYD hMem + DATASTART, bm.bmBits, bm.bmWidthBytes * bm.bmHeight
the destination is wrong ( bm.bmBits ). The image shifts left.
Does anyone know why ?
Ralph
Code:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' file : image.bas ' load bitmap from string ' #DIM ALL #COMPILE EXE #INCLUDE "win32api.inc" FUNCTION MemCopyD(BYVAL src AS LONG, _ BYVAL dst AS LONG, _ BYVAL ln AS LONG) AS LONG #REGISTER NONE ! cld ! mov esi, src ! mov edi, dst ! mov ecx, ln ! shr ecx, 2 ! rep movsd ! mov ecx, ln ! and ecx, 3 ! rep movsb FUNCTION = 0 END FUNCTION CALLBACK FUNCTION DlgMainProc STATIC hDisplay AS LONG STATIC hMem AS LONG STATIC DataStart AS LONG SELECT CASE CBMSG CASE %WM_INITDIALOG ' LOCAL picFileName AS STRING ' picFileName = "E:\pbdll60\datalink\image\europa.bmp" ' hBmp = LoadImage(0, BYVAL STRPTR(picFileName), %IMAGE_BITMAP, 0, 0, %LR_LOADFROMFILE OR %LR_CREATEDIBSECTION ) LOCAL hFile AS LONG LOCAL sBmp AS STRING LOCAL bmf AS BITMAPFILEHEADER PTR hFile = FREEFILE OPEN "E:\pbdll60\datalink\image\europa.bmp" FOR BINARY AS hFile sBmp = SPACE$( LOF( hFile ) ) SEEK hFile, 1 GET$ hFile, LOF( hFile ), sBmp CLOSE hFile bmf = STRPTR( sBmp ) DataStart = @bmf.bfOffBits hMem = GlobalAlloc(%GMEM_FIXED , LEN ( sBmp ) - LEN( BITMAPFILEHEADER ) ) MemCopyD STRPTR(sBmp) + LEN( BITMAPFILEHEADER ), hMem, LEN( sBmp ) - LEN( BITMAPFILEHEADER ) CASE %WM_DESTROY IF hMem THEN GlobalFree hMem CASE %WM_PAINT LOCAL hBmp AS LONG LOCAL dcBitmap AS LONG LOCAL bm AS BITMAP LOCAL R AS RECT LOCAL dcWindow AS LONG LOCAL ps AS PAINTSTRUCT LOCAL bmi AS BITMAPINFO PTR GetClientRect CBHNDL, r bmi = hMem BeginPaint CBHNDL, ps 'Create DC - select bitmap dcWindow = GetDC(hDisplay) dcBitmap = CreateCompatibleDC(dcWindow) hBmp = CreateDIBSection(dcBitmap, @bmi, %DIB_RGB_COLORS, 0, 0, 0) GlobalLock hBmp SelectObject dcBitmap, hBmp 'Get bitmap properties and destination size GetObject hBmp, SIZEOF(bm), bm MEMCOPYD hMem + DATASTART, bm.bmBits, bm.bmWidthBytes * bm.bmHeight BitBlt ps.hDC, 0, 0, r.nRight, r.nBottom, dcBitmap, 0, 0, %SRCCOPY EndPaint CBHNDL, ps EXIT FUNCTION END SELECT END FUNCTION FUNCTION PBMAIN() LOCAL hDlg AS LONG DIALOG NEW 0, "Load Bmp test", ,, 200, 300, %WS_CAPTION OR %WS_SYSMENU TO hDlg DIALOG SHOW MODAL hDlg, CALL DlgMainProc END FUNCTION
------------------
Comment