Bonjour,
Sous VB 2008 Express, le but est de relier des étiquettes (labels) par des lignes (créer un organigramme)
Contrainte 1 : Les lignes ne peuvent apparaître SUR une étiquette
Contrainte 2 : Une infobulle doit apparaître lorsque la souris survole une étiquette
NB : Les étiquettes (labels) sont si nombreuses qu'elles ne peuvent être toutes visibles à l'écran. La feuille (form) contient donc le composant ToolTip, deux ascenseurs (un HScroll et un VScroll) ainsi que deux conteneurs (Panel_liens et Panel_labels).
Ces panels sont plus grands que la taille de l'écran. Les Scroll permettent de voir une partie des Panels. Ces panels ont la même origine et les mêmes dimensions, ils sont donc superposées. Ces panels agissent donc comme des calques. Sur le premier calque sont placés les lignes (liens). Sur le second calque (qui superpose le premier) sont placés les étiquettes. Comme les étiquettes sont placées sur le second calque (ayant son Backcolor = transparent), les lignes n'apparaissent pas sur l'étiquette.
Les données (contenu Text des labels, contenu Tooltip des labels, position des labels, les X1,Y1,X2,Y2 des lignes) sont stockées dans une base de données. Si une étiquette est déplacée via la souris, les liens suivent et les nouvelles positions sont enregistrées. Tout baigne !
Le hic, c'est l'infobulle !
Une fois, les liens placés, il m'est impossible de voir le contenu d'une infobulle. Si les infobulles apparaissent, ce sont les liens qui n'apparaissent plus ....
Les lignes sont des Microsoft.VisualBasic.PowerPacks.LineShape (la version antérieure était écrite en VB6 et utilisait le contrôle line )
Je crois que c'est le Microsoft.VisualBasic.PowerPacks.ShapeContainer qui empêche aux infobulles d'apparaître ... Le code ci-dessous met en évidence mon problème.
Pour voir le problème, disparition de l'infobulle ou de la ligne, il suffit de commenter ou décommenter une seule ligne. Celle qui commence par "canvas.Parent = ..." dans le Form1_Load
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 Public Class Form1 ' Le projet fait référence à Microsoft.VisualBasic.PowerPacks.VS.dll Private ligne As Microsoft.VisualBasic.PowerPacks.LineShape Private canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer Private Panel_liens As Panel Private panel_labels As Panel Private etiquette As Label Private infobulle As ToolTip Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load infobulle = New ToolTip Panel_liens = New Panel With Panel_liens .Left = 50 : .Top = 50 : .Height = 250 : .Width = 250 .Parent = Me .BackColor = Color.Aquamarine ' pour distinguer le Panel de la Form End With canvas.Parent = Panel_liens ' empêche l'affichage des info-bulles ... ' sauf si la ligne ci-dessus est commentée, mais alors c'est la ligne qui n'apparaît plus ... ' panel qui est "sur" le Panel_liens, avec les mêmes dimensions et transparent panel_labels = New Panel With Panel_labels .Location = Panel_liens.Location .Size = Panel_liens.Size .BackColor = Color.Transparent .Parent = Panel_liens End With Call afficher() ' affiche une étiquette et un lien End Sub Private Sub afficher() ' ajoute une étiquette etiquette = New Label With etiquette .Text = "contenu étiquette" .Left = 50 : .Top = 50 : .Height = 18 : Width = 100 .Visible = True End With infobulle.SetToolTip(etiquette, "contenu infobulle") panel_labels.Controls.Add(etiquette) ' ajoute une ligne (qui passe sous l'étiquette) ligne = New Microsoft.VisualBasic.PowerPacks.LineShape With ligne ' ligne verticale .X1 = 150 : .Y1 = 0 : .X2 = 150 : .Y2 = 300 .Visible = True .Parent = canvas End With End Sub End Class
D'avance merci pour vos suggestions.
Partager