begin process at 2012 02 12 04:20:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > CLASSE DE DESSIN (API) PLUS RAPIDE QUE VB

CLASSE DE DESSIN (API) PLUS RAPIDE QUE VB


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :api, dessin, rapide, ligne, cercles Niveau :Initié Date de création :18/07/2005 Date de mise à jour :23/07/2005 14:11:11 Vu / téléchargé :9 397 / 747

Auteur : Stephane

Ecrire un message privé
Site perso
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • '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
'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




 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 juillet 2005 14:11:11 :
Libération de mémoire revue

 Sources du même auteur

Source avec Zip Source avec une capture UTILISER LA TELECOMMANDE PCTV AVEC KTV
Source avec Zip OUVRIR PLUSIEURS FICHIERS DANS UNE SEULE INSTANCE
Source avec Zip Source avec une capture DOCKCONTROL : DOCKER/UNDOCKER VOS BARRE D'OUTILS ET AUTRES C...
Source avec Zip ROTATION DANS L'ESPACE 3D > 2D
Source avec Zip Source avec une capture PHOTOREMOVER - SUPPRIME LES DOUBLES

 Sources de la même categorie

Source avec une capture GRAPH PHP COURBE DE CHARGE par s.defaye
Source avec Zip Source avec une capture BOULE DE CRISTAL par BLUEBIBUBBLE
VB6 - DÉPLACEMENT D'UN CONTRÔLE SUR UN SEGMENT DE DROITE DÉL... par ucfoutu
Source avec Zip Source .NET (Dotnet) APPLICATION DE DESSIN par fsafsafsaf
Source avec Zip Source avec une capture Source .NET (Dotnet) MERGEIMAGES par Le Pivert

 Sources en rapport avec celle ci

Source avec Zip COMMUNICATION MODBUS MASTER par sergelapointe
Source avec Zip Source .NET (Dotnet) APPLICATION DE DESSIN par fsafsafsaf
Source avec Zip Source .NET (Dotnet) DESSINER DYNAMIQUEMENT SUR UNE PICTUREBOX LIKE PAINTE par xave4552
LIMITER LE NOMBRE DE LIGNES DANS UN TEXTBOX par DuAel
Source avec Zip Source avec une capture LIGNE QUI SE DESSINE ALEATOIREMENT par ATH|500|

Commentaires et avis

Commentaire de DARKSIDIOUS le 18/07/2005 20:46:14 administrateur CS

Ce qui pourrait faire un plus, c'est de gérer la transparence !

Sinon, c'est bien, ca ressemble à ma classe de gestion d'image, mais tu pousse le concept plus loin en traçant des lignes et des rectangles.

Continue comme cà !

DarK Sidious

Commentaire de Stephane le 18/07/2005 20:53:36

hum je ne vois pas du tout comment m'y prendre pour la transparence lol, mais je retiens l'idée.
;)

++

Commentaire de DARKSIDIOUS le 19/07/2005 14:04:11 administrateur CS

Alors, après avoir regardé de plus près ta source, voici mes remarques :

* Ta classe n'est qu'un handler des fonctions de l'API Windows "Classiques". Elle est donc plus rapide que les fonctions de VB, mais elle pourrait être bien plus rapide encore en utilisant un tableau de bits (voir ma source de gestion d'image).

* Tes fonctions d'extractions des composantes de couleurs pourrait être plus rapide en utilisant des opérations binaires au lieu des modulo !

* Tu pourrais rajouter, pour ta fonction DrawText, le type de formatage du texte et l'afficher avec la fonction de l'API DrawText, ce qui rendrait ta fonction plus intéressante.

Voilà c'est à peu près tout.

Ne le prends pas mal (ce ne sont que des remarques, et non des reproches) : ta classe est intéressante, mais n'apporte pas grand chose : tout ce que tu as fait n'est finalement que rendre l'utilisation des API Graphiques un peu plus simple, mais ca n'accèlére pas énormément le tracé des graphiques malheureusement. Ca reste qu'une classe handler comme on peux en trouver de nombreuses sur internet, et quitte à en faire une, ca aurait été mieux d'en faire une pour la GDI+ et non la GDI32.

Sinon, pour la transparence, je voulais dire : lorsque tu trace un rectangle par exemple, tracer chaque point un à un en définissant la couleur de chaque pixel selon la couleur précédente, la couleur à appliquer, et le paramètre de transparence. Mais je croyais que tu utilisais un tableau de bits, ce qui aurait été plus simple à appliquer, mais là, ca ralentirait trop le tracé !

DarK Sidious

Commentaire de Stephane le 20/07/2005 10:33:57

slu

merci pour ces remarques, en fait au début, j'utilisait aussi un tableau de bytes en parralele, mais j'ai eu beaucoup de problemes (crash VB) sans vraiment comprendre d'ou ca venaient (pendant les redimensionnements), puis je pense que VB n'est pas le plus adapté pour faire ce type de traitement : le redimensionnement du tableau de bytes lorsque je redimensionnai l'image, "sacadait" VB et la fenetre que j'étais en train de redimensionner.

pour la rapidité, je n'ai pas testé avec beaucoup d'opérations, mais l'avantage ici c'est que on a pas besoin de tout redessiner lors d'un message PAINT, puisque c'est juste un bitblt vers la destination, donc on gagne en vitesse, et il n'y a pas tout les clignotements.
Si la surface en question est en autoredraw=true, il n'y a pas les clignotements mais c'est beaucoup plus lent à tracer.
Cette classe est un compromis entre les deux problemes (autoredraw = false : clignotements autoredraw=true : lenteur)

Evidemment il reste à l'améliorer...

