begin process at 2008 05 17 03:05:06
1 173 899 membres
32 nouveaux aujourd'hui
13 973 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INFO-BULLE PERSONNALISÉE, MULTILIGNES AVEC QQ OPTONS


Information sur la source

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é: 10 582 / 1 363

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


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

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.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

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.
  • signaler à un administrateur
    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 !

  • signaler à un administrateur
    Commentaire de Renfield le 24/01/2006 08:21:08 administrateur CS

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

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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

  • signaler à un administrateur
    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+

  • signaler à un administrateur
    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 ...

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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)

  • signaler à un administrateur
    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

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS