2

プロジェクトにコード完了ポップアップウィンドウを実装しようとしています。ウィンドウはフォームから派生しています。これには、UserControlから派生したカスタムリスト(アイコンで完了の可能性を示します)とVScrollBarの2つのコントロールが含まれています。

ポップアップが表示されても、エディターからフォーカスが奪われることはなく(フォームのShowWithoutActivationがオーバーライドされてtrueが返されます)、エディターは特定のキーストロークをポップアップに送信して、ユーザーがキーボードを使用してポップアップを操作できるようにします。これまでのところ、それは魅力のように機能します。

問題は、ユーザーにもマウスを使用できるようにしたいということです。ただし、ユーザーがポップアップウィンドウをクリックすると、そのフォームがアクティブになり、エディターからフォーカスが奪われます。エディターにフォーカスを戻すことでこれに対応できます。これを定期的に実行するタイマーを設定しましたが、解決策が不十分であることを除けば、これが発生するとエディターのタイトルバーが常にちらつきます(ポップアップがクリック)。

フォームをアクティブにしないポップアップフォームを(マウスを使用して)操作する方法はありますか?

ShowWithoutActivationのドキュメントには、「非アクティブ化されたウィンドウでUIコントロールを使用する必要がある場合は、ToolStripDropDownなどのToolStripコントロールの使用を検討する必要があります。これらのコントロールはウィンドウがなく、選択されたときにウィンドウがアクティブ化されることはありません。」これは私が必要としているものとまったく同じように見えますが、カスタムコントロールとスクロールバーを使用したいと思います。

同じ問題は、メソッドのオーバーロード(VSから知られている)を切り替えるためにこれらの2つの矢印を表示するツールチップにもあります-フォーム全体はコントロールをまったく使用しません(テキストと矢印のみをレンダリングします)が、クリックしてもアクティブにはなりません。問題は、「アクティブ化されないが、ユーザーが内部のcertailコントロールを操作できるようにするフォームを作成する方法」に要約できます。

ありがとう。

4

3 に答える 3

0

Just override the onFocus event...

public partial class myListBox:ListBox
{
    protected override void OnGotFocus(EventArgs e)
    {
    }
}
于 2009-09-28T02:33:15.973 に答える
0

問題は、フォームのように独自の UI スレッドで実行されないカスタム コントロールを作成するのではなく、フォームを使用していることです。点滅と強調表示は、フォームがアクティブ化/フォーカスされるたびにウィンドウによって処理されます。私が考える唯一のことは、フォームをボーダレスにし、フォーカスされたときに点滅しない独自のタイトル バーを作成/描画/処理することです。

于 2009-09-30T05:04:59.323 に答える
0

OK、解決策を見つけたかもしれません。キーはWM_MOUSEACTIVATE、ポップアップフォームがインターセプトして応答する必要があるメッセージのようMA_NOACTIVATEです。しかし、落とし穴があります - UserControl から派生したコントロールは、クリックされたときにまだフォーカスを取得します (幸いなことに、スクロールバーはもう取得しません)。問題は、コントロールに内部的にフォーカスを置く UserControl.OnMouseDown メソッドにあるようです。これを修正するには、いくつかの方法があります。

  • UserControl ではなく Control からコントロールを派生させる
  • OnMouseDown メソッドをオーバーライドし、そこで base.OnMouseDown を呼び出さないでください
  • コントロールの CanFocus プロパティが false を返すようにします。

ポップアップ フォームがフォーカスを奪う最後のケースは、サイズ変更 (マウスを使用) が終了したときのようです。ただし、ここでは、Activated イベントの結果として Owner.Activate() を呼び出すのが安全です...

于 2009-10-05T10:18:24.283 に答える