Info-bulle personnalisée, multilignes avec qq optons

Soyez le premier à donner votre avis sur cette source.

Vue 20 255 fois - Téléchargée 2 016 fois

Description

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à.

Source / Exemple :


'=> zip <=

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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
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)
Messages postés
115
Date d'inscription
mardi 26 février 2002
Statut
Membre
Dernière intervention
15 novembre 2007

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.
Messages postés
115
Date d'inscription
mardi 26 février 2002
Statut
Membre
Dernière intervention
15 novembre 2007

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.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
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 ...
Afficher les 10 commentaires

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.