Was ist die richtige, moderne Methode, um willkürliche Texteingaben in einem benutzerdefinierten Steuerelement unter Windows zu verarbeiten? WM_CHAR? IMM? TSF?
Ich möchte in der Lage sein, Texteingaben in einem benutzerdefinierten Windows-Steuerelement zu unterstützen, genau wie dies bei den Steuerelementen EDIT und Rich Edit bereits der Fall ist, aber keine der beiden Unterklassen. Das Steuerelement verwendet derzeit Direct2D und DirectWrite zum Zeichnen von Text und wird unter Windows Vista SP1 mit Platform Update oder neuer ausgeführt (möglicherweise wird es mit Platform Update oder neuer auf Windows 7 SP1 geändert, wenn ich neuere Direct2D- und DirectWrite-Funktionen benötige, sofern dies der Fall ist nur dort oder unter Windows 8 verfügbar, aber das ist eine andere Frage ...)
Für was es wert ist, würde ich unter OS X @ verwend NSTextInputClient und auf GTK + würde ich @ verwend GtkIMContext. Es sind solche Dinge, über die ich spreche.
Die naheliegende Wahl istWM_CHAR
, was, wenn ich es richtig zusammenstelle, nativ UTF-16 ist, wenn die Fensterklasse mit @ registriert iRegisterClassW()
, und sollte daher "nur funktionieren", unabhängig vom Standort. Jedoch,WM_CHAR
wird generiert vonTranslateMessage()
, undseine Dokumentation sagt, es gibt keine Möglichkeit festzustellen, ob einWM_CHAR
wurde generiert oder nicht, seitTranslateMessage()
gibt immer ungleich Null zurück. Ich muss in der Lage sein zu bestimmen, ob die aktuelle Tastaturnachricht vom Textsystem verarbeitet wird (und daher ignoriert werden sollte). Dies gilt insbesondere, da alle Nicht-Text-Schlüssel layoutunabhängig behandelt werden müssen (was ich bereits habe).
Ich habe auch im Windows 7-Beispielcode sowohl für die IMM-API als auch für das Text Services Framework gesehen. Ich bin mir nicht sicher, ob einer besser ist als der andere, und beide scheinen dasselbe zu tun. Tun sie
Im Fall von IMM gibt es eine Reihe vonWM_IMM_xxx
-Nachrichten, bei denen ich nicht sicher bin, ob ich sie ignorieren soll oder nicht, und jeder Hinweis, den ich gefunden habe, scheint nicht zu stimmen, ob ich sie in einem Unicode-Fenster behandeln soll oder nicht ... Auch das obige Problem, zu wissen, ob Ein bestimmtes Schlüsselereignis wird vom IMM behandelt oder ist noch nicht geöffnet. gibt es einen Weg
TSF hat ein Konzept namens ACP, mit dem ich anscheinend jedes beliebige Textspeicherformat zum Speichern des Texts verwenden kann, den ich tatsächlich verwenden werde (dh keine in Bearbeitung befindliche Komposition). Ist das wahr? Ich möchte meinen Text als UTF-8 mit Attributen speichern und beim Zeichnen in UTF-16 konvertieren können (für DirectWrite). Lassen mich auch die anderen API-Optionen dies tun?
Oder bin ich komplett auf dem falschen Weg?
nd wie würde i opt i da Bildschirmtastatu sobald ich das alles mache?
Weitere Referenzen, die ich verwendet habe:
http: //www.catch22.net/tuts/unicode-text-editinVielen Dank
AKTUALISIERE 7 Nov 2016
Nach dem erneuten Betrachten des TsfPad-Beispiels stelle ich fest, dass es auch nur @ zu verwenden scheinWM_CHAR
; jetzt bin ich mir nicht sicher, wie es überhaupt TSF verwendet, ansonsten macht es ...