EXEMPLE D'UTILISATION DE GDI+ DANS VB6

bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 5 oct. 2006 à 09:09
cs_youcef09 Messages postés 1 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 20 novembre 2012 - 20 nov. 2012 à 11:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39804-exemple-d-utilisation-de-gdi-dans-vb6

cs_youcef09 Messages postés 1 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 20 novembre 2012
20 nov. 2012 à 11:07
bonjour
dans le cas où mon fichier tif est composé en plusieurs pages es ce que ce programme l'affiche
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
20 juil. 2011 à 18:48
LA mise à l'échelle se fait mal avec les wmf mais je ne trouve pas comment corriger.
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
20 juil. 2011 à 18:18
J'ai ajouté un bout de code pour conserver les proportions. Je mets du coup ma modif en entier. Pour effacer, je dessine un carré de la couleur du fond ce qui n'est pas trés académique et qui va vite atteindre ses limites. Si qqn a une idée je suis preneur.

'# Permet de dessiner une image issue d'un fichier, en la redimensionnant si nécessaire, et en appliquant un % de translucidité
'**** ByRef voImage As BitMap -- L'image à transmettre
'**** ByVal vnTargetDC As Long -- Le handle de la fenêtre où tracer l'image
'**** ByVal vnX As Long -- Position x (le centre de l'image)
'**** ByVal vnY As Long -- Position y (le centre de l'image)
'**** Optional ByVal vnWidth -- Largeur facultative
'**** Optional ByVal vnHeight -- Hauteur facultative
'**** Optional ByVal vnTransparency As Single = 1 -- Transparence Facultatif entre 0 et 1 : pourcentage de transparence
'**** Optional vnAngle As Single = 0 -- Angle de rotation Facultatif en degrés
Public Sub DrawImage(ByRef voImage As BitMap, ByVal vnTargetDC As Long, ByVal vnX As Long, ByVal vnY As Long, Optional ByVal vnWidth, Optional ByVal vnHeight, Optional ByVal vnTransparency As Single 1, Optional vnAngle As Single 0)
Dim hTargetGraphics As Long
Dim hImageAttr As Long
Dim lpColorMatrix As GpColorMatrix
Dim lpOrg As GpPointF
Dim PortionImageX As Long
Dim PortionImageY As Long
Dim LargeurFinale As Long
Dim HauteurFinale As Long

'# On crée un objet de type Graphic, issu de notre hDc
If GdipCreateFromHDC(vnTargetDC, hTargetGraphics) = Gp_Ok Then
'# On crée des attributs d'image.
'# C'est uniquement nécessaire ici pour dessiner l'image en semi transparence
GdipCreateImageAttributes hImageAttr

With lpColorMatrix
.m(0, 0) = 1
.m(1, 1) = 1
.m(2, 2) = 1
.m(3, 3) = vnTransparency
.m(4, 4) = 1
End With

'# On renseigne nos attributs (hImageAttr)
GdipSetImageAttributesColorMatrix hImageAttr, ColorAdjustTypeBitmap, True, lpColorMatrix, lpColorMatrix, ColorMatrixFlagsSkipGrays

'# Si on ne passe pas de dimension (largeur ou hauteur),
'# On n'effectue pas de redimensionnement : on garde les dimensions de l'image
If IsMissing(vnWidth) Then
vnWidth = voImage.Width
End If
If IsMissing(vnHeight) Then
vnHeight = voImage.Height
End If

PortionImageX = voImage.Width
PortionImageY = voImage.Height

LargeurFinale = (vnHeight * PortionImageX) / PortionImageY
HauteurFinale = vnWidth
If LargeurFinale > vnHeight Then
LargeurFinale = vnHeight
HauteurFinale = (vnWidth * PortionImageY) / PortionImageX
End If


lpOrg.X = vnX
lpOrg.Y = vnY

'# On traduit les coordonnées en coordonnées du monde : orientée à vnAngle degrés
If vnAngle <> 0# Then
GdipRotateWorldTransform hTargetGraphics, vnAngle, MatrixOrderPrepend
GdipTransformPoints hTargetGraphics, CoordinateSpaceWorld, CoordinateSpaceDevice, lpOrg, 1
End If

'# On dessine enfin notre image.
'# On aurait pu utiliser GdipDrawImage, ou GdipDrawImageRect, mais elles ne permettent
'# pas de prendre en compte les attributs (ici la transparence)
GdipDrawImageRectRectI hTargetGraphics, voImage.Handle, lpOrg.X + LargeurFinale * -0.5, lpOrg.Y + HauteurFinale * -0.5, LargeurFinale, HauteurFinale, 0, 0, PortionImageX, PortionImageY, UnitPixel, hImageAttr

'# On détruit nos attributs d'image
GdipDisposeImageAttributes hImageAttr

'# On détruit notre objet Graphic
GdipDeleteGraphics hTargetGraphics
End If
End Sub
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
20 juil. 2011 à 17:40
Pour l'ajustement au rectangle de destination j'ai un rien modifié le code. J'ai rajouté la capture de la taille de l'image :
Dim PortionImageX As Long
Dim PortionImageY As Long
.
.
.
PortionImageX = voImage.Width
PortionImageY = voImage.Height

Et j'ai modifié l'appel de la fonction GDI+ :
GdipDrawImageRectRectI hTargetGraphics, voImage.Handle, lpOrg.X, lpOrg.Y, vnWidth, vnHeight, 0, 0, PortionImageX, PortionImageY, UnitPoint, hImageAttr


Maintenant ceci marche.
J'ai toujours les problèmes d'effacement et de conversion de coordonnées.
cs_VinceVG Messages postés 221 Date d'inscription mercredi 8 septembre 2004 Statut Membre Dernière intervention 30 mars 2016
20 juil. 2011 à 15:32
Merci pour ce code que j'arrive à utiliser dans word 2010 en vba.

Par contre je n'arrive pas :
- à effacer un image,
- à lui changer sa taille (mise à l'échelle).

Je n'ai pas non plus trouvé comment convertir les coordonnées d'un élément de ma fenêtre (form 2.0) vers la position de l'image. C'est moins crucial je peux quand même coder directement la position pour les 2 ou 3 images que j'aurais à mettre.
fondrose Messages postés 1 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 17 juillet 2011
17 juil. 2011 à 15:31
Bonjour
je prends la file de cette longue liste de post pour dire mon admiration sur ce code...
Je cherche à l'utiliser pour importer des images TIFF dans VB6 (ne comprenant pas pourquoi il y a aussi peu de codes / routines permettant de faire cette importation qui semble pourtant naturelle vu le succès du format TIF...).
Bref, j'ai quand même un souci (vu mon inexpérience 'informatique' de VB6 alors que je programme beaucoup pour faire du calcul) : le code marche quand je le lance depuis VB6, mais quand je crée un EXE ça n'affiche aucune image ?... J'imagine que le "lien" vers GDI+ n'est pas créé dans l'exe (faut-il déclarer un composant, une référence ?..). Une idée quelqu'un(e) ? Merci d'avance
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
8 avril 2011 à 14:56
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 avril 2011 à 11:13
je dirai...
création d'une fenetre translucide superposée...
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
8 avril 2011 à 10:35
En m'aidant de cette source, je me demande si il serai possible de recouvrir un Form et tout ses contrôles d'un voile blanc transparent. Comme c'est dis plus haut le contrôle Picturebox n'est pas transparent et visiblement il n'y a pas moyen de remplir le contrôle Image de cette façon.
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
28 févr. 2011 à 16:37
Heu... autant pour moi, je dois avoir les yeux qui louchent...
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
28 févr. 2011 à 16:35
Il me semble que dans ton code tu n'utilise pas de GdipDisposeImageAttributes ... pas bien ;)
Private Declare Function GdipDisposeImageAttributes Lib "gdiplus" (ByVal imageattr As Long) As Long
cordialement,
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 févr. 2011 à 21:25
je jeton GDI+ est a decharger a la fin...
j'ai un super code, pour ca, ideal pour l'IDE.

on peux meme presser STOP dans l'IDE, 0 plantage ^^

ca tourne avec de l'injection ASM, creation de fenetre, FindWindow etc
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
19 févr. 2011 à 16:06
Merci pour ton aide renfield.
J'avais aussi une erreur de plantage venant de l'ordre de déchargement de mes classes
j'ai une classe gdi_environement qui gère le startup & shutdown
une classe gdi_graphic qui gère un graphic
et je déchargeais l'environement avant le graphic --> plantage sévère

un bon week-end à toi et à bientôt
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 févr. 2011 à 22:59
j'ai restructure le code, ca devrait t'aider
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
18 févr. 2011 à 19:55
j'ai trouvé la méthode suivante pour traiter directement en objet : il faut utiliser un iunknown et non pas un long, du coup on peut décharger avec un "Set pH = nothing"

problème maintenant, je n'arrive plus à utiliser la fonction pour charger l'image depuis le stream ;(

je déclare les fonctions comme ceci
Private Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ByRef ppstm As IUnknown)
Private Declare Function LoadImageFromStream Lib "GdiPlus.dll" Alias "GdipLoadImageFromStream" (ByRef mStream As IUnknown, ByRef mImage As Long) As GpStatus

puis j'utilise :
Call CreateStreamOnHGlobal(VarPtr(pContent(0)), False, pH) <<< FONCTIONNE
Dim i As Long, res As GpStatus
res = LoadImageFromStream(pH, i) <<< PLANTAGE

une idée ?
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
18 févr. 2011 à 19:03
je suis au regret de dire que la méthode ci dessus fait planter violemment (debugur asm se met en route)

en revenche, j'ai trouvé une syntaxe passant par l'utilisation d'un iUnKnown et non d'un long
du coup on peut le décharger avec un "Set pHandle = Nothing"

mon problème avec le iUnknown, c'est que ma fonction LoadImageFromStream requiert un long
et que de mettre Varptr(pHandle) fait aussi sortir le debugueur asm de sa boite ^^

cordialement,
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 févr. 2011 à 11:58
oui, c'est bien cela...
un simple Release de ton objet suffit.
ici, ton Long est un pointeur (comme ObjPtr) vers ton IStream.

dans ton Terminate de ta classe, tu pourrais faire le Release de ton Stream.

possible en gros de faire :

Dim obj as Object
CopyMemory byval VarPtr(obj), byval HANDLE, 4
suivi de :
Set obj = Nothing

pour qu'il libère ton Handle (Release)
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
18 févr. 2011 à 09:03
pour ma part, j'ai implémenté une classe gdi_stream qui permet de charger l'image à partir d'un fichier puis de stoquer dans un tableau de bytes (interface avec un propertybag également)
alors j'aimerais bien libérer dans le classe_terminate le stream.

pour le "Release IUnknown du Stream", pour ma part, le stream c'est un "Long" ???

et en passant connais-tu éxactement l'api à utiliser pour le release ? msdn donne juste un "IUnknown::Release" ;(

cordialement,
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 févr. 2011 à 20:35
dans l'absolu, tu n'as pas tord.
faudrais faire un Release de l'IUnknown du Stream.

a ne faire bien sur qu'une fois l'objet utilise...
du coup, ca compliquait l'exemple, ici.

c'est aussi pour ca que j'utilise un tableau global pour le fichier
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
17 févr. 2011 à 17:52
un petit peu en retard mais merci pour ta maj renfield.
une question me taraude : "peut ont détruire/libérer volontairement le stream" ?
dans tous les codes que je regarde avec CreateStreamOnHGlobal personne ne libère avec une instruction Destroystream ou DisposeStream...

est-ce normal ? ou fuite mémoire en perspective ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 févr. 2011 à 11:01
Je t'ai ajouté un exemple d'image stockée dans un .res

j'ai remanié un peu le code, également
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
8 févr. 2011 à 08:17
Bonjour renfield,
merci de ta réponse (tjs aussi réactif ^^)

j'essaye de regarder du côté du Stream qui me semble la meilleur solution (les res me semblent plus lourdes à maintenir dans un projet.)

J'ai essayé d'utiliser l'interface IStream (en réimplémentant une classe perso MyStream implements IStream bien sur) mais lorsque j'utilise l'instruction gdipSaveImageToStream et bien ca plante sévèrement avec le débuger asm qui se met en route ;)

saurais tu ce qu'il faut faire éxactement avec l'interface IStream ? Si tu as un exemple dans un coin de google (parsque en me couchant à 2h du mat1 je reste à patauger)

cordialement,
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 févr. 2011 à 17:17
le plus simple serai un fichier .RES
apres on doit pouvoir s'en sortir avec un stream (CreateStreamONHGlobal)
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
7 févr. 2011 à 15:51
Bonjour Renfield.

Connaitrais-tu un moyen de faire la même chose mais avec le fichier .png stoqué dans le programme et non en fichier de dépendance ?

Admettons que je souhaite faire un controle utilisateur dont le rôle est d'afficher une jolie image avec gestion de la transparence (alpha chanel ?) comme tu le fais si bien dans ta source.
Je voudrait que ton fichier extra-terrestre soit d'une manière ou d'une autre stoqué dans le property bag pour ne pas l'avoir en dépendace de l'exe

une idée ?
cordialement,
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
3 juil. 2010 à 21:13
bien vu, le fichier sauvegardé avec savepicture est vide, alors que le picturebox contient mon image en png du moins à l'ecran
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2010 à 19:39
sur, avec bmp et autre, un LoadPicture te suffit.

dans le cadre d'un dessin, faut ruser...

tentes un

SavePicture en exploitant l'image.
te permettra de voir si ton Image est vide ou non
si tel est le cas, tout est question d'autoredraw :

en gros:
AutoRedraw = False
Dessiner PNGAutoRedraw True> propriete Image exploitable
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
3 juil. 2010 à 19:26
PRECISION:si les picturebox contiennent des bmp,jpg,gif,wmf cela marche impec
c'est vraiment avec un png que cela coince.
Je veux inserer un png car la qualité graphique est bien meilleure, et de plus lors d'un
redimensionnement la qualité reste parfaite.
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
3 juil. 2010 à 18:59
Tu as raison, avec la propiete image plus de plantage, je passe dans la bonne boucle comme dans ton code.
Mais mon richtextbox reste vide, autoredraw ou pas rien ne se passe.
En tout cas vraiment merci pour la justesse et la rapidité de tes reponses
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2010 à 17:33
je pense que

Picture1(Index).Picture

est Nothing
me trompe-je ?

si tu dessine dans un picturebox, prendre la propriete Image...

et jouer si besoin avec l'autoredraw
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
3 juil. 2010 à 15:17
Etant un débutant, dans un premier temps je charge plusieurs picturebox avec des png à l'aide de gdi+
Puis ensuite j'adapte ton code pour inserer mon png dans la rtb à partir d'un picturebox.
Mais vb6 se plante carrement sur l'instruction encadrée par les tirets sur la procedure suivante

Private Sub Picture1_Click(Index As Integer)
Static tObject As REOBJECT
Dim oData As IDataObject
Dim oClientSite As IOleClientSite
Dim oStorage As IStorage
Dim IID_IUnknown As UUID
Dim oStatic As IUnknown
Set oClientSite = moRichEdit.GetClientSite
Set oData = ModIDataObject.Create(Picture1(Index).Picture)
Set oStorage = StgCreateDocfile(vbNullString, STGM_CREATE Or STGM_READWRITE Or STGM_DELETEONRELEASE Or STGM_SHARE_EXCLUSIVE)
CLSIDFromString "{00000000-0000-0000-C000-000000000046}", IID_IUnknown
Stop
On Local Error Resume Next
OleCreateStaticFromData oData, IID_IUnknown, OLERENDER_DRAW, ByVal 0&, oClientSite, oStorage, oStatic

If Not Nothing Is oStatic Then
OleSetContainedObject oStatic

With tObject
.cbStruct = LenB(tObject)
.cp = Len(RichTextBox1.Text)
Set .pStg = oStorage
Set .poleobj = oStatic
Set .polesite = oClientSite
.DVASPECT = DVASPECT_CONTENT
.dwFlags = REO_BELOWBASELINE Or REO_STATIC
End With

moRichEdit.InsertObject tObject
Else

tObject.cp = Len(RichTextBox1.Text)
------------------------------------------------
moRichEdit.InsertObject tObject
------------------------------------------------
End If

Set oStorage = Nothing
Set oClientSite = Nothing
Set oStatic = Nothing

End Sub
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 juil. 2010 à 00:23
je vois pas le souci
a partir du moment ou l'image a ete affichee dans ton picturebox, ce n'est plus qu'une image...

idem, donc, pour pour le RTB.

suffit peut etre de jouer avec l'AutoRedraw...
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
2 juil. 2010 à 22:31
Merci
C'est super au niveau de l'affichage de l'heure, mais sauf incomprehension de ma part
je ne vois pas comment faire une insertion de png vu que les 2 picturebox utilisees n"acceptent le png.
J'ai dejà reussi à charger des picturebox avec des png en utilisant gdi+, mais pour un rtb je sèche.
Merci quand même
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 juil. 2010 à 20:55
ptard Messages postés 27 Date d'inscription dimanche 5 novembre 2006 Statut Membre Dernière intervention 30 septembre 2011
2 juil. 2010 à 19:39
Bonjour,

Cela marche vraiment tres bien, j'aimerais faire la même chose en inserant le png dans une
richtextbox

Merci pour une idée.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 mars 2010 à 07:31
pas en Object....
en Variant ^^

oui, tu peu la reprendre d'un picturebox vers GDI+, pas de soucis.

GDI32 / GDI+ ?

GDI+ fait appel a GDI32, mais offre plus de finesse.

outre la possibilité du second a charge tout type de fichiers, GDI+ permet de faire de l'antialiasing, de la translucidité, etc.

GDI (GDI32.Dll) lui ne sais que dessiner des traits, points, rectangles... c'est moins évolué...
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
4 mars 2010 à 23:32
j'ai fais une recherche sur extra*.png... pour retrouver ton extra terestre sur mon disque dur... j'ai donc retrouvé la source avec mes notes :)

