5

私はWin32コントロールに取り組んでいます。このコントロールには何百もの「アイテム」が存在する可能性があります。これらはウィンドウではなく、内部オブジェクト (例: 長方形) です。マウスの位置に応じて、マウスカーソルを変更したい。WM_SETCURSOR を使用できます。

同時に、マウスの動きに基づいて、現在マウスの下にあるオブジェクトの詳細を示すステータス バーを表示したいと考えています。そのために、WM_MOUSEMOVE を使用できます。

何百ものアイテムが存在する可能性があり、マウスの下にあるアイテムを見つけるためにそれらすべてを移動する可能性があるため、特に 2 回 (1 つはカーソルの設定用、もう 1 つはマウスの移動用) は効率的ではありません。

簡単に言うと、WM_SETCURSOR と WM_MOUSEMOVE が常にペアになっていることをご存知ですか? その場合、WM_SETCURSOR 中に必要なものを計算できます。もう1つのオプションは、WM_MOUSEMOVE中にマウスカーソルを設定することですが、私の知る限り、それは良い解決策ではありません(ちらつきます)。

ありがとう

4

4 に答える 4

3

GetMessagePos()また、(カーソル画面の座標を与える)試しMapWindowPoints()てから、それがホット長方形または類似のものであるかどうかを確認することもできます。

于 2011-04-07T10:35:53.760 に答える
2

現在、それらは常に一致するペアとして提供される可能性がありますが、おそらくこの動作に依存することはできません。

WM_MOUSEMOVE 中に (SetCursor を使用して) カーソルを設定でき、(IIRC) 何もせずに WM_SETCURSOR から TRUE を返し (つまり、メッセージを食べて)、ウィンドウにカーソルがない限り、ちらつきません。それに割り当てられたクラスカーソル。

于 2008-10-11T14:42:47.030 に答える
2

何よりも重要なことは、ウィンドウ メッセージ ハンドラーが何かを保持したり計算したりすることを心配してはならないということです。マウスが新しい領域上にある可能性があることをアプリケーションのロジックに通知し、オブジェクトを見つけさせる必要があります。ホット エリア (または複数) を見つけたら、その (それらの) 境界をキャッシュし、それらに対する次のマウスの動きを確認します。それらのいずれかからマウスが移動したら、ホット オブジェクト リストを再構築できます。

マウスを動かすたびに、コントロール全体のホット エリアを探す必要はありません。

同じ領域を共有する多くのオブジェクトが存在する可能性がある場合、z オーダーの問題があります。これらのオブジェクトを作成し、それらの動きを処理するときに考えてください。

また、ホットオブジェクトを探すたびにすべてのオブジェクトをチェックする必要がないように、オブジェクト座標を保持する効率的なデータ構造について考える必要があります。

ちょうど私の2ユーロ。;)

于 2008-10-11T15:49:52.247 に答える
1

見つかった最後のアイテムをキャッシュし、カーソルが同じ場所にある場合はルックアップをショートカットする方法はありますか? それが最も堅牢なソリューションになります。

于 2008-10-11T14:51:26.843 に答える