begin process at 2012 02 12 23:29:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > INFO-BULLE PERSONNALISÉE, MULTILIGNES AVEC QQ OPTONS

INFO-BULLE PERSONNALISÉE, MULTILIGNES AVEC QQ OPTONS


 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 :infobulle, bulle, tooltips Niveau :Initié Date de création :24/01/2006 Date de mise à jour :25/01/2006 23:42:12 Vu / téléchargé :17 008 / 1 723

Auteur : Nocturne

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Après une petite recherche sur VbFrance, j’ai trouvé qq codes (info-bulle, ToolTips), mais ils ne correspondaient pas exactement à mes critères d’utilisation.
Alors j’ai développé ce code source que je poste ici, toutes les remarques et suggestions sont les bienvenus

Testé sous Win98SE et Win2000

Ce code source n'est pas une application de construction d'info-bulle, mais un exemple d’utilisation.

Propriétés prise en charge par l’info-bulle :
- Couleur, police, taille du texte
- Réglage de la largeur de l’info-bulle
- Remplacer, une couleur par une autre
- Sélectionner, une couleur pour la rendre transparente
- Possibilité de mettre vos propres formats d’info-bulle
- Réglages de décalages individualisés pour la souris, et de tous les éléments interne
- Option d’affichage d’un panneau et/ou d’une case fermeture
- Gestion automatique de positions du Bec, supérieur, inférieur, droite et gauche par rapport à l'objet déclencheur qui lui est divisé en 4 zones
- Gestion automatique des dépassements au cas ou l’info-bulle sorte de l’interface
- Possibilité de réglage du temps d’apparition

Temps de traitement d’apparition de l’info-bulle :
Je pense qu’en terme de temps de traitement entre le déclenchement et l’apparition de l’info-bulle est très satisfaisant. Cependant, plus le texte est important, plus l’info-bulle sera grande et donc prendra plus de temps de traitement, dépend également de la puissance de votre PC. Reste donc un peu aléatoire mais donne une idée.
Pour plus de précision, j’ai dés-activé les anti-virus/firewall, aucune application est ouverte sur le bureau, il ne reste que les progs en tâches de fond de windows et Vb6.
Les testes effectués avec le type 1 info-bulle : J’ai 2 PC,
1 win98se, PIII500, 256 Mo, disque 7200tr/min : Valeurs collectées
- sous ide Vb6 sur le Label7 : 102 millisecondes
- sous infoBulle.exe sur le Label7 : 44  millisecondes
- sous ide Vb6 sur l’image du Dahu : 445 millisecondes
- sous infoBulle.exe sur l’image du Dahu : 181 millisecondes

1 win2000server Sp4, PIII450 Mo, 512 Mo, disque 7200tr/min : Valeurs collectées
- sous Vb6 sur le Label7 : 110 millisecondes
- sous infoBulle.exe sur le Label7 : 60  millisecondes
- sous Vb6 sur l’image du Dahu : 501 millisecondes
- sous infoBulle.exe sur l’image du Dahu : 251  millisecondes

Importation des images de base et traitement :
J’ai récupéré les images de base de l’info-bulle depuis la barre de dessin dans Word (Formes automatiques, bulles et légendes). J’ai fait qq motifs sur ces bulles, je copie depuis Word et je les colles directement dans les PictureBox. Attention d’utiliser des couleurs de base (noir, blanc, …) pour le fond et le liseret, cela facilite le remplacement de couleur.
Ces bulles sont du type graphique vectoriel, on peut aussi les importer directement dans le PictureBox sous fichier Metafile (wmf ou emf)
Les avantages de ce format sont que l’on peut beaucoup plus facilement manipuler l’image. On peut redimensionner, changer d’échelle, sans perte de qualité, sans effet d’échelle ...
Par contre, il est impossible d’avoir un rendu satisfaisant d’une photo sous ce format.
C’est ce type d’image qui m’a été permis de développer ce code source, la subtilité réside que l’image se redimensionne ou se strech en gardant les mêmes propriétés et qualité (pas d’effet de pixalisation suite à un agrandissement).
J’ai du quand même développer une procédure (RedimPictureBoxPourImage) pour redimensionner la PicturBox car BitBlits a tendance a aplatir l'image et du coup modifie qq peut la taille.
Les images des panneaux ou case fermeture sont en Gif.

