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.

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

D'avance merci pour vos suggestions.