Public Sub DrawImage(ByRef vsFilePath As String, ByVal vnTargetDC As Long, ByVal vnX As Long, ByVal vnY As Long, Optional ByVal vnWidth, Optional ByVal vnHeight, Optional ByVal vnTransparency As Single 1, Optional vnAngle As Single 0)


vnWidth, et vnHeight sont déclarer en Object (par default dans Vb6)

et j'ai perdu mon fichier de NOTES, je sais plus ou je l'ai mis... faut dire que c'Est tellement desordre ses temps ci sur mon pc, j'essaie de fair ele menage et de reformater... mais j'en remets toujours plus dedans que j'en enleve...

Domage parce que dans mon fichier de note, il y avait 2-3 commentaires...

Si je me souviens tu avais aussi oublié un refresh a un endroit...

je rephrase ma question,... par ta reponse, j'ai vu que tu n'a pas compris ce que je voulais dire...
j'ai 1 fichier... IMAGE... que je ne VEUX PAS distribuer. donc, PAS DANS LE PACKAGE.
l'idee c'Est de le mettre dans une pic box avant de compiler.
Puis-je la manipuler avec GDI+ ?
et c'est quoi la diff entre GDI et GDI+ ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 mars 2010 à 19:09
Pas vu où tu as trouvé ce Long, typé en Object

