Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjours les gens. Si quelqu'un s'y connait en fonctions GDI (gdi32.dll), peut-être pourrait-il m'aider avec le code suivant?
Je vous épargne le traitement d'erreur. J'ai mappé les api windows dans des fonction of_... mais les noms restent les mêmes. La fonction prend en entrée le handle d'un bitmap (retourné par l'api loadimage), les coordonnées d'un point d'origine, et la taille désirée pour faire un crop de l'image. Le handle est passé en référence pour récupérer le handle de la nouvelle image.
long ll_res, ll_height, ll_dummy ulong lul_hWndscreen, lul_hdc, lul_lasterror, lul_dcmem, DIB_RGB_COLORS, lul_lpvBits[], lul_uStartScan, lul_height, lul_hdcnew, lul_hdcold, lul_dcmemnew, lul_dcmemold, lul_res ulong lul_cScanLines, lul_holdbitmap1, lul_holdbitmap2, lul_hnewbitmap, lul_dcmembitmap boolean lb_res string ls_dummy bitmapinfo lstr_Info bitmap lst_bitmap u_nv_gdi32 lu_nv_gdi32 u_nv_kernel32 lu_nv_kernel32 u_nv_user32 lu_nv_user32 lu_nv_gdi32 = create u_nv_gdi32 lu_nv_kernel32 = create u_nv_kernel32 lu_nv_user32 = create u_nv_user32 ll_res = lu_nv_gdi32.of_getobject(aul_bitmaphandle, lst_bitmap) lul_hWndscreen = 0 lul_hdc = lu_nv_user32.of_getdc(lul_hWndscreen) lul_dcmemnew = lu_nv_gdi32.of_createcompatibledc(lul_hdc) lul_hnewbitmap = lu_nv_gdi32.of_createcompatiblebitmap(lul_hdc,al_newwidth,al_newheight) lul_holdbitmap1 = lu_nv_gdi32.of_selectobject(lul_dcmemnew, lul_hnewbitmap) lul_hWndscreen = handle(w_main) lul_hdcold = lu_nv_user32.of_getdc(lul_hWndscreen) lul_dcmemold = lu_nv_gdi32.of_createcompatibledc(lul_hdcold) lul_holdbitmap2 = lu_nv_gdi32.of_selectobject(lul_dcmemold, aul_bitmaphandle) lb_res = lu_nv_gdi32.of_bitblt(lul_dcmemnew, 0, 0, al_newwidth, al_newheight, lul_dcmemold, al_newxorigin, al_newyorigin, 13369376) lul_res = lu_nv_gdi32.of_selectobject(lul_dcmemnew, lul_holdbitmap1) aul_bitmaphandle = lul_res // ici, ça ne va pas lul_res = lu_nv_gdi32.of_selectobject(lul_dcmemold, lul_holdbitmap2) lb_res = lu_nv_gdi32.of_deletedc(lul_dcmemnew) lb_res = lu_nv_gdi32.of_deletedc(lul_dcmemold) ll_res = lu_nv_user32.of_releasedc(lul_hWndscreen, lul_hdc) ll_res = lu_nv_user32.of_releasedc(lul_hWndscreen, lul_hdcold) fin_traitement: if isvalid(lu_nv_gdi32) then destroy lu_nv_gdi32 if isvalid(lu_nv_kernel32) then destroy lu_nv_kernel32 if isvalid(lu_nv_user32) then destroy lu_nv_user32 return ll_res
Tout a l'air de bien fonctionner, sauf que quand je veux récupérer le handle de l'image copiée, bah ça me rend rien du tout... ou alors c'est des pixels transparents ...
Si je mets aul_bitmaphandle = lul_res après of_selectobject(lul_dcmemold, lul_holdbitmap2), là, je récupère bien l'image d'origine.
L'image est bien copiée et cropée par le bitblt car si mon device context de destination n'est pas un memory device context, mais par exemple un graphic device context comme celui de la fenetre, l'image s'affiche correctement, correctement cropée, au bon endroit.
Dernière modification par Shed (04-12-2012 09:12:30)
Hors ligne
Bon beh finalement j'ai résolu le problème tout seul.
Le problème venait simplement de l'image qui contenait de la transparence, et bitblt ne fonctionne pas avec la transparence. J'ai utilisé une image plus basique et c'est passé sans problème. (si vous voulez vraiment utiliser cette fonction avec une image comportant de la transparence, je pense qu'il faut utiliser alphablend).
hop, résolu!
Hors ligne
merci pour l'info, ça servira sans doute à qqun d'autre
Hors ligne