Je souhaite créer une tooltip
simple à afficher lorsque l’utilisateur passe la souris sur un button
.
Pour ce faire, j’ai étudié cet exemple à partir de MSDN .
Tout fonctionne correctement lorsque je survole le button
la première fois, mais après cette tooltip
– tooltip
ne s’affiche plus ( j’ai vérifié les valeurs HWND
pour HWND
de l’ tooltip
– tooltip
et pour SendMessage( ..., TTM_ADDTOOL, ... )
et aucune erreur n’a été détectée. ).
J’ai essayé de trouver la solution en ligne, mais j’ai échoué. Ce tutoriel est la seule ressource que j’ai trouvée utile, mais il suggère de sous – classer le contrôle afin de relayer les messages de la souris vers le contrôle tooltip
– tooltip
. Je n’accepterai pas ce type de solution car je crois que ce que je demande, c’est la fonctionnalité de base. tooltip
contrôle des tooltip
fournit.
À la suite des instructions du membre du lien, Stuart a suggéré * que je pouvais résoudre partiellement le problème. L’ tooltip
– tooltip
s’affiche à présent après avoir cliqué sur la zone client de la fenêtre principale, puis sur le bouton.
Cependant, après avoir cliqué sur le bouton, l’ tooltip
du bouton ne s’affiche plus jamais.
En naviguant sur Internet, j’ai trouvé cet exemple et après avoir ajouté ces directives:
#pragma comment( linker, "/manifestdependency:\"type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \ language='*'\"") #pragma comment( lib, "comctl32.lib")
le problème a semblé disparaître. Maintenant, je pouvais cliquer sur un bouton, survoler le contrôle d’édition et afficher l’ tooltip
– tooltip
du contrôle d’édition.
Cependant, après avoir cliqué sur un bouton, puis sur la zone client de la fenêtre principale, puis survolant de nouveau le bouton, son tooltip
ne s’affichait pas!
Ensuite, j’ai continué à chercher sur Internet et j’ai trouvé cet article sur CodeProject qui fait exactement ce dont j’ai besoin.
J’ai donc commencé à parsingr le code source du premier exemple et de cet article. J’étais incapable de voir la différence. Cependant, les apparences étaient différentes ! Il semble que l’article n’utilise pas de Visual Styles
et, en prenant en considération le membre de l’ MSDN article
mentionné par Stuart , j’ai commencé à soupçonner que cela pourrait être le problème manifeste .
J’ai donc essayé de comstackr tous les programmes sans le premier pragma comment
soumis ci-dessus, mais dans mon application de test (celle créée en tant que default Win32 project
), InitCommonControlsEx
échoué. Dans l’exemple de programme, j’ai une erreur. Failed to save the updated manifest to the file ".\Debug\foosyerdoos tooltip.exe.embed.manifest". The parameter is incorrect.
Failed to save the updated manifest to the file ".\Debug\foosyerdoos tooltip.exe.embed.manifest". The parameter is incorrect.
et l’application d’article n’a pas réussi à créer de contrôles d’ tooltip
.
Après avoir créé le projet vierge et après avoir copié le code du premier exemple – cette fois sans pragma comment
– SendMessage
n’a pas pu append les deux tooltip
.
Donc, sans le pragma comment
soumis ci-dessus, je ne peux pas utiliser les contrôles d’ tooltip
ou semble-t-il.
Voici les instructions pour créer l’exemple minimal illustrant le problème:
default Win32 project
dans MS Visual Studio
; Ajoutez le gestionnaire WM_CREATE
ci-dessous:
case WM_CREATE: { HWND hButton = CreateWindowEx( 0, L"Button", L"test me!", WS_CHILD | WS_VISIBLE | WS_BORDER | BS_PUSHBUTTON, 50, 150, 150, 25, hWnd, (HMENU)8003, hInst, 0 ); HWND hwndTip = CreateWindowEx( NULL, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); // Associate the tooltip with the tool. TOOLINFO toolInfo = { 0 }; toolInfo.cbSize = sizeof(toolInfo); toolInfo.hwnd = hWnd; toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS; toolInfo.uId = (UINT_PTR)hButton; toolInfo.lpszText = L"test 1"; SendMessage( hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo ); } return 0L;
Comstackr et exécuter – les tooltip
bulles doivent apparaître au premier survol, mais plus jamais .
Je travaille sous Windows XP
sous MS Visual Studio Express 2008
.
Visual Styles
sont activés. J’ai lié comctl32.lib
et lancé le membre dwICC
la structure dwICC
avec ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES
ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES
ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_BAR_CLASSES
.
Après avoir testé ce même extrait de code sur mon ordinateur portable, qui dispose de Windows 7
je peux confirmer que tout fonctionne correctement. C’est le problème avec Windows XP
je suppose …
Ma question est vraiment simple:
Comment ajuster mon code afin que l’ tooltip
– tooltip
soit affichée chaque fois que l’ utilisateur survole le button
?
Je vous remercie.
Meilleures salutations.
Vous poursuivez le mauvais problème, ce problème est inhérent à la conception des info-bulles. Les règles exactes qu’il utilise ne sont documentées nulle part et je n’ai jamais personnellement éprouvé le besoin de procéder à une ingénierie inverse, je ne peux donc que vous raconter ce que j’ai vu.
L’idée principale derrière cette fonctionnalité est qu’elle évite de fatiguer l’utilisateur avec des informations qu’il connaît déjà. Les infobulles ont été conçues pour être des astuces , juste un fragment d’information qui n’est pas indispensable au bon fonctionnement du programme. Il semble être implémenté en gardant la trace d’un conseil pour un outil ayant déjà été affiché et de ne pas l’ afficher à nouveau si l’outil a été utilisé. Ce qui est logique, bien sûr, il n’est pas nécessaire de rappeler à l’utilisateur ce qu’un outil fait après l’avoir utilisé.
Il n’y a pas de message pour réinitialiser l’état “le conseil était affiché”. Il se réinitialisera lorsqu’il affichera la pointe d’un autre outil. Le fait de modifier la pointe le réinitialise également.
Je répète que c’est quelque chose que vous ne devriez pas essayer de réparer. Le comportement est parfaitement raisonnable. Si cela est important, vous devrez alors prendre le contrôle et afficher vous-même le message TTM_ACTIVATE.
Votre code fonctionne sur mon ordinateur portable avec Windows 7 comme vous le souhaiteriez.
Comme il s’agit de l’exemple de Microsoft, je doute fortement qu’il y ait une erreur.
Pour suivre le conseil de Sherlock Holmes: “Une fois l’impossible éliminé, il ne rest que la vérité, aussi improbable soit-elle.” Depuis que le code fonctionne, il doit alors y avoir un problème avec Windows XP, ce qui peut être confirmé avec les commentaires de suivi ci-dessus à votre question.
Je voudrais vérifier si j’ai téléchargé toutes les mises à jour automatiques ou si je réinstallerais et réessayerais votre code. Vous pouvez également tester votre code sur une autre machine exécutant Windows XP pour voir si le vôtre est le problème.
Bonne chance.