2

プロパティが設定された階層的な flexgridコントロールがあり、ソースから実行すると、ツールチップが正しく表示されます。ToolTipTextしかし、コンパイルしてそのように実行すると、ツールチップは表示されません。

MouseMoveそれが修正されることを期待して、リッスンしているものをすべて削除しようとしましたが、ツールチップ テキストをメッセージ ボックスに配置するコードを追加すると、正しく設定されているように見えます。なぜこれが起こるのか誰にも考えられますか?


更新: 別のユーザー コントロール内でグリッドをホストすると、問題が発生するようです。例: 単なる空のコントロールですが、ControlContainer = True の container.ctl を作成します。次に、container.ctl 内の mshfg である gridholder.ctl を作成します。最後に、gridholder.ctl を何らかの形で埋め込みます。FlexGrid のツールチップが表示されないようです。

これがどこまで再現性があるのか​​興味津々…

4

2 に答える 2

2

この問題の回避策はまだ見つかっていませんが、WinDBG でいくつかの VB6 ランタイム コードをテストしてステップ実行した後、なぜこの問題が発生するのかがよくわかりました。

最初の興味深い点は、VB6 が Windows によって提供される標準のツールチップ表示メカニズムを使用しないことです。たとえば、WM_NOTIFYメッセージを使用してツールヒントを表示/非表示にしたり、Windows でツールヒントがどのように機能するかを説明するドキュメントに記載されているその他の "標準" ツールヒント サポートを使用しません。

代わりに、VB6 ランタイムには、ツールチップを管理および表示する独自の方法があります。原則として、ツールチップを処理する標準的な Windows の方法といくつかの点で似ていますが、かなりの部分で異なっています。

VB6 がツールチップを行う方法の内訳:

  • VB6 プログラムが起動すると、ランタイムはSetWindowsHookExを使用して、プログラムのメイン スレッドにマウス フックをインストールします。

  • マウス フックは、プログラムに送信されるすべてのマウス メッセージ、特にすべてのWM_MOUSEMOUSEメッセージをインターセプトします。

  • マウス フックが実行されるたびに、VB6 ランタイムの内部メソッドを呼び出して、現在マウスが置かれているコントロールのオブジェクト ポインター (HCTL) を取得します。これは、ウィンドウ ハンドルではなく、実際の COM インターフェイス ポインターであることに注意してください。

  • HCTL を対応するウィンドウ ハンドル (HWND) に変換します。

  • マウスの位置がそのウィンドウの四角形内にあるかどうかを確認します。

  • その場合、コントロールのToolTipTextプロパティを取得します。これが空でない場合、ツールチップ ウィンドウが作成され、700 ミリ秒の遅延後にツールチップが表示されます。

MSHFlexGrid (および、標準の VB6 コントロールではない他のコントロールもあると思います) の問題は、カスタム コンテナー内にあるコントロールの上にカーソルを置いたときに、このコードが正しい HCTL を取得しないことです。

その場合、コードは、MSHFlexGrid 自体の HCTL ではなく、カスタム コンテナーの HCTL を取得します。したがって、グリッドのToolTipTextではなく、コンテナーのToolTipTextプロパティ (空) を取得するため、ツールヒントは表示されません。

質問のコメントに記載されているように、コンテナとしてPictureBoxを使用すると、これらすべてが正しく機能するため、なぜこれが行われるのか正確にはわかりません。

PictureBoxには、独自のコンテナーを作成するときに含まれていない、これを正しく処理するためのコードがあると思われます。

実際の回避策が見つかった場合は、この回答を更新します。私が今考えることができる唯一のことは、コンテナのToolTipTextプロパティをグリッドのToolTipTextプロパティと何らかの形で「同期」して、VB6 がコンテナのToolTipTextを要求したときに、代わりにグリッドのToolTextTipプロパティの値を返すようにすることです。

ただし、ToolTipTextは拡張プロパティであり、拡張プロパティは自分で記述した同じ名前のプロパティよりも優先されるため、これは言うは易く行うは難しです。

于 2012-03-13T04:38:18.210 に答える
0

少し調べたところ、根本的な問題と思われるものが見つかりました。ユーザー コントロールは、コントロールが対話するためのメソッドを実装していません。コンテナ コントロールであるユーザー コントロールは、Extender 機能を実装する必要があります。これらの 2 つのリンクは、これまでにこの件に関して見つけた中で最高のものです。

http://www.justvb.net/obook/ch7.htm#UsingtheExtenderObject

http://msdn.microsoft.com/en-us/library/aa733622(v=vs.60).aspx

于 2012-03-02T02:31:12.350 に答える