"Ca reste qu'une classe handler comme on peux en trouver de nombreuses sur internet,"
dsl j'en ai jamais vu lol

"et quitte à en faire une, ca aurait été mieux d'en faire une pour la GDI+ et non la GDI32."
GDI+ est inclu dans windows ? quels sont les avantages ? ou trouver la doc (msdn) ?

++

Commentaire de DARKSIDIOUS le 20/07/2005 11:43:03 administrateur CS

Oui ta classe évite les clignotements, et surtout, bouffe sûrement moins de mémoire que l'autoredraw ! Cependant, j'aimerais porter ton attention sur un point qui s'avère très gênant lorsqu'on utilise les api : lorsqu'on crée un crayon ou un pinceau, ca bouffe de la mémoire si on oublie de supprimer l'ancien crayon/pinceau.

Pour t'en rendre compte, lance ton prog, et redimensionne ta fenêtre un bon millier de fois tout en scruptant la consommation mémoire de celui-ci. Tu va voir qu'elle grimpe jusqu'au point de planter ton prog, à cause d'une saturation mémoire graphique !

Le nombre d'objet GDI est limité pour un prog (environ 4000 il me semble par processus), du coup, à chaque fois que tu trace une ligne ou un rectangle, et que tu ne supprime pas les anciens cratons/pinceaux, ca bouffe un objet graphique ! A force, ca sature la mémoire (j'en ai fait les frais pour un gros ocx que je développais, et qui plantait au bout de quelques minutes d'utilisation !).

Donc un conseil, lorsque tu fait :
SelectObject(lHdc, lPen)

remplace par :
lOldPen = SelectObject(lHdc, lPen)
DeleteObject lOldPen

Ca évite d'encombrer la mémoire inutilement.

Pour le tableau de bits, je peux t'assurer que VB peut le manier, reste à ne pas dépasser les limites du tableau !
Ma classe le gère très bien, par contre, elle ne gère pas le redimensionnement, c'est vrai !

On trouve pas mal de classe Handler sur le net (vbaccelerator pour ne citer que lui) surtout sur les sites de prog VB avancé.

GDI+ n'est pas inclut par défaut dans Windows 98/2000, mais il me semble que oui sous XP. La GDI+ permet surtout de gérer le 32 bits, et a une approche orientée objet comparée à la GDI32. Tu pourras trouver pas mal de doc sur le net (ami google)

Par exemple :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/GDIPlus.asp
http://www.3ie.org/nouvelles_technologies/fiches.php?techno_id=350

DarK Sidious

Commentaire de Stephane le 20/07/2005 22:14:24

ok merci pour les infos

mais les objets, je les supprime ! il y sont les deleteobject a la fin des procedures, et j'ai samurize avec l'utilisation RAM sur le bureau, j'ai redimensionné la fenetre pendant un moment, la ram ne bouge pas :)

quand tu dit :
lOldPen = SelectObject(lHdc, lPen)
DeleteObject lOldPen

j'ai vu sur la msdn que le oldpen est automatiquement remplacé par le new, tu est sur qu'il faut le supprimer aussi ?

merci a+

Commentaire de DARKSIDIOUS le 20/07/2005 22:42:17 administrateur CS

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

Commentaire de BruNews le 20/07/2005 23:36:30 administrateur CS

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.

Commentaire de Stephane le 21/07/2005 04:57:29

ok, je ferai les modifications
merci pour les infos
++

Commentaire de Stephane le 23/07/2005 14:12:44

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.

Commentaire de hugoclavet le 21/11/2005 17:19:24

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

probleme avec picturebox [ par hhhp2004 ] hhhp2004salut,On a un dessin dans un picturebox (par exemple un ligne et un rectangle), est ce quon peut effacer une partie du dessin dans le pictureb plus rapide qu'un listview [ par naphta ] théoriquement MSHFlexGrid est plus rapide qu'un listview.comment le constater ?L'avantage du connecteur ADO qui devrait rendre le remplissage plus rap Recherche rapide dans un Tstring [ par Pierre42 ] Bonjour à tous, Voici mon probleme, j'ai un certain nombre de mots dans un texte et je dois vérifier si ceux-ci se trouve dans un Tstring. Tableau rapide [ par madflo ] Voilà j'ai un problème de rapidité :Etape 1 : Ma base de donnée créé un fichier texte contenant de 1 à 100 000 lign Dessin [ par nuttyfbr ] Voila, c'est un peu hard à comprendre comme question, masi j'aimerais savoir comment dessiner une ligne. Mais pas une bête ligne. J'entre Dessiner un texte accolé à une ligne avec les api [ par Fabyahp ] BonjourJe programme avec vb6 et je cherche comment dessiner un texte accolé à une ligne avec les api. Mon but est d'arriver à faire un Dessiner ligne et rectangle dans Picturebox [ par Galain ] Salut à tousJe programme en VB net 2008 Express sous WindowsDans une Picturebox j'arrive à dessiner des lignes et des rectangles avec les méthodes Dra Dessin de ligne [ par chewbaka62 ] Bonsoir, Pratiquement, je sais comment utiliser la classe Graphics pour dessiner une ligne. Par contre, ce que je n'arrive pas à faire c'est faire qu Copie dossiers/sous dossiers... [ par Dolphin Boy ] Salut la communauté Je cherche une méthode de copie de dossiers (avec leur contenu - fichiers et sous-dossiers) plus rapide et moins contraignante que Dessiner une ligne avec api [ par BozzoDodo ] Bonjour, je cheche l'api qui permet de dessiner une ligne qui lorsque l'on redessine dessus elle s'efface. En fait comment faut-il faire pour dessiner


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales