babode
Messages postés6Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 mai 2009
-
24 sept. 2008 à 08:21
babode
Messages postés6Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 mai 2009
-
24 sept. 2008 à 22:46
Bonjour a tous,
Je vous expose mon probleme:
Je développe une application en VB6 avec Directdraw.
J'ai eu besoin a un moment dans cet appli d'écrire du texte vertical.
J'ai découvert le code de Renfield (merci) et son utilisation de CreateFontIndirect/ SelectObject/ GetObject
Permettant d'accéder aux propriétés longfont d'une police pour jouer sur son angle d'affichage.
Jusqu'ici tout va bien, voici ma methode:
-je fais un GetDC de ma surface DD
-je recupère la police de la form du projet avec SelectObject
-je récupére l'objet et ses propriété LogFont avec Getobject
-je modifie la propriété "lfEscapement"
-je réassocie ma font (mais cette fois-ci au DC de ma surface)
-j'écrie avec un TextOut.
-Puis je fais un ReleaseDC sur ma surface DD.
Le probleme est que de manière parfaitement aléatoire (au bout de quelques secondes d'éxécution du code),
Lorsque je repasse sur l'objet de ma surface DD, le programme plante avec un message "invalid procedure call or argument"... et je ne peux même plus débugger parceque toute l'interface graqhique de Windows est pourrie (ombres remanentes, caractères ascii a la place du texte, zone blanche, trous dans les fenetres...).
Je ne m'en sors qu'en redémarrant VB puis en reéxecutant mon code!
babode
Messages postés6Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 mai 2009 24 sept. 2008 à 22:46
Bon j'ai finalement résolu le probleme... et je pense que tu avais vu juste Renfield.
Il faut faire un DeleteObject sur tous les handles des objets créés avec CreatFontIndirect!
... et ça roule
babode
Messages postés6Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 mai 2009 24 sept. 2008 à 13:24
Bonjour,
Tout d'abord merci.
Je ne sais pas bien se qu'est une fuite mémoire mais lorsque je fais tourner mon appli avec le task manager, je ne vois pas la mémoire augmenter (elle stagne aux alentours de 4Mo).
Concernant mon code, j'ai réussi a isoler ces 3 lignes (que tu reconnaitras):
Sans elle pas de bug.
Je peux faire mon getDC / TextOut / ReleaseDC
Autant de fois que je veux par cycle (je flip mes surfaces a la fréquence d'affichage de l'écran) sans souci!
Je remarque aussi que, fréquemment avant que l'appli ne plante, tous les textes disparaissent comme si
la méthode .DrawText de Directdraw était HS.
Babode
PS: j'aimerais t'envoyer mon code mais je veux pas abuser de ton temps.
babode
Messages postés6Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention25 mai 2009 24 sept. 2008 à 14:38
J'ajoute qu'en récupérant les valeurs retournées par les fonctions incriminées, j'observe que le Handle renvoyé par le premier selectobject est toujours 0 (? c'est peut-etre normal) mais aussi et surtout que la fonction qui renvoie un code d'erreur c'est le getobject.
Il renvoie 0, et en se qui le concerne MSDN précise que cela signifie que la fonction a échouée.