gaffe, ici, c'est GDI+ pas GDI (c'est important)

Pour la position, disons que c'est juste un mini exemple.
on pourrais peaufiner, ajouter quelques autres exemples

et bien coder => n'instancier GDI+ qu'une fois, verrouiller la chose pour s'assurer de son déchargement...

Pour l'image chargée, su peux la conserver en mémoire... si tu as besoin de l'afficher, tu peux, oui, passer par un PictureBox, mais GDI+ peux le faire...

sinon, oui, possible de passer d'un hBmp à un Bitmap de GDI+

a suivre, donc
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
3 mars 2010 à 05:48
le code m'a fait rire a certains endroit... j'ai pris des notes pour t'en reparler... (il est toutefois extraordinaire)

et il y a aussi une declaration incorrecte dans une procedure (l'utilisation d'un entier long declarer comme OBJET! meuh oui... c'est une boulette ca...
Evidemment, avec Vb, le code fonctionne quand meme car on peut mettre un Long dans un objet... mais c'est juste beaucoup plus lent a instancié.

Le seul hic c'est que je ne me souviens plus ou j'ai mis le projet sur mon HD et donc je ne retrouve plus mes notes...
meuh oui... c'est une boulette de ma part ça.

je peut te dire que c'est dans le passage des paramêtre de la function...

autre petite note... au lieu que la fonction place l'image au CENTRE de la position exprimé, il aurait mieux value que tu laisse 0,0 (top, left) et passé l'information par parametre a la function pour centrer ton extra terrester.
Ainsi les gens qui ne connaissent que peu Vb aurait put réutiliser ton module. Même moi j'ai pas compris sur le coup pourquoi mes images était pas ou je les voulais...

j'ai une petite question... supposons que l'on a une image en memoire, dans un picture box par exemple. Puis-Je utiliser GDI ? ou je dois la larguer au disque pour la relire ? semble pas tres profitable en gain vitesse cette méthode. Gdi doit surement pouvoir lire une image existante en memoire...
Genre, je crée une app, je place mes images dans des picture box et je compile. je veut que Gdi fonctionne a partir de mes images dans le .exe (dans mes picture box)
merci.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 mars 2010 à 07:03
Merci pour ces fleurs.

Comme je l'ai dit, c'est un exemple.

ca permet d'utiliser du PNG

maintenant, on y allume/eteint GDI+ a chaque fois, les objets ne sont pas maintenus en mémoire, etc.

du coup, c'est relativement lent...

c'est donc un exemple pour se familiariser, a revoir pour un code 'de prod'
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
1 mars 2010 à 03:59
Renfield: Je te regarde aller depuis un bout deja sur VbFrance et vraiment impecable le travail que tu nous donnes. MERCI mille fois.

Je suis niveaux expert aussi en Vb et vraiment j'aprécie beaucoup tes sources quand je cherche un truc que je n'ai jamais fais. Je viens juste de tomber sur celle ci et comme je j'ai jamais utiliser GDI (j'utilisais un viel object de Kodack avant mais il ne le supporte plus)

