2008-08-18 7 views
1

pas les messages que je crée un cadre de plug-in, où mon application charge une série de plug-in DLL, puis crée une nouvelle fenêtre et passer cette nouvelle poignée de fenêtre du plug-in. Le plugin peut alors utiliser cette poignée pour créer sa propre interface graphique.plugin DLL qui crée une fenêtre parented correctement ne

Tout semble fonctionner très bien. Le seul problème est que lorsque j'appuie sur TAB sur un widget plugin (une editbox, par exemple), il ne saute pas à un autre widget. J'ai compris que certains messages Windows sont transmis, et d'autres ne le sont pas. Le WM_KEYDOWN est passé pour les autres clés, car je peux taper dans la zone d'édition, mais ce message ne gère pas la touche TAB.

Espérons que quelqu'un a un indice. J'utilise Borland VCL avec CBuilder, mais je pense que je pourrais utiliser n'importe quel framework sous WIN32 pour créer ces plugins, car ils ne savent jamais comment leurs fenêtres parentes ont été créées.

Répondre

0

Je crois que vous devez prendre les mesures suivantes:

  1. Subclass vos contrôles d'édition (et autres contrôles nécessaires).
  2. Capturer le message WM_KEYDOWN dans WndProc de votre contrôle d'édition.
  3. Vérifiez si la touche Maj enfoncée est actuellement détenu vers le bas (en utilisant GetKeyState ou similaire).
  4. Appel GetWindow, en passant dans une poignée à votre contrôle d'édition et soit GW_HWNDPREV ou GW_HWNDNEXT selon que changement est maintenu. Cela vous donnera le handle de la fenêtre qui devrait recevoir le focus.
  5. Appel SetFocus et passer dans la poignée de fenêtre, vous avez à l'étape 4.

Assurez-vous de gérer le cas où vos contrôles d'édition sont multiligne, comme vous voudrez peut-être avoir un vrai caractère de tabulation apparaissent au lieu de déplacer au contrôle suivant.

Espérons que ça aide!

1

C'est vraiment très complexe.

Lorsque vous appuyez sur TAB attention des sauts à un autre contrôle que lorsque ces contrôles appartiennent à une boîte de dialogue Modal. En fait, il existe des boutons comme ESC, GAUCHE, DROITE, BAS, HAUT, TAB dont la fonction de message de dialogue modal traite d'une manière spéciale. Si vous voulez que ces touches se comportent de la même manière avec une boîte de dialogue non modale ou toute autre fenêtre, vous devriez changer votre fonction de traitement des messages et utiliser IsDialogMessage à l'intérieur. Vous trouverez plus d'informations sur IsDialogMessage fonction dans MSDN aussi pour mieux comprendre ce que vous pouvez vérifier aussi bien Dialog Boxes section. Et comme mentionné précédemment, vous devez définir les styles WS_TABSTOP et WS_GROUP en cas de besoin.

Bonne chance!

0

Je crois que vous souffrez d'avoir une instance différente de la VCL dans chacun de vos dll et exe. Les classes de la DLL ne sont pas les mêmes que celles de votre exe, même si elles s'appellent les mêmes. Les variables globales (Application, Screen) ne sont pas partagées entre elles. La mémoire non plus puisqu'ils ont tous deux leur propre gestionnaire de mémoire.

La solution est que les dll et l'exe partagent la bibliothèque VCL et le gestionnaire de mémoire.Je ne suis pas un développeur BCB, mais un développeur Delphi. En Delphi, nous utiliserions simplement le rtl et le vcl en tant que paquets d'exécution. Peut-être que vous pourriez faire l'équivalent BCB.

0

Une DLL possède son propre objet TApplication.

pour assurer une manipulation uniforme des touches. lorsque la DLL charge. affecter la DLL :: TApplication à l'EXE :: TApplication Assurez-vous de faire l'inverse à la sortie.

-

Michael

Questions connexes