Enregistrement dans un fichier d'un logigramme dessiné dans une picturebox [Résolu]

Signaler
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008
-
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008
-
Slt à tous,

C'est la première fois que je poste sur un forum, je vais essayer d'être le plus clair possible

J'ai besoin de développer une petite application qui permette à l'utilisateur de "dessiner" un logigramme (une sorte de diagramme avec des questions et des réponses "oui/non", afin de guider l'utilisateur vers la réponse à un problème).
J'avais donc pensé à créer une picturebox puis ensuite l'utilisateur y ajoutait dynamiquement des labels, des flêches, des rectangles...

Pour créer ces éléments, il clique sur un bouton, l'élément apparaît puis il le place où il le désire. De ce côté là, pas de problème.

Seulement, je voulais également enregistrer le logigramme (sous forme d'image par exemple) car il doit être consultable par d'autres personnes. Et lorsque j'essaie d'enregistrer la picturebox avec Call SavePicture(Picture2.Picture, App.Path & "/test.jpg"), il me sauvegarde:

- la ligne que j'ai faite avec Picture2.Line (1000, 1000)-(5000, 5000)
- le texte que j'ai écrit avec Picture2.Print "salut"

mais il ne me sauvegarde pas:

- le label que j'ai créé avec  Load Label1(1)
                                                Set Label1(1).Container = Picture2
                                                Label1(1).Caption = "test"
                                                Label1(1).Visible = True

C'est assez problématique car le texte peut être lié à un évènement (comme l'ouverture d'un document Word), ce que je ne peut faire avec Picture2.Print. Et je suppose que ce sera la même chose pour l'ajout d'un rectangle ou d'un losange

La seule méthode que j'ai trouvée, c'est de tout stocké dans Access (coordonnées, taille, texte, couleur,...) quand j'enregistre et tout charger à l'ouverture du logigramme, mais c'est pas terrible et j'aurais aimé avoir un document fixe.

Avez-vous une solution à me proposer, je suis désespéré.

Merci beaucoup d'avance

7 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
ton logigramme doit etre sauvegardé de manière a pouvoir etre rechargé, modifié, dynamique, etc...

exclu, donc, de l'enregistrer en JPG.

base Access, Fichier contenant des Records, INI, XML, Excel, ....
peu importe, a toi de voir.

Par contre, pour que ton appli puisse être utile, il faut pouvoir exporter des images JPG ou autres (Attention, SavePicture génère des BMP, meme s'ils se nomment JPG^^)
Elle devrait également pouvoir imprimer...

et là, c'est dans un deuxième temps... même si tu joues dans un pictureBox (ce qui est une bonne chose), il te faudra, pour l'export, redessiner le tout...

possible en faisant une capture d'ecran... a voir (je parles de GetDCEx, BitBlt...)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Permet de faire une capture de Picture1 (et de ses enfants) et de placer l'image dans un second PictureBox
a toi d'arranger la chose, ensuite, pour en sortir ton image BMP

Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDCEx Lib "user32.dll" (ByVal hwnd As Long, ByVal hrgnclip As Long, ByVal fdwOptions As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Const DCX_EXCLUDERGN As Long = &H40&
Private Const DCX_WINDOW As Long = &H1&

Private Sub Form_Click()
Dim hSrcDc As Long
With Picture1
hSrcDc = GetDCEx(.hwnd, 0, DCX_EXCLUDERGN Or DCX_WINDOW)

BitBlt Picture2.hdc, _
0, 0, _
.ScaleX(.ScaleWidth, Me.ScaleMode, vbPixels), .ScaleY(.ScaleHeight, Me.ScaleMode, vbPixels), _
hSrcDc, _
0, 0, _
vbSrcCopy

ReleaseDC .hwnd, hSrcDc
End With
End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
on dessine via Apis...

faut mettre l'AutoRedraw de ton Picture2 à True...

et pour écrire :
SavePicture Picture2.Image, "c:\a.bmp"

Picture2 devra être au moins aussi grande que Picture1
Picture2 peut être invisible
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

Merci de m'avoir répondu. Je vais passer par Access.

En fait le JPG (ou BMP ^^) c'était juste pour que les utilisateurs visualisent le résultat final et garder tous les logigrammes dans un dossier.

Donc si j'ai bien compris, pour faire ça, je suis obligé de passer par une capture d'écran?
J'y avais déjà pensé et j'avais regarder les méthodes BitBlt et StretchBlt mais j'avais pas compris grand chose,lol!!

Est-ce que tu peux me dire (en trois mots) le rôle des méthodes GetDCEx,BitBlt et StretchBlt.
(Je suis au taf et je n'ai pas accès à internet, juste vbfrance.com)

Merci beaucoup
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

Je te remercie beaucoup


Grâce à toi je vais pouvoir avancer


a bientot
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

En fait j'ai parlé un petit peu trop vite:

j'ai copié ton code qui marche nickel
j'ai ajouté un label à picture1 et après j'essai de l'enregistrer sous forme d'image. Seulement, le label apparait bien dans picture2 mais pas dans l'image.

Je pensais que le code, que tu m'a donné faisait, une capture d'écran, donc logiquement le label devrait y être !!

Je ne comprends pas
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

En effet, cette fois-ci ça marche

je l'avais mis pour picture1 mais pas pour picture2 car avant je dessinais sur picture1. J'avais oublié de changer.


Merci infiniment pour ta patience
a+