2010-08-11 7 views
2
HWND button = CreateWindowEx(0, "BUTTON", ...); 
SetFocus(button); // Button no get focus! :(

En outre, j'ai d'autres contrôles sur mon formulaire que je suis capable de SetFocus() à.C++/Win32 API - SetFocus au bouton ne fonctionne pas

Merci, Martin

+0

Le bouton est-il dans une boîte de dialogue? – Anders

+0

nope, fenêtre et bouton créés lors de l'exécution à l'aide de createwindowex – Martin

+0

Comment vérifiez-vous qu'il n'a pas le focus? Que renvoie 'GetFocus', sinon' button'? –

Répondre

0

SetFocus est une fonction, pas une procédure. Appelez-le comme une fonction et vérifiez sa valeur retournée. La valeur recalée est nulle car vous avez fait une erreur dans l'appel CreateWindowEx() et "button" n'est pas un handle valide ou une fenêtre non associée à la file d'attente des messages de votre thread, ou la valeur de retour n'est pas nulle (c'est maintenant le la poignée de la fenêtre précédemment focalisée) et vous avez le focus (mais ne parvenez pas à le détecter).

+1

Quelle est la différence entre une fonction et une procédure? Autant que je puisse voir (je peux me tromper), je l'appelle comme une fonction. Dans mon code, je vérifie si SetFocus renvoie NULL et si le handle du bouton est NULL. Ils ne le sont pas. Merci pour la suggestion. – Martin

+0

btw, je peux setfocus à d'autres contrôles sur ma fenêtre – Martin

+0

@ Martin: un appel de fonction a une valeur de retour, comme CreateWindowEx(). L'appel SetFocus() correct serait oldhandle = SetFocus (newhandle). Vous devriez vérifier la valeur de bouton renvoyée par CreateWindowEx() pour déterminer si cet appel renvoie un non-null. Vous dites que vous êtes, donc votre code actuel doit être différent de ce que vous avez posté. Postez le code complet, y compris la façon dont vous déterminez que vous n'avez pas le focus (parce que peut-être vous le faites). Notez également que SetFocus() envoie des messages WM_KILLFOCUS et WM_SETFOCUS aux fenêtres précédemment et actuellement concentrées. –

0

Essayez de définir le style WS_TABSTOP sur le bouton.

0

Si vous créez ce bouton en réponse au message WM_INITDIALOG, vous devez retourner FALSE pour empêcher la procédure de boîte de dialogue de modifier le focus.

2

Il a été FOREVER depuis que j'ai dû le faire, mais ...

Si cela était une boîte de dialogue, je vous dire d'envoyer un WM_NEXTDLGCTL via PostMessage(). Le gestionnaire de message de l'élément de boîte de dialogue par défaut s'occupera du reste pour la configuration du focus du clavier et de l'activation de la sélection. Cependant, ceci est un cas différent si je le lis correctement. Vous créez des fenêtres parent et enfant crues à la volée. Si tel est le cas, définissez SetFocus() sur la fenêtre parente et gérez WM_SETFOCUS sur la fenêtre parente en l'amenant au premier plan, puis définissez le focus sur la fenêtre enfant. WM_SETFOCUS et WM_KILLFOCUS ont été conçus pour vous permettre de changer l'état 'activé' de vos contrôles, et la plupart le gèrent pour vous (à moins que votre fenêtre ne soit un contrôle de tirage de propriétaire ou autre). Mais dans une fenêtre brute, lorsque la fenêtre de base de votre parent est envoyée, vous devez vous assurer que le bon enfant l'a si vous en hébergez (pensez-y comme gérant votre propre 'dialogue'). Encore une fois, normalement cela est fait par la procédure de dialogue par défaut pour vous si c'était une boîte de dialogue, mais étant des fenêtres brutes, vous êtes en quelque sorte bloqué en gérant tout vous-même.

Bien que je ne peux pas imaginer comment, j'espère que cela a aidé un peu.

Questions connexes