lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004
-
3 août 2004 à 09:09
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004
-
5 août 2004 à 11:32
Bonjour,
je cherche à créer des infobulles dans des formulaires Access 2000 sur le même modèle que ce que l'on peut faire en DHTML.
Lorsque la souris survole un contrôle, une infobulle s'affiche (et reste affichée tant que le pointeur y est). Lorsque la souris quitte le contrôle, elle disparait.
L'intérêt par rapport à la propriété ControlTipText est de pouvoir la personnaliser, y mettre tout le texte que l'on souhaite...
Jusqu'à présent, j'ai essayé 2 solutions :
- en créant une zone de texte dans un formulaire. Solution pénible car nécessite d'éditer au préalable le formulaire en mode Design et de faire attention à ce que les dimensions de la zone de texte ne dépassent pas les dimensions du formulaire.
- en utilisant un formulaire dédié à l'affichage des infos. Assez pratique. 2 limites à noter : attention à la dimension du formulaire pour du texte "très long" (j'utilise le code Autosizetext de Stephen Lebans). Les contrôles ne disposent pas d'une propriété onmouseout permettant la fermeture du formulaire (je le masque quand le pointeur se trouve sur la section Détail). De plus, d'une base à l'autre : ne pas oublier d'importer le formulaire, le mettre en forme....
j'ai parcouru le site et j'ai trouvé quelques pistes intéressantes (dont celle de RenField et son infobulle multi-lignes. Programmé sous VB, je ne vois pas comment l'adapter sous MS Access) mais après quelques tests, je cale.
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 3 août 2004 à 14:24
Bien compris,
j'ai récupéré son handle par la fonction suivante (trouvée sur : http://www.mvps.org)
**********************************
Private Declare Function apiGetFocus Lib "user32" _
Alias "GetFocus" _
() As Long
Function fhWnd(ctl As Control) As Long
On Error Resume Next
ctl.SetFocus
If Err Then
fhWnd = 0
Else
fhWnd = apiGetFocus
End If
On Error GoTo 0
End Function
**********************************
J'ai importé ton code VB dans Access.
Au chargement d'un formulaire (comportant un bouton de commande nommée command0 et un dim ToolTip as new ReyToolTips), je fais :
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 3 août 2004 à 15:44
En faisant l'exécution en pas à pas,
- le handle du controle est récupéré
- la collection est créée et newTT ajouté avec la clé (initialisation de mBackColor et mForeColor)
- lors de newTT.attach, l'erreur se produit juste pendant/après l'instruction de création de la fenêtre
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 3 août 2004 à 23:20
c'était bien le App.hinstance qui posait problème. En le mettant à 0, çà passe.
L'infobulle est bien créée (ouf), s'affiche (ré-ouf) mais... pas au bon endroit :
- l'infobulle est affichée lorsque la souris pointe sur la partie de fenêtre listant les formulaires de la base.
- Lorsque la souris pointe sur le formulaire ouvert et/ou le controle , l'infobulle n'est pas affichée (ce qui signifie que l'infobulle est attachée à la partie de fenêtre).
Dans la procédure Attach, l'instruction GetClientRect hwnd, R renvoie une zone 0,0,886,595 (je suis en 1024*768).
Pourtant le hwnd est bien celui correspondant au bouton de contrôle Commande0 et ti.hwnd reçoit le hwnd et ensuite Call SendMessage(mhWnd, TTM_ADDTOOLA, 0, ti).
Donc je comprends pas pourquoi c'est attaché à la partie de fenêtre (et donc c'est logique d'avoir ces coordonnées de zone sensible).
Ah, je suis sûr d'être près du but. Où est donc ce petit boulon à revisser ?
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 4 août 2004 à 08:39
j'ai essayé différentes solutions, en vain.
Tout se passe comme si Access se fichait du handle du contrôle, pourtant bien défini.
Sur Mvps, j'ai lu :
"Par contre, puisque les contrôles d'Access ne se comportent pas du tout comme ceux de VB, il y a peu de choses qu'on peut faire avec cette poignée (handle). "
Cela vaut-il aussi pour cette idée d'infobulle ?
Je vais essayer de ne pas passer par le handle mais uniquement par les coordonnées de la souris.
Et çà marche ! (même ne ne modifiant pas GetClientRect)...
la dernière ligne droite : comment faire pour que l'infobulle ne soit pas affichée plusieurs fois (à cause du mousemove) ?
- tu vas me répondre : en définissant l'attachement 1 seule fois au chargement du formulaire.
- oui, mais si je souhaite que l'infobulle (titre et texte principalement) puisse être modifiée après une saisie de l'utilisateur sur le formulaire ? Que penses-tu de cette idée :
1. pour afficher qu'une seule fois : créer une variable globale recevant le handle de l'infobulle et tester avant création si elle est à 0 ou non. Si 0 alors on la crée, sinon on passe son chemin.
2. pour modifier le titre et le texte :
2.1 pour le titre, je passe par le Call SendMessage,
2.2 pour le texte : je mets ti en variable globale je modifie ti.lpszText et ensuite un coup de Call SendMessage (mhWnd,TTM_ADDTOOLA,0,ti).
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 5 août 2004 à 01:06
Merci pour tout Renfield... :big)
J'espère que tu ne m'en voudras pas d'avoir taillé dans le vif avec ton code très pro... De toute façon, je ferai référence à toi dans les lignes de code (mais je n'ai aucune prétention à diffuser quoi que ce soit).
Une dernière (?!) question concernant les caractéristiques de la fenêtre créée. Pour un tooltip, tu utilises de mémoire la classe tooltip_class32. Y a t'il la possibilité d'en utiliser d'autres ? je pensais à une classe qui permettrait l'affichage d'infos sous forme de tableau. Peut-être est-ce impossible mais quand je découvre l'étendue des possibilités, j'ai l'impression qu'il n'y a quasiment aucune limite...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 août 2004 à 09:56
La class Tooltip est faite dans un certain but.... c'est elle qui definit si elle se montre etc...
maintenant, a y reflechir, il s'agit d'une fenetre comme les autres.... il doit être possible de faire un SetParent pour y rattacher un autre contrôle, comme fenêtre Fille....
lebourgjf
Messages postés29Date d'inscriptionmardi 16 décembre 2003StatutMembreDernière intervention 6 août 2004 5 août 2004 à 11:32
En effet, je viens de tester avec succès l'inclusion d'une fenêtre fille dans la fenêtre.
Comme je développe sous VBA Access, j'obtiens des trucs bizarroïdes concernant les hwnd. Je clos le sujet des infobulles et poste un nouveau sujet sur le hwnd sous Access.
J'en profiterai aussi pour poser la question d'écriture et de mise en forme de texte dans une fenêtre créée par createWindowEx (et là j'ai du boulot pour apprendre).