CreateCompatibleBitmap()

Post Reply
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

CreateCompatibleBitmap()

Post by manuramos »

Estimados compañeros, me preguntaba si a partir de un array con los datos de un bitmap tipo BMP, con cabeceras, longitud, etc...) se podría crear el bitmap correspondiente para dibujarlo de fondo con PalBmpDraw(), BitBlt(), o StretchBmp().

He intentado crear un BITMAP con CreateCompatibleBitmap (dentro GDI32.DLL), simplemente copiando el fondo del dialogo ( como hace WNDBITMAP), pero con 16 bits no me crea un mapa de bits correcto. Es decir me crea un hBmp correcto con largo y ancho especificados, pero el contenido no tiene sentido. Por eso quisiera intentar crear un BITMAP a partir de los datos almacenados en una variable. Pero no he tenido exito. Si alguien tuviera alguna idea (lo he intentado con CreateBitmap, pero parece que tengo el mismo problema que con CreateCompatibleBitmap)

Muchas gracias.
Nos Gusta Programar
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post by manuramos »

Después de pruebas y más pruebas, parece como si CreateCompatibleBitmap o CreateBitmap si crean un mapa de bit, pero no a partir del contexto indicado. Parece como si cogieran información de la memoria en lugar del contexto (hDc) del Dialogo indicado. Es más, a cada vez que lo ejecuto me da un resultado visual diferente.

Este es mi ejemplo:

DEFINE DIALOG oDlS OF oWin FROM 100,100 TO 300,600 PIXEL COLOR 0,CLR_WHITE ;
STYLE nOR(WS_POPUP,WS_VISIBLE,WS_BORDER )
@ 10,10 BUTTON oBot PROMPT "PINTAR" OF oDlS SIZE 100,12 PIXEL ACTION PintNeoFond(oDlS)
ACTIVATE DIALOG oDlS
RETURN NIL

FUNCTION PintNeoFond(oWin)
LOCAL hDc := oWin:GetDc()
LOCAL hDC1 := CreateCDC(hDc)
LOCAL hBmp
*
FillRect( hDc, {20,20,60,60}, hBrs ) // Para modificar el fondo antes de, supuestamente, reponerlo con StretchBmp.

hBmp := CreateCoBi(hDc,100,100)
SelectObject(hDC1,hBmp)
StretchBmp(hDc,0,0,oWin:nWidth,oWin:nHeight,hDC1,0,0,100,100, 13369376) // ,8913094)
DeleteObject(hBmp)
DeleteDc(hDC1)
oWin:ReleaseDc()
RETURN NIL

DLL32 FUNCTION CreateCoBi( hdc AS LONG, nWidth AS LONG, nHeight AS LONG ) AS LONG ;
PASCAL FROM "CreateCompatibleBitmap" LIB "gdi32.dll"

DLL32 FUNCTION StretchBmp( hdc AS LONG,x AS LONG,y AS LONG,nWidth AS LONG,nHeight AS LONG, ;
hSrcDC AS LONG,xSrc AS LONG,ySrc AS LONG,nSrcWidth AS LONG,nSrcHeight AS LONG,dwRop AS LONG ) AS LONG ;
PASCAL FROM "StretchBlt" LIB "gdi32.dll"

A ver si encontrais el fallo. Comparadlo con la funcion "WNDBITMAP" del fichero "./SOURCE/WINAPI/wndprint.c"

Un saludo.
Nos Gusta Programar
Post Reply