INFO-BULLE PERSONNALISÉE, MULTILIGNES AVEC QQ OPTONS

oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010 - 24 janv. 2006 à 07:31
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 25 janv. 2006 à 08:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35715-info-bulle-personnalisee-multilignes-avec-qq-optons

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 janv. 2006 à 08:25
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 janv. 2006 à 07:55
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)
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
24 janv. 2006 à 20:36
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.
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
24 janv. 2006 à 18:37
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.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 janv. 2006 à 18:08
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 ...
cs_Nocturne Messages postés 115 Date d'inscription mardi 26 février 2002 Statut Membre Dernière intervention 15 novembre 2007
24 janv. 2006 à 18:04
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+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 janv. 2006 à 09:51
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
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
24 janv. 2006 à 09:11
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.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 janv. 2006 à 08:21
joli, j'ai pas vu le code, mais joli ^^
oommeeggaa3d Messages postés 97 Date d'inscription dimanche 24 avril 2005 Statut Membre Dernière intervention 3 septembre 2010
24 janv. 2006 à 07:31
hello

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