1

アプリケーションが一連のプラグイン DLL をロードし、新しいウィンドウを作成して、この新しいウィンドウのハンドルをプラグインに渡すプラグイン フレームワークを作成しています。プラグインは、このハンドルを使用して独自の GUI を作成できます。

すべてが非常にうまく機能しているようです。唯一の問題は、プラグイン ウィジェット (たとえば、編集ボックス) で TAB を押しても、別のウィジェットにジャンプしないことです。Windows メッセージには渡されるものと渡されないものがあることがわかりました。エディットボックスで入力できるため、WM_KEYDOWN は他のキーに渡されますが、このメッセージは TAB キーを処理しません。

誰かがヒントを持っていることを願っています。

私は CBuilder で Borland VCL を使用していますが、親ウィンドウがどのように作成されたかがわからないため、WIN32 の下の任意のフレームワークを使用してこれらのプラグインを作成できると思います。

4

4 に答える 4

1

それは確かに非常に複雑な問題です。

TAB を押すと、これらのコントロールがモーダル ダイアログ ボックスに属している場合にのみ、フォーカスが別のコントロールにジャンプします。実際、ESC、LEFT、RIGHT、DOWN、UP、TAB など、モーダル ダイアログ メッセージ関数が特別な方法で扱うボタンがいくつかあります。これらのキーをモードレス ダイアログ ボックスまたはその他のウィンドウで同様に動作させたい場合は、メッセージ処理関数を変更し、内部で IsDialogMessage を使用する必要があります。MSDN のIsDialogMessage関数の詳細については、ダイアログ ボックスセクションも参照してください。

また、前述のように、必要に応じてWS_TABSTOPおよびWS_GROUPスタイルを設定する必要があります。

幸運を!

于 2008-08-19T12:36:47.977 に答える
0

次の手順を実行する必要があると思います。

  1. 編集コントロール(および必要に応じて他のコントロール)をサブクラス化します。
  2. エディットコントロールのWndProcでWM_KEYDOWNメッセージをキャプチャします。
  3. Shiftキーが現在押されているかどうかを確認します(GetKeyStateなどを使用)。
  4. GetWindowを呼び出し、ハンドルをエディットコントロールに渡し、Shiftキーを押したままにするかどうかに応じてGW_HWNDPREVまたはGW_HWNDNEXTのいずれかを渡します。これにより、フォーカスを受け取る必要があるウィンドウへのハンドルが提供されます。
  5. SetFocusを呼び出し、手順4で取得したウィンドウハンドルを渡します。

次のコントロールに移動するのではなく、実際のタブ文字を表示したい場合があるため、編集コントロールが複数行の場合を必ず処理してください。

お役に立てば幸いです。

于 2008-08-19T00:52:48.897 に答える
0

dll と exe のそれぞれに VCL の異なるインスタンスがあることに苦しんでいると思います。dll のクラスは、同じ名前であっても、exe のクラスと同じではありません。また、グローバル変数 (Application、Screen) はそれらの間で共有されません。どちらも独自のメモリマネージャーを持っているため、メモリもそうではありません。

解決策は、dll と exe で VCL ライブラリとメモリ マネージャーを共有することです。私は BCB 開発者ではなく、Delphi 開発者です。Delphi では、ランタイム パッケージとして rtl と vcl を使用します。たぶん、BCBに相当することができます。

于 2008-08-27T12:18:22.457 に答える
0

DLL には独自の TApplication オブジェクトがあります。

均一なキー処理を提供します。DLL のロード時。DLL::TApplication を EXE::TApplication に割り当てます。必ず終了時に逆を行ってください。

--

マイケル

于 2009-01-24T17:58:06.570 に答える