Classe de dessin (api) plus rapide que vb

Soyez le premier à donner votre avis sur cette source.

Vue 11 300 fois - Téléchargée 852 fois

Description

Voici une classe que je suis en train de faire (elle n'est pas finie), mais je la met a disposition pour avoir vos avis et idées.

Cette classe permet de faire du dessin comme dans VB (lignes cercles points textes etc..) mais en utilisant les apis.

un autre avantage, c'est que le dessin ne se fait pas directement sur la zone cible (par exemple une form ou un picture), mais en mémoire, et il suffit d'appeler une fonction pour l'afficher sur la zone cible. Cette methode a pour gros avantage d'eviter les scintillement typique VB.

C'est encore une beta, il n'y a pour l'instant que les fonction pour tracer des lignes, rectangles et texte (pas d'alignement pour l'instant)

j'attend vos remarques :)

Source / Exemple :


'voici un exemple de code d'utilisation de la classe :

Dim Cl As New DrawClass

Private Sub Form_Load()
'creer l'image
    Cl.newImage Me.ScaleWidth / 2, Me.ScaleHeight / 2, Cl.GetSystemColor(vbButtonFace), 1
'modifi la police
    Cl.Font.Size = 20
    Cl.Font.Name = "Comic Sans ms"
End Sub

Private Sub Form_Paint()
    'affiche l'image sur la form
    Cl.PaintTo Me.hdc, 0, 0
    Cl.DrawWidth = 1
End Sub

Private Sub Form_Resize()
'redimensionne à la fenetre
    Cl.ResizeImage Me.ScaleWidth, Me.ScaleHeight

'dessine
    
    Cl.drawRect 0, 0, Me.ScaleWidth, Me.ScaleHeight / 2, 0, RGB(0, 200, 0), vbSolid, vbDiagonalCross
    Cl.drawRect 0, Me.ScaleHeight, Me.ScaleWidth, Me.ScaleHeight / 2, 0, RGB(200, 200, 0), vbDashDotDot, vbUpwardDiagonal
    Cl.drawRect Me.ScaleWidth / 2, 0, Me.ScaleWidth, Me.ScaleHeight / 2, 0, RGB(0, 0, 200), vbSolid, vbFSSolid
    Cl.drawRect Me.ScaleWidth / 2, Me.ScaleHeight, Me.ScaleWidth, Me.ScaleHeight / 2, 0, RGB(200, 0, 0), vbDashDotDot, vbUpwardDiagonal
    
    Cl.DrawText "Voici du texte", 5, 5, True
    Cl.DrawText "Voici du texte non transparent", 5, 100, False, 255

'envoi sur le picture
    Cl.PaintTo Me.hdc, 0, 0
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'ne pas oublier si possible !
    'sinon de la memoire reste occupée pour rien
    'donc eviter de fermer VB avec le STOP, fermer la fenetre plutot
    Cl.CloseImage
End Sub

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

hugoclavet
Messages postés
10
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
1 mars 2008
-
J'ai trouvé un wrapper complet vb6 pour la dll gdi+

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=42861&lngWId=1

Hugo
cs_Stephane
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006
-
ca y est j'ai revue les deleteobject
et apres une minute de redimensionnement intense (lol) le processus (avec la fenetre a taille égale) occupait exactement la meme quantité de mémoire.
cs_Stephane
Messages postés
550
Date d'inscription
vendredi 5 janvier 2001
Statut
Membre
Dernière intervention
23 septembre 2006
-
ok, je ferai les modifications
merci pour les infos
++
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Salut,

comme te le dit DARKSIDIOUS, tu dois absolument libérer la mémoire par DeleteObject sinon ton prog va saturer, ralentir Windows et enfin se faire expulser par Windows.
SelectObject ne fait que placer l'objet GDI spécifié en lieu et place de l'ancien, il n'a pas à libérer la mémoire, on peut très bien avoir à utiliser plus tard l'ancien objet. La libération mémoire est toujours la responsabilité du développeur.

Bonne continuation.
cs_DARKSIDIOUS
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
83 -
Ben écoute, j'avais fait un ocx qui utilisais environ 100 objets graphiques (pinceaux et brosses surtout), et je ne supprimais pas les anciens objets utilisés, et à chaque raffraichissement du contrôle, je perdais environ 4 Ko de mémoire. Ce n'est pas énorme tu me diras, mais ca suffisait à faire saturer la mémoire graphique (4000 objets graphiques environ) en quelques minutes seulement !).

Et là, le problème est le même pour ta source : tu perds environ 8 à 12 Ko pour chaque redimensionnement de la feuille (ce qui oblige de tout retracer), et environ 10 objets graphiques à chaque fois ! (pour t'en rendre compte, utilise le gestionnaire de processus de Windows, et affiche la colonne "Objets GDI", tu verra vite !

En théorie, lorsque tu fait un SelectObject, Windows est censé libérer les ressources de l'ancien objet graphique, mais il ne le fait pas malheureusement, et du coup, on arrive très vite à la limite des objets graphiques d'un processus !

DarK Sidious

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.