1

現在、HaxeUI ライブラリを使用するアプリケーションに取り組んでいます。私のアプリケーションではTextInput、OpenFL の に基づいたオブジェクトを作成していますTextFieldCtrl残念ながら、Windows や Neko 用にコンパイルする場合、これらのフィールドでは+ VCtrl+ CCtrl+などの基本機能を使用できませんA

その結果、単にイベントをTextInput使用してこれらの特定の機能を検出するクラスの独自の拡張を作成できると感じました。KeyboardEvent.KEY_DOWN以下は、私の実装の関連するスニペットです。

class SmartTextInput extends TextInput {
    public function new() {
        super();
        this.addEventListener(KeyboardEvent.KEY_DOWN, performPress);
    }

    private function performPress(e:KeyboardEvent):Void {
        if(e.ctrlKey) {
            trace("CTRL PRESSED!");
            switch(e.keyCode) {
                case Keyboard.V: trace("PASTE!");
            }
        }
    }
}

と を押すCtrlV、 と が印刷され"CTRL PRESSED!"ます"PASTE!"。ただし、私は しか得られ"CTRL PRESSED!"ないので、うまくいきません。実際、いくつかの精力的なテストの後、Ctrlボタンが押されていると、とキーKeyboardEvent.KEY_DOWN以外のキー押下が登録されないことがわかりました。つまり、 を最初に押さない限り、検出と保持を同時に行うことはできません。ただし、従来は最初に押すので、これはうまくいきません。AltShiftCtrlV VCtrl

Ctrl+VのようなアクションTextFieldを OpenFL for Windows に登録する方法はありますか? または、少なくとも、 の連続したキーの押下を検出する方法はありCtrlますVか? CtrlonKEY_DOWNVonをつけてみましKEY_UPたが、実用に耐えるほどの反応はありません。

OpenFL 3.6.0、Lime 2.9.0、および HaxeUI 1.8.17 を使用しています。HaxeUI には OpenFL Legacy が必要であることに注意してください。非レガシー OpenFL では、Ctrl+をV問題なく動作させることができました。

4

2 に答える 2

1

これが、次に OpenFL を作成した理由です。レガシーでこれらのキー押下を検出することが不可能か、または簡単ではないかどうかはわかりませんが、次に機能するようになったので、この時点で機能が追加されることは非常に疑わしいです。

つまり、「OpenFL はレガシー コードベースに追加されますか?」というようなものです。「HaxeUI の次のメジャー バージョンはいつリリースされますか?」next の TextFields には十分な問題があり、おそらくレガシーの長年の問題も解決しないでしょう。そして、最終的には新しい HaxeUI が登場します。

だから... いいえ、できません。まだ。

于 2016-04-09T23:44:38.533 に答える
0

よく考えてみると、回避策として KEY_UP を使用した場合の応答性の欠如は、V の前に CTRL を解放した結果であることに気付きました。通常のアプリケーションでは、キー ダウン時に貼り付けアクションが発生するため、これが可能です。

これを回避するために、CTRL のリリースに遅延を適用しました。

class SmartTextInput extends TextInput {
    public function new() {
        super();
        ctrlDown = false;
        this.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
        this.addEventListener(KeyboardEvent.KEY_UP, keyUp);
    }

    private static inline var CTRL_SENSITIVITY = 100;
    private var ctrlDown:Bool;

    private function keyDown(e:KeyboardEvent):Void {
        if (e.keyCode == Keyboard.CONTROL || e.keyCode == Keyboard.COMMAND)
            ctrlDown = true;
    }

    private function keyUp(e:KeyboardEvent):Void {
        if (e.keyCode == Keyboard.CONTROL || e.keyCode == Keyboard.COMMAND)
        //  The delay here is for people who release control before releasing the letter key
            Timer.delay(function() {  ctrlDown = false; }, CTRL_SENSITIVITY);
        if (ctrlDown) {
            switch(e.keyCode) {
                case Keyboard.C: copy();
                case Keyboard.V: paste();
            }
        }
    }
}

最適ではありませんが、これで十分に機能しているようです。

于 2016-04-10T23:59:36.077 に答える