Excellente Demo, je vais la decortiquer ligne par ligne.
Merci encore.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 déc. 2009 à 11:02
c'est juste un aperçu de ce que l'on peut faire.

Ca ne montre pas forcément la bonne façon de faire de manière optimale.

J'entends par là que GDI+ est ici allumé (puis éteint) chaque fois que l'on souhaite afficher l'Alien.

Dans un code bien fait, on placerai l'allumage de GDI+ et son extinction au démarrage et a la fermeture du logiciel.
SnkVrt Messages postés 89 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 23 février 2010
28 déc. 2009 à 10:55
Je viens seulement de tomber sur cette source et je vais faire mes premiers pas avec GDI+ grâce à elle.

Très bonne base pour apprendre...
Bravo et merci.
Utilisateur anonyme
18 mars 2009 à 14:07
Ah ! Je savais pas ça, Merci :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 mars 2009 à 12:16
ca permet de specifier les parametres optionnels.

Add 1, Text:="Texte bateau"
evite ce genre de notations :
Add 1,,,,,"Texte bateau"
Utilisateur anonyme
18 mars 2009 à 12:10
J'ai pas compris ça: vnTransparency:=nTransparency, vnAngle:=nAngle
:=nTransparency // :=nAngle, Hein ? Ça veux dire quoi ? J'ai jamais vu ça sur Vb Moi :s
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 nov. 2008 à 21:09
les controles images sont des controles WindowLess
en gros, on dessine sur le conteneur, et non dans une fenetre spécifique...

a toi de voir, mais vaudrais surement mieux faire de même, et dessiner sur la Form
K_Os Messages postés 3 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 19 novembre 2008
19 nov. 2008 à 11:32
Merci bcp pour cette source.

Mais, je m'excuse par avance de mon ignorance, comment faire pour placer l'image *.PNG dans un objet image (qui contrairement aux objets Pictures) autorise la transparence ?

En effet, j'ai bien utilisé le : set Image1.picture = Form1.image,
voir même un : set Image1.picture = Picture1.image, mais je reproduis l'image transparente avec le fond présent au moment. Du coup, je n'ai plus de transparence.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 nov. 2008 à 07:56
sans hdc... (windowless)
ou sans propriété hdc ?

si tu as un hWnd, tu peut demander un hDc (via GetDC. a liberer via ReleaseDc)
tilp Messages postés 10 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 16 novembre 2008
16 nov. 2008 à 20:34
Renfield,

Pas de soucis effectivement pour l'ouvrir avec Winrar. Par contre fichiers corrompus avec Winzip, les mystères de l'informatique !
Super code en effet qui marche très bien !
La même question que Bouv avec des controles qui ne possèdent pas de propriété hdc ! J'ai essayé mais sans résultat pour l'instant ! Si tu as un exemple de code pour dessiner dans un controle sans hdc, je suis preneur ! Merci.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 nov. 2008 à 14:19
... je viens de tester (avec Winrar) et no soucy ...
tilp Messages postés 10 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 16 novembre 2008
16 nov. 2008 à 10:08
Bonjour Renfield.

J'ai essayé de télécharger ta source mais au moment de la dézippé, elle m'indique qu'il y a une touche incorrecte et je ne peux ouvrir ton projet. Les fichiers source sont ils toujours actualisés ? Merci de ta réponse.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 nov. 2007 à 07:11
par un tableau de Byte ?

tu peux passer par un objet Stream (createStreamOnHGlobal & co)
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
14 nov. 2007 à 00:22
Salut renfield,

il manque un "GdipDisposeImage hBitmap" dans GetPicture ce qui a pour conséquence de maintenir le fichier ouvert.
Je m'en suis appercu dans un projet ou je mets les images en ressources puis je les extrait sur le hdd et je les charge avec gdi et je les supprimes, sauf que forcement ca se supprimait pas...

A ce propos, tu ne sais pas comment je pourrais faire pour charger l'image depuis un Byte() sans passer par le hdd ? (toujours avec gdi biensure)
psycho69 Messages postés 21 Date d'inscription mardi 10 décembre 2002 Statut Membre Dernière intervention 30 octobre 2007
30 oct. 2007 à 10:51
Merci sa venai bien de l'AutoRedraw de la picturebox :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 oct. 2007 à 07:28
joue avec ton Picture1.AutoRedraw
ou dessine dans le Picture1_Paint
psycho69 Messages postés 21 Date d'inscription mardi 10 décembre 2002 Statut Membre Dernière intervention 30 octobre 2007
29 oct. 2007 à 22:50
impec sauf petit probleme quand je place l'image dans une picturebox, la picturebox redevien blanche des que l'aplication passe en arriere plan ou que je passe une fenetre par dessus
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
3 oct. 2007 à 17:31
Excellent !
anackan Messages postés 4 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 7 mars 2007
7 mars 2007 à 19:06
Merci pour la réponse,

