2009-07-11 5 views
0

私はWM_NCMOUSELEAVEに関する問題に出会ったばかりです。WM_NCMOUSELEAVEを作成した後、常にWM_NCMOUSELEAVEをウィンドウに送信するのはなぜですか?

ウィンドウが作成されたら、キャプションの上にカーソルを移動すると、WM_NCMOUSELEAVEがそのウィンドウに送信されることに気付きました。 TrackMouseEvent()の呼び出しはありません。

私はMSDNを読んだが、手がかりを得ていない。 :(

はあなたのアドバイスをありがとうございました。

答えて

1

それが実際に作成後すぐに送信されていないが、ウィンドウが定義された非クライアント領域を持っている場合は、作成後、いつでも受信することができます。Windowsの二つの主要な領域を有し、クライアントと非クライアント非クライアント領域はウィンドウの外側境界/マージンであり、クライアント領域はウィンドウの「ボディ」とみなすことができます。これは最も多くのアクティビティを得る領域ですもちろん、時には、他のパーティーが非クライアント領域を持たないコントロールを作成し、それでも自分のボーダーやその他の詳細を表示することもあります。

ほぼすべての株価コントロール(Common Control LibraryとMicrosoftが公開している他のウィンドウベースのコントロールのいずれか)では、以下の領域は非クライアント領域として扱われます。

  • キャプションキャプション詳細
  • システムメニュー/最小化/最大化/閉じる国境 NCが付いている

メッセージは、ウィンドウの非クライアント領域で発生したイベントを表します。接頭辞の付いていないメッセージはクライアント領域にあります。

とにかく、特定のウィンドウでマウスイベントを追跡する機能があると思います。ウィンドウの非クライアント領域(ドラッグまたはホバー操作など)上の動きを追跡する必要がある場合は、マウス追跡に次のメッセージを追加することをお勧めします。

  • WM_NCMOUSEMOVE

(マウスの位置は、非クライアント領域に変化した)

  • WM_NCLBUTTONDBLCLK
  • WM_NCLBUTTONDOWN
  • WM_NCLBUTTONUP

(非クライアント領域の左ボタンアクション)

  • WM_NCMBUTTONDBLCLK
  • WM_NCMBUTTONDOWN
  • WM_NCMBUTTONUP

(非クライアント領域の中央ボタンアクション)

  • WM_NCRBUTTONDBLCLK
  • WM_NCRBUTTONDOWN
  • またWM_NCRBUTTONUP

(非クライアント領域の右ボタンアクション)

、あなたのアプリケーションに応じて、以下のメッセージが同様に関心をすることができます。

  • WM_NCACTIVATE

(ウィンドウの活性化はユーザアクションによって変更されており、非クライアント領域を更新する必要がある)

  • WM_NCHITTEST

(ウィンドウマネージャがしたいですクライアント以外の領域がマウスの活動を追跡しているかどうかを知る)

  • WM_NCPAINT

(非クライアント領域を再描画する必要がある)

非クライアント領域の視覚的な程度を決定するために有用なトリックWM_NCPAINTメッセージを傍受し、単に非塗装しますあなたの選択した色(赤色/ピンク色、または他の色が目立ちます)のクライアント領域。これは、複数のウィンドウが互いに隣接していて、シームレスに見えるクライアント以外の領域がある状況をデバッグする場合に便利です。

最後に、非クライアント領域の動作を調べる価値のあるデモソースコードを持つリンクを示します。

Customizing the Non-client Area from CodeProject (VB)

+0

は^ _^ ご回答いただきありがとうございますしかし、それは私の質問のために非常に有用ではありません:( 、私の問題は、私は、ウィンドウを作成し、ある、と私はいくつかの理由でWM_NCMOUSELEAVEを追跡しますしかし、私はWM_NCMOUSELEAVEハンドラをWINPROCに追加しますが、WM_NCMOUSELEAVEを追跡するためにTrackMouseEvent()を呼び出す前に、ウィンドウを作成した後、カーソルを非クライアント領域に移動すると、WINPROCはWM_NCMOUSELEAVEを 私は質問を投稿します。メッセージを防ぐためにTrackMouseEventをTME_CANCELで呼び出そうとしましたが、動作しません。 私のシステムはsp3のWINXPです。 – cyberscorpio

+0

いつTrackMouseEvent()を呼び出していますか? MSDNのドキュメントによると、マウスが呼び出された時点で関連するウィンドウ領域にない場合、メッセージは一度ポストして終了します。 WndProcにWM_NCMOUSEMOVEのハンドラを追加し、TrackMouseEvent()がまだアクティブでない場合は、そこにコールを設定してみてください。 WM_NCMOUSELEAVE通知を受け取ったら、次のWM_NCMOUSEMOVEメッセージで再度呼び出す必要があります。 – meklarian

+0

TrackMouseEvent()のリンクは次のとおりです。 http://msdn.microsoft.com/en-us/library/ms646265(VS.85).aspx – meklarian

関連する問題