ウィンドウレス コントロールは魔法ではないことを知っています。ウィンドウレス コントロールは、入力フォーカスを持つことができます (例: Internet Explorer)。入力フォーカスは描画にすぎません:
ユーザーがキーを連打し始めると、適切に反応します。コントロールにフォーカスがあるため、キーストロークはそのフォーカスされたコントロールを対象としていることがわかります。
私の (Windows®) ウィンドウの場合、ウィンドウのない子コントロール (TGraphicControl の子孫であるとしましょう) がキーボード イベントを取得することを知っておく必要があります。したがって、フォームのOnKeyDown
, OnChar
,の間OnKeyUp
に、ウィンドウのない子コントロールに移動するふりをする必要があります。
私ができることですが、それは苦痛です。
しかし、その場合、ユーザーはおそらくナビゲーションを使用したいと思うでしょう。Tabそして、Delphi の通常のタブ コントロールの順序処理を何らかの方法でインターセプトし、これがタブ オーダーの次 (および前) であると自分自身にフックする必要があります。
私ができることですが、それは苦痛です。
そして、ActiveControl
以外は何も理解しない がありTWinControl
ます。そのため、Delphi が誰がフォーカスを持っているかを突き止めようとすると、おかしくなってしまいます。したがって、ActiveControl の代替実装が必要になります。
私ができることですが、それは苦痛です。
言い換えれば、これはあまりにも多くの仕事ですか?私は Delphi のすべてと戦っていますが、キーボード入力で数十個のウィンドウレス コントロールにアクセスできるようにするためですか? Delphi の設計者は、対話型のウィンドウレスコントロールを使用することを考えたことはありませんでした。
Delphi は喜んで私を助ける機会を与えてくれましたが、私は痛みの道を選びました。
ウィンドウレス コントロールについては、さらに説明が必要です。
対話するすべてのコントロールが Windows コントロールである必要はありません。Windows ウィンドウではないコントロールにフォーカスし、キーボード入力を送信することは十分に可能です。
たとえば、Internet Explorer ブラウザー ウィンドウに表示されるほとんどすべてのコントロールは、ウィンドウのないコントロールです。次のスクリーンショットでは、入力できる編集コントロールと、(このスクリーンショットでは) フォーカスのあるボタンを確認できます。
点線のフォーカス四角形が表示され、ボタンは青みがかっています (Windows では、フォーカスがあることを示します)。
ボタンにフォーカスがあるときに押すとSpacebar、ボタンが押されます。これが機能する理由は、Microsoft がコントロールのウィジェット ライブラリ全体を作成したためです。これらのコントロールのルック アンド フィールは、通常のコモン コントロールと (ほぼ) まったく同じです。適用されるテーマに至るまで、Windows コモン コントロールのほぼ正確なクローンです。Google Search
Mozilla Firefox と Google Chrome も、コントロールのウィジェット ライブラリを使用します。Microsoft の組み込みのウィンドウ コントロールは使用せず、代わりにグラフィカルでインタラクティブなウィンドウレスウィジェットのライブラリを使用します。
また、適切な開発環境があれば、ウィンドウのないウィジェットは「通常の」ウィンドウ コントロールと同じように機能します。GTK+ はウィジェット ライブラリであり、Glade はそのウィジェット ライブラリでコントロールをレイアウトできる IDE です。
Firefox、Chrome、Blender がどの開発環境で作成されたかはわかりませんが、それらのウィジェットはウィンドウレス コントロールをサポートしています。
それでは、私の質問に移ります。
私が間違っていない限り、Delphi はベースTControl
(幅、高さを持ち、それ自体をペイントできる) をサポートしていますが、キーボード フォーカスを受け取ることができないようです。Borland が Delphi の VCL を汎用ウィジェット ライブラリとして設計したことはないように思えます。これをサポートする唯一の証拠は、フォームActiveControl
が TWinControl であることです。
property ActiveControl: TWinControl;
これは、Delphi がウィンドウ コントロールに限定される可能性がある、または限定されなければならないという意味ではありません。VCL ウィジェット ライブラリは、ウィンドウのないコントロールにフォーカスを与えることをサポートするように拡張できます。
しかし、おそらくDelphi はすでに windowless controls をサポートしていますが、私はそれを認識していませんか? にフォーカスを与えることをサポートするために、Delphi にはすでに確立されたメカニズムがありTControl
ますか? しかし、私はそれなりに賢い人間であり、Delphi の VCL は他のウィジェット ライブラリでできることを実行できないと確信しています。
これは別の質問につながります:フォームをサブクラス化し、それをサポートするためにどれだけの作業が必要になるでしょうか? チームBの誰かで、私よりずっと賢く、すでにそれを試して、不可能であるという結論に達した人はいますか?
ウィンドウレス コントロールのサポートを追加しようとするのが不可能に近い場合 (つまり、無駄な場合)、何週間も無駄に費やさないように、今、前もって質問しています。Delphi 開発者のコミュニティの知識を利用しようとしています。
私は質問をしています。