ToolTipウィンドウを作成し、フラグ TTF_IDISHWND | を使用してツールを追加しています。TTF_SUBCLASS。(c++、win32)
プログラムが新しい WindowsXP テーマ (comctrl32 バージョン 6) を使用するようなマニフェスト ファイルがあります。
登録済みのツールにカーソルを合わせると、ヒントが表示されます。
良い。
マウスをクリックすると、先端が消えます。
Ok。
ただし、ツールから離れて戻っても、先端は再表示されません。別のツールにカーソルを合わせてからツールに戻って、ヒントを表示する必要があります。
マニフェスト ファイルを削除すると (XP 以外の古い comctrl32 を使用するため)、問題は解決します。
いくつかの実験を行った後、Comctl32 バージョン 5 (古い) と Comctl32 バージョン 6 (新しい) のツールチップの間に次の違いがあることを発見しました。
新しい TTF_TRANSPARENT ツールチップ (インプレースで使用した場合) は、マウス ボタンが押されている場合、実際には WM_NCITTEST から HTCLIENT を返します。これにより、アプリケーションの境界線が点滅します。
古い TTF_TRANSPARENT ツールチップは、常に WM_NCHITTEST から HTTRANSPARENT を返すため、WM_LBUTTONDOWN 自体を取得したり、フォーカスを盗んだりすることはありません。(これは単なる美学のようですが、次のポイントに影響を与える可能性があります...)
新しいツールチップは、マウス クリック後に WM_TIMER イベントを取得しないようで、非アクティブ化および再アクティブ化された後にのみ (一連の) タイマー イベントの取得を再開します。したがって、マウスをクリックして離した後、ヒントウィンドウを再表示しません。
古いツールチップは、クリック/リリース後にマウスが再び動かされるとすぐに WM_TIMER メッセージを受け取るので、チップを再表示する準備ができています。
したがって、comctl32 の回避策として、次のことを行う必要がありました。
TOOLTIPS_CLASS ウィンドウをサブクラス化し、ツールが透明性を要求した場合は常に WM_NCHITTEST から HTTRANSPARENT を返します。
TTF_SUBCLASS の使用を避け、マウス メッセージを自分で処理して、WM_xBUTTONUP を受信したときに非アクティブ化/再アクティブ化できるようにします。
内部動作の変更は、ハイパーリンクなどのツールヒントの新しい「クリック可能な」機能に対応するためだったと思いますが、ホバー動作は壊れているようです。
サブクラスの回避策よりも優れた解決策を知っている人はいますか? 私は他の点を見逃していますか?