2008-08-18 7 views
1

Ich erstelle ein Plugin-Framework, wo meine Anwendung eine Reihe von Plugin-DLLs lädt, erstellt dann ein neues Fenster und übergeben Sie den neuen Fenstergriff an das Plugin. Das Plugin kann dann dieses Handle verwenden, um eine eigene GUI zu erstellen.DLL-Plugin, das ein Parented-Fenster erstellt, behandelt Nachrichten nicht korrekt

Alles scheint sehr gut zu funktionieren. Das einzige Problem ist, dass wenn ich TAB auf einem Plugin-Widget (zum Beispiel einem Editbox) drücke, es nicht zu einem anderen Widget springt. Ich habe herausgefunden, dass einige Windows-Nachrichten übergeben werden und einige andere nicht. Das WM_KEYDOWN wird für andere Schlüssel übergeben, da ich in dem Bearbeitungsfeld eingeben kann, aber diese Nachricht behandelt nicht TAB-Schlüssel.

Hoffe jemand hat einen Hinweis.

Ich benutze Borland VCL mit CBuilder, aber ich denke, ich könnte jedes Framework unter WIN32 verwenden, um diese Plugins zu erstellen, da sie nie wissen, wie ihre übergeordneten Fenster erstellt wurden.

Antwort

0

Ich glaube, Sie werden die folgenden Maßnahmen zu ergreifen haben:

  1. Subclass Ihr Edit-Steuerelemente (und andere Kontrollen nach Bedarf).
  2. Erfassen Sie die Nachricht WM_KEYDOWN in WndProc Ihres Bearbeitungssteuerelements.
  3. Überprüfen Sie, ob die Umschalttaste momentan gedrückt gehalten wird (GetKeyState o.ä.).
  4. Rufen Sie GetWindow an, übergeben Sie ein Handle an Ihr Bearbeitungssteuerelement und entweder GW_HWNDPREV oder GW_HWNDNEXT, je nachdem, ob die Verschiebung gedrückt gehalten wird. Dadurch erhalten Sie den Punkt für das Fenster, das den Fokus erhalten soll.
  5. Anruf SetFocus und übergeben Sie im Fenstergriff Sie in Schritt bekam 4.

Achten Sie darauf, den Fall behandeln, wo Ihre Bearbeitungssteuer mehrzeilige sind, wie Sie eine echte Tab-Zeichen haben möchten erscheinen statt sich zu bewegen zum nächsten Steuerelement.

Hoffe, dass hilft!

1

Es ist in der Tat sehr komplexe Angelegenheit.

Wenn Sie auf TAB drücken, springt der Fokus nur dann zu einem anderen Steuerelement, wenn diese Steuerelemente zu einem Modal-Dialogfeld gehören. In der Tat gibt es einige Tasten wie ESC, LINKS, RECHTS, DOWN, UP, TAB, die modalen Dialog Nachricht Funktion auf besondere Weise behandelt. Wenn Sie möchten, dass sich diese Schlüssel in ähnlicher Weise mit dem modalen Dialogfeld oder einem anderen Fenster verhalten, sollten Sie Ihre Nachrichtenverarbeitungsfunktion ändern und IsDialogMessage verwenden. Sie finden weitere Informationen über IsDialogMessage Funktion in MSDN auch um diese Dinge besser zu verstehen, die Sie auch überprüfen können Dialog Boxes Abschnitt.

Und wie bereits erwähnt, sollten Sie bei Bedarf WS_TABSTOP und WS_GROUP Stile festlegen.

Viel Glück!

0

Ich glaube, Sie leiden unter einer anderen Instanz der VCL in jeder Ihrer dlls und exes. Klassen aus der DLL sind nicht die gleichen wie die aus Ihrer EXE, auch wenn sie gleich heißen. Auch globale Variablen (Anwendung, Bildschirm) werden nicht zwischen ihnen geteilt. Auch die Erinnerung ist nicht vorhanden, da beide ihren eigenen Speichermanager haben.

Die Lösung besteht darin, die DLLs und die EXE die VCL-Bibliothek und den Speichermanager zu teilen.Ich bin kein BCB-Entwickler, sondern ein Delphi-Entwickler. In Delphi würden wir einfach rtl und vcl als Laufzeitpakete verwenden. Vielleicht könntest du das BCB-Äquivalent machen.

0

Eine DLL hat ein eigenes TApplication-Objekt.

, um eine einheitliche Schlüsselbehandlung zu ermöglichen. wenn die DLL geladen wird. weisen Sie die DLL :: TApplication der EXE :: TApplication zu Achten Sie darauf, das Reverse beim Beenden zu tun.

-

Michael