Ca marche c cool,
;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 mars 2007 à 20:33
Form1.cls
anackan Messages postés 4 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 7 mars 2007
5 mars 2007 à 09:29
Bonjour, je cherche a enlever les images qui ont été mis sur la form par. Autrement dit a faire un clear de la form. Comment puis je le faire sans pour autant unloader la form.
Merci.
guihome2006 Messages postés 1 Date d'inscription jeudi 29 juin 2006 Statut Membre Dernière intervention 31 janvier 2007
31 janv. 2007 à 16:39
Cette source est reellement incroyable. Cependant mon niveau en vb ne me permet pas de realiser ce que je souhaite.
Sur une Form avec transparence mettre une image png (par exemple un rond avec effet ombre) et avoir au lancement mon image png en tant que fond avec possibilite "de la bouger" et avec la transparence du png (ce qui permet d'avoir toujours l'impression d'ombre "propre" quelque soit le fond.
Ma premiere question est : est ce comprehensible ce que je viens de demander ?
seconde question : est ce possible ?
troisieme question : si c'est possible, puis je avoir quelques pistes de recherche ?
merci et encore bravo
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
23 janv. 2007 à 11:56
Merci RenField pour la rapidité de ta réponse !
Effectivement c'était bien le ScaleMode + AutoRedraw de la Form, je n'ai pas fait assez attention.
J'ai également trouvé pour la picturebox !

DrawImage App.Path & "\Extra-terrestre.png", Picture1.hdc, Picture1.width / 2 + 0, Picture1.height / 2, vnTransparency:=1, vnAngle:=0

Merci encore !
Drôlement puissant...
Cordialement
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 janv. 2007 à 23:52
Je pense que la propriété AutoRedraw de ta Form est en cause...
Son ScaleMode également...

pour l'affichage d'un PNG dans une pictureBox, regarde la fonction DrawImage...
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
22 janv. 2007 à 21:25
Salut,

Je souhaite me servir de ta source qui est drôlement intéressante mais rien ne se passe quand je le fais dans un nouveau projet ! J'ai inséré le module et les 2 lignes de codes dans le MouseDown mais rien n'y fait. Y'a besoin de quelquechose de spécial? genre OCX, dll, réf ou autres ??
Et comment insérer un PNG dans une PictureBox? Un petit exemple ?? ...

Merci par avance pour les réponses !
Cordialement
Phil
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
7 nov. 2006 à 19:19
erf j'ai reessayer ca n'allait toujours pas puis j'ai essayer dans une VM et la ca marche.
le probleme vient donc de chez moi :(
Sorry d'avoir pris de ton temps pour rien et merci d'avoir repondu

++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 nov. 2006 à 18:14
j'ai testé, mis ca après mon Me.Refresh,
dans le Form_MouseDown du projet de test
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
7 nov. 2006 à 18:05
Salut Renfield,

Merci mais c'est bien ce que je faisais mais ca ne marche pas...

Enfin j'ai po essayer depuis une form mais depuis une pictbox mais ca ne devrait rien changer si ?

En fait je charge l'image dans la pictbox et elle s'affiche nikel, mais quand je fais un SavePicture ce ne me save que le font de la pictbox :(
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 nov. 2006 à 07:40
tu peux faire :

Set Picture1.Picture = Me.Image

ou

SavePicture Me.Image, "C:\a.bmp"

pour enregistrer dans un fichier
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
6 nov. 2006 à 22:11
Salut a tous

Exellent exemple en effet ^^

mais au rique de passer pour le boulet de service, je ne parviens pas a enregistrer l'image apres l'avoir mise sur une PictureBox ni meme la copier dans un autre control...
J'avoue ne pas avoir trop regarde le code sorry...

++
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
24 oct. 2006 à 15:28
Difficile de faire plus simple.
Merci
++
B0mbJacK Messages postés 141 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 25 octobre 2006 1
22 oct. 2006 à 05:26
Lu,
pour répondre à la question de bouv
pour obtenir le Hdc d'un objet,utilise cette api

Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
12 oct. 2006 à 07:38
Excellent Rey, on voit que tu manipules de mieux en mieux le GDI+.

J'analiserai ton code car ça me donne une idée (encore un mystère...) pour qque chose qui me tenait à coeur mais dont je ne savais pas comment procéder, à cause des labels (de forme rectangulaire)

@++ et bonne continuation ;)
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
10 oct. 2006 à 15:12
super Renfield, je me demande bien comment j'aurais pu le trouver tout seul.
C'est tellement interessant qu'il faut bien que je suive le lien ci-dessus que tu proposes comme doc sur le sujet.
Je pense que j'essayerai par moi-même une mosaïque avec une image sur picturebox ou imagelist. En effet si toutes les images sont externes à l'exe le final user pourra à sa guise modifier l'interface.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
10 oct. 2006 à 14:30
MisterN, je pense que l'on doit pouvoir transformer les coordonnées, mais je sais pas en détail comment...

Asimengo, je viens d'ajouter une mosaïque

Filou26, faut voir le code, j'ai pas de réponse générique...
filou26 Messages postés 37 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 16 juin 2008
7 oct. 2006 à 20:33
bravo et merci
j'attendais un truc de ce genre depuis longtemps
j'ai le niveau débutant mais je vois très bien le parti
qu'on peut tirer de la gdi+ : énorme
par contre j'ai essayé de charger une grosse image .tiff
genre plan 12000/8000 en noir blanc l'image monte impec ,même dans une picture box !! INCROYABLE
le souci ,-parcequ'on est jamais content de ce qu'on a
même si on croyait pas ça possible y ' a 10 minutes-,c'est
que sur des images si grandes ,c'est lent
y'aurait il un moyen d'optimiser ce code pour le rendre plus rapide?en fait j'essaye de faire un zoom en dessinant l'image
aprés avoir redimensionné la largeur et hauteur mais ça va pas vite
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
6 oct. 2006 à 12:03
Renfield>
Lorsque l'image est en rotation par ex. à 45°, les angles disparaissent.
Est-il possible de réduire l'image toujours à 45° pour qu'elle puisse s'inscrire dans son conteneur, et comment procéder?
Merci d'avance.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
5 oct. 2006 à 20:18
J'ai vu la source de SamirAloui http://www.vbfrance.com/codes/IMAGE-MOSAIQUE_39142.aspx, c'est déjà bien mais je dirais méthode manuelle, je suppose qu'il existe une API pour le faire.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
5 oct. 2006 à 20:02
@Renfield: une solution possible est de faire un brush avec ton image, de définir comment cela se passe pour en faire une mosaïque (WrapMode) et go...

Alors là, si c'est clair je ne pige anything. Si c'est pas trop demandé d'avoir un exemple (mosaique sur clic droit par exemple).
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
5 oct. 2006 à 14:44
Renfield>
Action...réaction...
Un mot,
MERCI !!!
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 oct. 2006 à 14:21
Pfff excellent, mortel, vraiment génial !!!!

Je garde ce code sous la main ça risque de bouleverser pas mal de choses dans mes prog ^^

Merci !
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 oct. 2006 à 13:51
Pour ceux qui cherchent la Doc sur ces APIs:

http://windowssdk.msdn.microsoft.com/en-us/library/ms533969.aspx
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 oct. 2006 à 13:50
Mis a jour MisterN, avec un nouveau parametre permettant la rotation de l'image
(rotation du monde, ici)
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
5 oct. 2006 à 12:45
Renfield>
Utile et précis, comme d'hab...
Pour la rotation à 45°, est-ce que tu peux faire un exemple, si c'est possible et rapide via GDI+.
Merci d'avance.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 oct. 2006 à 12:41
une image en mosaïque ?
oui, bien sur....

une solution possible est de faire un brush avec ton image, de définir comment cela se passe pour en faire une mosaïque (WrapMode) et go...
cavo789 Messages postés 168 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 28 juillet 2009 1
5 oct. 2006 à 12:27
Sympa ! Merci
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
5 oct. 2006 à 11:26
une image en mosaïque est-elle possible dans un form dans VB?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 oct. 2006 à 09:17
à noter que GDI+ (par default sur Xp, au moins SP2) peut s'installer même sous Win95...

et que ce que j'ai montré ici n'est qu'une infime partie de ce que peux offrir GDI+
- anticrenelage
- transparence
- rotations, étirements...
- lecture/ecriture d'images dans divers formats
- animation de Gifs
- canal alpha (dessiner avec translucidité)
- degradés faciles
- etc...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 oct. 2006 à 09:14
le hDC nous permet de dessiner direct sur une surface ...
la plupart des contrôles en ont.

si tu n'en a pas a ta disposition, tu as peut être une propriété Picture...

et une conversion est nécessaire, alors
philippe laschweng 1 Messages postés 278 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 13 avril 2013 2
5 oct. 2006 à 09:11
Salut,

Effectivement ta méthode est drôlement intéressante mais difficlement compréhensible pour un débutant comme moi... J'aime comprendre ce que j'utilise comme fonction mais là je séche !!!
L'utilisation de la fonction est bien entendu très simple mais le code...
Je n'est pas mis 10 car je ne suis pas arrivé à insérer l'image PNG dans la propriété Picture d'un CommandButton. C'est certainement possible et c'est certainement moi qui n'a pas la bonne ligne de code... Eclaire moi !

Ta source va surement aider pas mal de monde !

Salut
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
5 oct. 2006 à 09:09
Oui, J'aime bien.
Mais comment fait on quand le controle ne possède pas de propriété hDC ?
Rejoignez-nous