Construction info-bulle
La construction de l’InfoBulle_PictureBox est un conteneur qui abrite d’autres objets comme des PictureBox (style image info-bulle, les panneaux, case fermeture), des Labels (un pour le texte et 2 autres pour les réglages).

En terme d’API, j’utilise GetDIBits et SetDIBits pour la manipulation d’image afin de récupérer les bits dans un tableau. Ceci est bien plus rapide qu'avec la manipulation GetPixel / SetPixel traditionnelle.

Pour info, le module RegionFromBitmap n’est pas de moi, j’ai juste ajouté une procédure, effectués qq modifications que j’ai signalés et dés-activé une procédure que je n’utilise pas.

Les points qui peuvent être améliorés :
Petit problème lorsque l’utilisateur déplace la souris a grande vitesse, il se produit une redondance de l’InfoBulle_Picture qui faudrait faire disparaître.

Il faudrait si possible simplifier ou rendre plus lisible la procédure Position_InfoBulle dans le module Mod_InfoBulle car actuellement, difficile de si retrouver avec les If, Else et End If. J’ai développé cette procédure sans trop y réfléchir.

Améliorer la gestion erreurs au cas ou, car je me suis pas cassé la tête, à part qq On Error Resum Next ici et là.


 Conclusion

Pour utiliser l'info-bulle dans vos applications
Depuis la Form1, il faut récupérer :
-Une partie de la procédure Form_Load
-Toutes les procédures : Form_MouseMove, InfoBulle_Close_Click, Label7_MouseMove et Timer1_Timer
Attention, si vous mettez vos propres images info-bulle, il faudra revoir les positionnements, décalages, couleurs, etc..
-Il faut également récupérer les deux modules

J’espère ne pas avoir fait trop d’erreurs dans le développement de ce code source, si vous constatez des problèmes de fonctionnement ou si vous apportez des améliorations, alors welcome.

Je pense que ce code est facilement modifiable pour vos projets, avec des possibilités et des options intéressantes. Cela peut être un bon point de départ
Il serait facile d’en faire un OCX.

 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

24 janvier 2006 21:27:38 :
MAJ : Suppression de Obj_Declencheur dans Text1_Change Dés-activation des ReleaseDC Déclaration d'une variable pour GetTickCount afin de ne pas le re-calculer plusieurs fois
25 janvier 2006 23:42:12 :
MAJ: zip Mise en place procédure CreateMaskBmp d'EBArtSoft par rapport à sa source 'effey blucky' J'ai mise un bouton d'option pour voir la difference de traitement entre CreateMaskBmp et Change_Couleur. Remarque pour de petites bulles il n'y a pas de grande difference, par contre pour de grosses info-bulles, la procédure d'EBartSoft est nettement plus rapide. Réctification des DeleteObject, SelectObject dans procédure Change_Couleur par rapport aux remarques de Renfield.

 Sources du même auteur

