Slt, c'est possible de mettre un texte dans la notifyicon et non en tooltip ?
Merci
Slt, c'est possible de mettre un texte dans la notifyicon et non en tooltip ?
Merci
Ben disons qu'un NotifyIcon ets vraiment trop petit por accueillir un texte, voilà pourquoi sa propriété Text est détourné vers un tooltip Maintenant si c'est juste pour y faire apparaître un sigle alors il suffit d'en faire une image de ce texteEnvoyé par Aspic
oui c'est une bonne idée c'est e que je voulais faire mais le probleme c'est que c'est censé changer...
Mon texte se limite seulement à 2 Chiffres donc c'est assez petit pour etre mis dedans. Par contre il n'est pas fixe. Je voudrais faire comme certain logiciel de RAM qui t'indique la quantité de RAM dispo dans la NotifyIcon...
C'est pas possible ?
Ben l'idée reste bonne, car il ne s'agit pas vraiment d'écrire mais de dessiner, tu peux donc certainement intervenir dans le paint du NotifyIcon pour dynamiquement intervenir sur son objet Graphics en dessinant la chaine de caractères ; via DrawString
je suis entrain d'essayer ta méthode mais je trouve pas l'objet paint du notifyIcon...
mais je sais pas ou le mettre ca .. ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Dim n As Graphics n.DrawString("45", New Font("Arial", 12), New SolidBrush(Color.Black), 60, 60)
EDIT : Je viens de chercher mais apparement ca existe aps le paint pour le NotifyIcon.
De toute façon je doute que ton code compile tu n'as pas récupéré d'instance GraphicsEnvoyé par Aspic
Sinon effectivement tu as raison sur le fait que je me trompe en pensant que Notify dérive de Control c'est en fait un component.
Donc la piste que je vois est de travailler sur son Objet Graphics récupéré de cette manière:
Tu mettras ton code de modification de l'icone dans une méthode attendant en paramètre une chaîne de caractères par exemple que tu appelles lorsque tu as besoin en lui envoyant le string souhaité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim g As Graphics= Graphics.FromHwnd(Me.notifyIcon1.Icon.Handle)
PS: pour ces paramètres en rouge
Tu peux très bien les déclarer une fois pour toutes en variables de classes (si elle ne bouge pas) puis les et instancier dans le constructeur de ta Form après InitializeComponent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 n.DrawString("45", New Font("Arial", 12), New SolidBrush (Color.Black), 60, 60)
j'ai essayer ca mais je sais pas ou le mettre. Je l'est mis dans l'event Resize de la form mais j'ai une erreur : Memoire insuffisante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Dim g As Graphics = Graphics.FromHwnd(Me.NotifyIcon1.Icon.Handle) g.DrawString("45", New Font("Arial", 12), New SolidBrush(Color.Black), 60, 60)
Il faut le mettre ou ce code ?
oui j'avais lu mais je comprends aps ce que tu veux dire ... dsl
Bon çà, ce n'est pas très compliqué à comprendre l'algoEnvoyé par Aspic
Cependant, par curiosité, j'ai voulu implémenter vite fait u exemple qui fonctionne et ben c'est pas gagné, notamment pour récupérer le rectangle dans le systray (necessite API Windows) etc... Donc très franchement il serait beaucoup plus simple d'utiliser un menu contextuel ou le ToolTip
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 'quelquepart ta méthode qui initialise certaines valeurs comme "45" Private Sub maMethode() 'ton code qui obtient ou génère un int myvalue comme 45 'puis Me.UpdateNotiFyIcon(myvalue.ToString()) End Sub PrivateSub UpdateNotiFyIcon1(ByVal texte AsString) 'ici le code qui va modifier NotiFyIcon1 EndSub
D'ailleurs jusqu'ici je n'ai pas d'exemple managé Dotnet C'est certainement une évolution à apporter pour faciliter la t^che du developpeur
Sinon je ne vois pas d'autres solutions que de redessiner un Icon et de le réaffecter à la propriété NotiFyIcon.Icon ce qui me paraît vraiment très lourd pour une fonctionnalité assez anecdotique en fin de compte
De toute maniere récupérer l'objet graphique avec FromHwnd provoque une erreur citée plus haute...
J'ai essayer ca :
pas d'erreur mais ca marche pas. L'icone du NotifyIcone ne change pas !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Private Sub UpdateIcone(ByVal Value As String) Dim g As Graphics = Graphics.FromImage(Me.NotifyIcon1.Icon.ToBitmap) g.DrawString(Value, New Font("Arial", 12), New SolidBrush(Color.Black), 60, 60) End Sub
J'ai oublier quelque chose ?
PS: Je sais que je me prends la tête mais ca pourrait me servir pour d'autre projets !
EDIT : Je pense que apres la modif il faut réaffecter la new icone à la NotifyIcone !? mais comment faire ?
Voila j'ai trouvé un truc sympa...
Je post pour ceux que ca interesse :
Cette fonction permet de créer son icone dynamiquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Public Function CreerIcone(ByVal texte As String, ByVal couleur As Color) As Icon Try ' creation de l'image Dim ImageSize As New System.Drawing.Size(200, 200) Dim Image As Image = New Bitmap(ImageSize.Width, ImageSize.Height) ' Crée l'image Dim Graph As Graphics = Graphics.FromImage(Image) ' remplit l'image en fonction de ce que l'on veut Graph.Clear(couleur) Graph.DrawString(texte, New Font("Arial", 120), New SolidBrush (Color.Black), -20, 20) ' transforme l'image en icone Dim lbmpTemporaire As Bitmap lbmpTemporaire = CType(Image, Bitmap) Return Icon.FromHandle(lbmpTemporaire.GetHicon) Catch a As Exception MsgBox(a.Message) End Try End Function
Ca marche bien mais le probleme c'est que le "string" est moche ^^ En gros on voit les pixels du chiffre et c'est difficile à lire !!
Si quelqu'un à une idée pour améliorer ca n'hésiter pas !!
Sinon merci à Neguib pour son aide précieuse...
++
Merci à toi pour la trouvaille toute bête en fait, pour ce qui est des soucis de design de la chaîne de caractère voit du côté de la surcharge de DrawString avec un StringFormat, voir aussi si tu peux tester differents Fonts
Oui j'ai jouer sur le font et puis en bidouillant j'ai trouver un truc potable !
Par contre, au bout de 20 min j'ai une erreur à la chaine qui apparait :
Une erreur est survenue dans le GDI+
Je sais pas ce que c'est ni comment le résoudre...
++
Ah bon tu n'as pas mis ton code dans un try/catch pour capturer une eventuelle exception et l'afficher quel est le message d'erreur celà concerne-t-il la longueur de la chaine, le trop plein d'objets instanciés non disposés etc...Envoyé par Aspic
utilises un ex.ToString() plutôt que ex.Message
si si il ets en try ...
ca plante sur cette ligne :
mais je sais pas pourquoi j'ai pas plus d'information...
Code : Sélectionner tout - Visualiser dans une fenêtre à part Return Icon.FromHandle(lbmpTemporaire.GetHicon)
L'erreur exacte est :"Une erreur générique s'est produite dans GDI+."
at System.Drawing.Bitmap.GetHicon()
at MemoryControl.Form1.CreerIcone(String texte, Color couleur) in D:\Programmation\Programmation\Projets\MemoryControl\Form1.vb:line 399" String
Bon effectivement je viens de tester et il faut absolument détruite l'Icon en mémoir, pour cela tu utilises l'API "user32" DestroyIcon de la manière suivante par exemple:
Ici j'ai fait un test qui affiche dans NotifyIcon1 les secondes qui défile de 0 à 59 (utilisation de Timer1)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 ImportsSystem ImportsSystem.Drawing Imports System.Runtime.InteropServices Public Class MainForm Public Sub New() Me.InitializeComponent() Me.InitializeIconParameters() Me.Timer1.Start() EndSub <DllImport("user32.dll")> _ Private Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean End Function ''' <summary> ''' Méthode privée chargée de redessiner iconBitmap ''' en fonction d'un texte à afficher ''' </summary> ''' <param name="texte">String : représentant le texte à afficher ''' </param> Public Sub UpdateBitmap(ByVal texte As String) Using g As Graphics = Graphics.FromImage(Me.iconBitmap) g.Clear(Me.iconBackColor) g.DrawString(texte, Me.iconFont, Me.iconForeBrush, _ Me.iconRectangleF, Me.iconStringFormat) End Using End Sub ''' <summary> ''' Méthode privée d'initialisation des paramètres ''' par défaut de l'icône de NotifyIcon1 ''' </summary> ''' <remarks> ''' Ceci défini fait une fois pour toute afin ''' d'éviter de nouvelles instanciations inutiles '''</remarks> Private Sub InitializeIconParameters() 'initialiser la couleur de fond par défaut de l'icône de NotifyIcon1 Me.iconBackColor = Color.White 'initialiser le Bitmap par défaut de l'icône de NotifyIcon1 Me.iconBitmap = New Bitmap(32, 32) 'initialiser la police par défaut de l'icône de NotifyIcon1 Me.iconFont = New Font("Arial", 14, FontStyle.Bold) 'initialiser la couleur de police par défaut de l'icône de NotifyIcon1 Me.iconForeBrush = New SolidBrush(Color.Black) 'initialiser le rectangle par défaut d'écriture dans l'icône de NotifyIcon1 Me.iconRectangleF = New RectangleF(1, 1, 30, 30) 'initialiser le StringFormat par défaut du texte ' dans l'icône de NotifyIcon1 Me.iconStringFormat = New StringFormat() Me.iconStringFormat.Alignment = StringAlignment.Center Me.iconStringFormat.LineAlignment = StringAlignment.Center End Sub ''' <summary> ''' Capture l'évènement Tick de Timer1 afin de ''' declencher la modifiaction de l'icône de NotifyIcon1 ''' </summary> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Timer1.Tick ' lancer la mise à jour de NotifyIcon1 Me.UpdateNotiFyIcon(DateTime.Now.Second.ToString()) End Sub ''' <summary> ''' Méthode privée chargée d'afficher un texte ''' dynamiquement dans l'icône de NotifyIcon1 ''' </summary> ''' <param name="texte"> ''' String : représentant le texte à afficher dynamiquement</param> Private Sub UpdateNotiFyIcon(ByVal texte As String) ' redessiner iconBitmap Me.UpdateBitmap(DateTime.Now.Second.ToString()) ' récupérer un icone à patir de iconBitmap Dim newIcon As Icon = Icon.FromHandle(Me.iconBitmap.GetHicon) 'assigner le nouvel icône de NotifyIcon1 Me.NotifyIcon1.Icon = newIcon ' détruire en mémoire le nouvel icône DestroyIcon(newIcon.Handle) End Sub Private iconBitmap As Bitmap Private iconBackColor As Color Private iconFont As Font Private iconForeBrush As Brush Private iconRectangleF As RectangleF Private iconStringFormat As StringFormat End Class
j'ai pas tester mais ca devrais marcher
moi j'ai trouver une autre solution qui marche à merveille, j'utilise un tableau et je stock les 100 icones créées auparavant. Ensuite j'ai plus qu'a me servir dans mon tableau en fonction du texte...
Voila apres du temps CQFD
Merci encore à toi pour ton aide.
Bon je crois que notre travail en collaboration mérite aumoins une petite Q/R pour la FAQ je m'en occupe et je te mets au courant en tant que coauteur
d'aileurs c'est modifiable en enlevant le P/Invoke pour le remplacer par un simple newIcon.Dispose() (sur remarque du collègue Dev01) ce qui améliore la portabilité du code
MerciBon je crois que notre travail en collaboration mérite aumoins une petite Q/R pour la FAQ je m'en occupe et je te mets au courant en tant que coauteur
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager