Dessiner dans une PitcureBox

Signaler
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012
-
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012
-
Bonjour à tous,
J'ai une question sur mon application VB6.

Au jour d'aujourd'hui je bosse sur une application VB6 ou il y a une
fonction visuel pour voir une pièce en cours d'usinage.

Enfaîte on voit un brut "une pièce brut" puis un outil de coupe et en tant
réel la pièce se fait grignoter.



Tout se petit monde est représenté dans une PictureBox et à chaque déplacement je fais un clear puis je redessine la pièce, le brut, les traits d'axes etc... Vue que je fais cette manip des millions de fois je vous laisse imaginer comment l'appli ralenti.

Vous avez une autre solution sans faire un clear ? histoire de garder des choses fixes sans tout redessiner ?

Je ne peux pas utiliser direct X OpenGL ou autre car le pc ou l'appli tourne n'est pas assez puissant.

Merci de votre aide.

35 réponses

Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

La pas de soucis :


mais la :
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Vue comme ça vous allez me dire de passer le fond de l'image en bleu ciel
mais il faut savoir que pour usiner je passe par dessus le fond gris mais
pas sur toute l'image donc je ne peux pas me permettre d'avoir une coloration
de fond :(

J'ai cherché sur le net et j'ai l'impression que c'est un problème connu
mais je n'ai pas trouvé de solutions :(
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

J'ai oublié de dire que mon image est en .gif avec de la transparence
mais VB ne je gère pas, si j'arrive a trouver comment faire de la transparence je suis sauvé
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Je m'orienterais vers le GDI+ et le PNG

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

J'en ai entendu parler, mais je ne trouve pas d'infos pour VB6 :(
C'est facile a utiliser ??
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
oui, relativement simple.
puissant, en tous cas

voir :

http://www.vbfrance.com/codes/EXEMPLE-UTILISATION-GDI-DANS-VB6_39804.aspx


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Merci bien
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

C'est chaud de se retrouver dans un exemple, il n'y a aucuns tutoriels ?
Ou personnes peut me donner un bout de code juste pour la transparence ?

Merci.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tu n'a pas grand chose a faire...
regarde mieux l'exemple en question:

DrawImage

permet de dessiner une image (PNG) a l'endroit voulu, en appliquant un degré de translucidité et un angle de rotation, eventuellement...

tu as juste a ajouter le ModImage.bas a ton projet
ajouter un peu de code pour initialiser GDI+

Et c'est tout... DrawImage bosse même a partir d'un hDC, il créé lui même directement le Graphics, ca fait deja ca a faire en moijns....


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Ok, j'avais vue le cou de DrawImage mais c'est vrai que j'avais peur
de me mélanger les pinceaux... Merci pour l'explication je vais me plonger sur la question.
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Bon je viens de réussir comme tu m'as dis de faire (sur une appli basic)
juste une chose, quand je stop le run de l'appli j'ai vb qui plante...
Je pense que je coupe pas le GDI c'est ça ?

dans mon code j'ai :

Dim hGdipToken As Long

Public Sub Boot_Main()
'Dim hGdipToken As Long
Dim lpSI As GdiplusStartupInput
    '# On allume GDI+
    '# Si on n'active/désactive pas GDI+ comme il faut, quand il faut, vous allez faire crasher votre VB.
    lpSI.GdiplusVersion = 1
    GdiplusStartup hGdipToken, lpSI
    Form1.Show vbModal
   ' GdiplusShutdown hGdipToken
End Sub

Public Sub shutdown()
'Dim hGdipToken As Long
GdiplusShutdown hGdipToken
End Sub

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
c'est même un peu plus complexe

c'est ton appli VB6 (vb6.exe) qui démarre GDI+
il n'a a le faire qu'une fois, même entre deux lancements de ton appli a toi

du coup, et pour faire simple (j'ai bien une solution, avec une creation de fenetre démon, avec injection Assembleur pour qu'elle gère le jeton gdi+ etc...)

il vaut mieux, dans ton cas, tant que ton appli n'est pas compilée, allumer et eteindre GDI+ a chaque fois que tu appelles DrawImage (ou dans le code de DrawImage)



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Quand je vais compiler mon appli je ne vais pas avoir de plantage alors ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
non...

Comme je te l'ai dit, lorsque tu allumes GDI+, un jeton est lié à VB6.exe

quand tu fais STOP, ca coupe tout direct

pas d'appel à :
GdiplusShutdown hGdipToken

quand tu relances, tu tentes de créer a nouveau un token GDI+
et là, pouf, tu risques de tout faire s'écrouler (assez certain, meme)

une possibilité est de récupérer le hWnd de la fenetre principale VB6.exe et de stoker (SetProp) le token dans une property

au 'second' lancement, tu checkes cette Property (GetProp) et tu regardes s'il faut ou non démarrer GDI+

un peu brutal, mais efficace, et finallement assez propre
(penser au SetProp /0 ou RemoveProp quand tu coupe GDI+...)


Assures toi bien au final a avoir ton appel a
GdiplusShutdown hGdipToken

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
30
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
13 septembre 2012

Merci