AJOUTER UNE LIGNE DANS UN FICHIER - API
Source avec Zip Source avec une capture INFORMATION DISQUE DUR
RETROUVE LA DATE DE CRÉATION D'UN FICHIER - API
Source avec Zip Source avec une capture ECHANGE DE MESSAGES WINDOWS ENTRE DEUX APPLICATIONS
Source avec Zip Source avec une capture TIRAGE DU LOTO

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) CREER UN GIF ANIMÉ par Le Pivert
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

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VERITABLE INFOBULLE D'ITEM DE COMBOBOX SURVOLÉ PAR LA SOURIS... par Philippe734
Source avec Zip Source avec une capture TRI BULLE DANS UN TREEVIEW par cipolin
Source avec Zip Source avec une capture BULLE À BOUTONS par VinceVG
Source avec Zip Source avec une capture INFOBULLE AVEC IMAGE INTÉGRÉE par fiko81
Source avec Zip Source avec une capture REPERTOIRE DE CONTACT DANS UN TREEVIEW (ARBORESCENCES PAR CA... par lomig.menez

Commentaires et avis

Commentaire de oommeeggaa3d le 24/01/2006 07:31:47

hello

L'idée est tres sympa, et graphiquement ca rend bien ! je n'ai pas regardé le code, mais bravo !

Commentaire de Renfield le 24/01/2006 08:21:08 administrateur CS

joli, j'ai pas vu le code, mais joli ^^

Commentaire de econs le 24/01/2006 09:11:46 administrateur CS

Ben alors ? vous auriez dû regarder le code, il est pas mal non plus. Pour les belles images, il y a le site graphfr :o)

En tous cas, il est clair, et richement commenté, ce qui fait déjà bien plaisir.

Bon, y'a la procedure Option1_Click qui est un peu trop longue, tu aurais pû la découper en sous-procédures.

En plus, cette source permet d'apprendre plein de choses sur les dahus ... Original, et encore jamais fait en VB ... :o)

Un seul regret : le codage "en dur" de la taille des polices. En effet, les pictureboxes possèdent les méthodes TextHeight et TextWidth, qui te permettent de savoir quelle taille aura ton texte, une fois écrit dans le conteneur.

Commentaire de Renfield le 24/01/2006 09:51:30 administrateur CS

je regarde le code, je regarde...

le code est comenté, dejà, c'est plaisant
des APIs sont déclarées en doublon, dans tes modules

pour ce qui est de Change_Couleur, tu pourrais accélerer largement l'opération, en utilisant une palette, ou, plus simple : des opérations de masquage (voir source 'effey blucky' proposé par EBArtSoft...)
dans cette même fonction, tu aurait pu éviter le GetDIBits, en passant un pointeur vers ton tableau, dans CreateDIBSection

dans ta boucle Do While X
tu pourrais faire X = X + 3, ce qui t'eviterait les X * 3 à repetition

cette opération est repetée deux fois, pour une raison que j'ignore
Call ReleaseDC(Tmp_ImghDC, Img_hDC)

de plus, elle est fausse : ReleaseDC permet de libérer un Device Context (DC) obtenu en faisant GetDC (le premier parametre est un hWnd, pas un hDC)

remplace "" par VbNullString

pas sur que le changement de ScaleMode effectué dans Remplace_Couleur soit indispensable...
de même, dans Change_Couleur, les dimensions de l'image sont a recuperer avec l'API GetObject, pas en faisant
Img_Width = ImgSource.ScaleWidth
Img_Height = ImgSource.ScaleHeight - 1

parfois, les images et les PictureBox qui les contiennent ne sont pas de même taille...

dans Init_InfoBulle, tu devrais ajouter un peu de 'With' :
With EspionLg
   EspionLg.FontName = ObjetTxt.FontName
   Set EspionLg.Font = ObjetTxt.Font  
   ...
End With

tes Chr$(10) & Chr$(13) sont a remplacer par VbNewLine (ou selon les gouts VbCrLf)
(tu n'as pas l'air a l'aise avec les sauts de ligne ^^)

évite de recalculer n fois de suite
   GetTickCount - Temps_Execution  
place le resultat dans une variable, autrement, le resultat variera a chaque appel...

j'ai pas tout regarder en détail ^^

ah, euh...

dans Text1_Change, Obj_Declencheur n'est pas utilisée

maintenant, testons...


si on déplace rapidement la souris sur un des labels (au hasard, le orange), le tooltip apparait de multiples fois, et peu ramer, si on joue avec le nuage...

le tooltip dynamique est mal dimensionné chez moi, et le bas est plat (et ne tiens pas compte du réglage de forme, pas de petit nuage ^^)

bon, j'ai pas été trop regardant, mais voici déjà quelques remarques qui pourront t'aider, je l'espere

Commentaire de Nocturne le 24/01/2006 18:04:09

Merci pour vos commentaires.
En réponse à econs: la police est modifiable, il suffit de le definir dans les propriétés de InfoBulle_Text, concernant TextHeight et TextWidth, je ne savais pas, merci de l'info.

Renfield: tu as raison, concernant Change_Couleur, j'avais essayé en utilisant une palette, mais je ne suis pas arriver a faire fonctionner.
Concernant Do While X, negatif, tu ne peux pas utiliser X = X + 3
L'opération est repetée deux fois ReleaseDC(Tmp_ImghDC, Img_hDC), J'ai remarqué que si je le fais une seul fois et bien j'ai des problemes avec Win98, je ne sais pas pourquoi mais le fait de le faire 2 fois ca marche bien alors...
Pour GetTickCount - Temps_Execution, on s'en fou car c'est juste pour la demo et ne concerne pas l'info-bulle. Ne pas confondre le prog démo et l'info-bulle.
C'est comme le Fram1 ou 2, le Text1_Change, etc... c'est pour la démo.

Encore merci.
a+

Commentaire de Renfield le 24/01/2006 18:08:25 administrateur CS

j'ai pas tout suivi concernant ReleaseDc mais ton code est faux, et cache quelque chose d'autre....
un DC se Release que si tu as fait un GetDC, et le premier argument n'est pas un hDC, mais un hWnd....
pense bien a faire des DeleteObject et DeleteDc ...

Commentaire de Nocturne le 24/01/2006 18:37:00

Tu as raison pour les ReleaseDC, je n'ai pas fais attention.

Les 2 ReleaseDC dans Change_Couleur module Mod_InfoBulle et le ReleaseDC dans RegionFromBitmap peuvent être dés-activés.
C'est vrai il faut un hWnd.

Parcontre je suis obligé de faire 2 fois les :
Call DeleteObject(hTmp_Bitmap)
Call DeleteDC(Tmp_ImghDC)
Call DeleteObject(hTmp_Bitmap)
Call DeleteDC(Tmp_ImghDC)
Si je fais une fois DeleteObject + DeleteDC ca marche bien pour 2000 mais avec win98 j'ai des problèmes, le Pc ne veut plus faire un shutdown et je suis obligé de le rebooter pour l'arreter correctement.
Si tu as une idée.

Commentaire de Nocturne le 24/01/2006 20:36:15

Renfield, j'ai essayé dans la boucle Do While X pour éviter les X * 3.

Code original :
Do While Y < Img_Height + 1
  X = 0
  Do While X < Img_Width
    If RGB(ImgBits(X * 3 + 2, Img_Height - Y + 1), ImgBits(X * 3 + 1, Img_Height - Y + 1), _
           ImgBits(X * 3, Img_Height - Y + 1)) = Select_Color Then 'Selection couleur
      'Couleur de remplacement
      ImgBits(X * 3 + 2, Img_Height - Y + 1) = RColor
      ImgBits(X * 3 + 1, Img_Height - Y + 1) = GColor
      ImgBits(X * 3, Img_Height - Y + 1) = BColor
    End If
    X = X + 1
  Loop
  Y = Y + 1
Loop

Code Modif :
Dim Rang_X As Long: Rang_X = 0
Do While Y < Img_Height + 1
  X = 0
  Do While X < Img_Width
    If RGB(ImgBits(Rang_X + 2, Img_Height - Y + 1), ImgBits(Rang_X + 1, Img_Height - Y + 1), _
           ImgBits(Rang_X, Img_Height - Y + 1)) = Select_Color Then 'Selection couleur
      'Couleur de remplacement
      ImgBits(Rang_X + 2, Img_Height - Y + 1) = RColor
      ImgBits(Rang_X + 1, Img_Height - Y + 1) = GColor
      ImgBits(Rang_X, Img_Height - Y + 1) = BColor
    End If
    Rang_X = Rang_X + 3
    X = X + 1
  Loop
  Y = Y + 1
Loop

Avec cette modification, le temps de traitement est plus important (multiplié par 4), sous vb j'ai environ 1,9 secondes contre 445 millisecondes (image Dahu) pour l'ancien code. Ca ne va pas.
Renfield, explique moi comment je peux utiliser X = X + 3 car je ne pige pas. D'avance merci.

Commentaire de Renfield le 25/01/2006 07:55:49 administrateur CS

pour les DeleteDc, je pense que tu devrai enregistrer dans une variable le bitmap associé a ton DC (actuellement DeleteObject (SelectObject(Tmp_ImghDC, hTmp_Bitmap)))

et le reselectionner avant de detruire le hdc

soit :

Tmp_ImghDC = CreateCompatibleDC(Img_hDC)
hTmp_Bitmap = CreateDIBSection(Tmp_ImghDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
ANCIEN_DIB = SelectObject(Tmp_ImghDC, hTmp_Bitmap))
...
SelectObject Tmp_ImghDC, ANCIEN_DIB
Call DeleteObject(hTmp_Bitmap)
Call DeleteDC(Tmp_ImghDC)

Commentaire de Renfield le 25/01/2006 08:25:10 administrateur CS

pour les temps d'execution, il ne faut pas mesurer le code en mode debug (il faut compiler)... reste que des améliorations sont possibles....

par exemple, ici, tu créé un HDC, un DIB, tu les associe, tu recupere le tableau de bits, tu les detruit, tu modifie le tableau, tu recree un hdc, tu recree un DIB, tu les associe, tu remplace les données, tu detruit.

cette etape de recreation est inutile... tu créé HDC et DIB, tu les associe, tu recupere les donnees, les modifie, les injecte, et nettoie....

une autre amélioration pourrait comparer les couleur a echanger, et ne lancerait pas
Change_Couleur si les couleurs sont identiques...

tu pourrais aussi mémoriser l'ancien tooltip affiché, pour ne le "recalculer" que si necessaire (s'il a été modifié)
on a pas besoin de passer dans Change_Couleur a chaque fois que je déplace le curseur sur l'image du dahu

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

