L’info-bulle ne s’affiche plus après avoir cliqué sur le bouton

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 tooltiptooltip ne s’affiche plus ( j’ai vérifié les valeurs HWND pour HWND de l’ tooltiptooltip 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 sousclasser le contrôle afin de relayer les messages de la souris vers le contrôle tooltiptooltip . 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.


RÉVISÉ LE 21 JANVIER 2014:

À la suite des instructions du membre du lien, Stuart a suggéré * que je pouvais résoudre partiellement le problème. L’ tooltiptooltip 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’ tooltiptooltip 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 commentSendMessage 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.

FIN DE L’EDIT


Voici les instructions pour créer l’exemple minimal illustrant le problème:

  1. Créer un default Win32 project dans MS Visual Studio ;
  2. 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; 
  3. 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 .


EDIT (31 janvier 2014):

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 …

FIN DE L’EDIT:


Ma question est vraiment simple:

Comment ajuster mon code afin que l’ tooltiptooltip 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.