8

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 を受信したときに非アクティブ化/再アクティブ化できるようにします。

内部動作の変更は、ハイパーリンクなどのツールヒントの新しい「クリック可能な」機能に対応するためだったと思いますが、ホバー動作は壊れているようです。

サブクラスの回避策よりも優れた解決策を知っている人はいますか? 私は他の点を見逃していますか?

4

2 に答える 2

1

これらの DLL 間のツールチップで互換性の問題に遭遇したのは、あなただけではありません。

私も、テーマ設定可能な共通コントロールの新しいツールチップに問題がありました。マニフェストを追加してアプリケーションのテーマを設定する前に、既にマウス メッセージを使ってヒントを有効/無効にしています。

私たちはまだ、マウスが動いている間 (ホバリング時だけでなく) TTN_NEEDTEXT メッセージが常に送信される問題、大きなヒントによる配置の問題 (おそらく新しいものではない)、ANSI バージョンの代わりに奇妙な Unicode メッセージが送信される問題 (私がいつか質問として投稿する予定です)。

于 2008-09-09T13:21:41.823 に答える
0

わかりませんが、これは本当に「難しい」問題のように思えます (すべての現実世界の問題は本当に難しいという意味で)。根本的な問題は、フォーカスの設定に関係していると思います。手動でそれを行う Windows は悪であり、一般的にあらゆる種類のバグに悩まされています。

于 2008-09-09T07:23:15.677 に答える