comment faire des info-bulle [ par drublic ] salut,voila comment faire des info-bulle lorsque la sourie reste sur par exemple un bouton. merci, d'avance, et merci a tous pour les precedent r Modifier une info bulle dans un graphique excel [ par Jean ] Serait-il possible de personnaliser les infos affichées dans une infobulle lorsque l'on pointe une série ou un point du graphiqueMerciJean Modifier le contenu d'une info-bulle dans un graph excel [ par Jean ] Serait-il possible de personnaliser les infos affichées dans une infobulle lorsque l'on pointe une série ou un point du graphiqueMerciJean changer info bulle des bout de toolbar [ par sebV ] J'ai fait un logiciel en Francais et en anglais, il ne me reste que qeleques trucs a traduire, mais je sais pas comment faire.En fait pour la traducti Bulle info XP [ par MrDogbert ] J ai deja posté ce message mais je le reposte encore une fois au cas où...Quelqu un sait il comment faire apparaitre une bulle d info de WinXP? (celle Pb info bulle des fonctions VB !!!!!!!!!!! [ par mikl75 ] salut, les info bulles permettant de connaitres les types de parametres attendus par les focntions VB ne s'affichent plus.ex qd je tape "Trim(", norma info-bulle [ par popysan ] Dans une application access/vba, j'aimerai afficher, au passage de la souris sur une étiquette, une info-bulle en fonction de la valeur contenue dans info bulle des fonctions VB (comment ça marche) [ par chic ] je voudrai mettre dans mon appli des infos bulles qui affichent les paramètres en fonction de la saisie comme les infos bulles des fonctions VB.si que info bulle [ par altay ] L'analyste programmeur a 3 dimensioncomment faire pour avoir une info bulle lorsque l'on passe la souris sur un bouton ?merci d'avance !


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,482 sec (4)

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