2012-01-31 4 views
-1

まず、他の記事の記事を読んだことがあります(私はあなたの "似たような質問のタイトル" - ウィンドウ)が好きです。それを行う方法。ウインドウコントロールでマウスの動きを取得する簡単な方法ウインドウコントロールでサブクラス化するより

問題:追跡involes効果や他のanythingsを使用する場合は、WinAPIのはappearantly ボタン、編集と多分他のすべてのコモンコントロールが親を扱うにWM_MOUSEMOVEを渡さないことを決めました。たとえば、ユーザーがボタンに長すぎて(実際に移動する)、イベントが誤って()トリガーされた場合、これは不合理になります。

最初の質問:これを解決するにはどうすればよいですか?

回答1:サブクラス化。かなり便利で安全ですが、しばらくする必要がありますので、今はスキップしてください。

回答2: TrackMouseEvent + "if-conditioning" - >速度が遅く、確かに非常に複雑になることがあります。

NoGo:ボタンのBS_NOTIFYとして通知フラグを使用すると、マウスのクリックやフォーカスに注意するため、機能しません。

質問:他のアイデア? Windows 7はそれを「ひそかに」紹介しているのでしょうか、それとも簡単に対処するトリックを知っているプログラマーもいますか?

注:私は誰かを悩ませたくありません。私は不必要に多くのコードを追加する前に尋ねたいだけです。

+0

この質問は非常に悪いです。私はSetCapture()が解決策だと思っていますが、それは伝えにくいです。 –

答えて

0

Subclassingこれははるかに簡単なオプションです。より簡単なオプションを探しているなら、見つけられません。リンクで示されているように、コードの量はごくわずかですが、すでに問題を解決することができます。親ハンドルがウィンドウ階層の上にWM_MOUSEMOVEメッセージを渡すような機能を持たせたい場合は、単純にサブクラス化し、そのメッセージを処理するときに親にパラメータを転送します。

私はあなたが何を意味するかについては、しかし少しは不明だ:例えば

- ボタンを長すぎる(実際に動く)にとどまり、イベントが意図せずにがトリガされます。例えば

LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, 
           LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) 
{ 
    switch (uMsg) 
    { 
    case WM_MOUSEMOVE: 
     SendMessage((HWND)dwRefData, uMsg, wParam, lParam); 
    } 

    return DefSubclassProc(hWnd, uMsg, wParam, lParam); 
} 

これは、あなたがdwRefData下の親HWNDに合格したことを想定しています。

関連する問題