親ダイアログのホイール操作を子のボタンが取得するには?

解決


こんて  2009-04-27 11:34:38  No: 70073

はじめまして。最近MFCを使い始めたこんてと申します。
経験はCが半年位、MFCが2ヶ月位です。

MFCでサンプルで作成したダイアログ上に、ホイール操作のみを受け付けるボタンを複数配置したいと考えています。
ボタンのクラスを単独で作成して、CWnd::OnMouseWheelでイベントをキャッチするようにしたのですが、その場合は
●一度ボタン位置でクリックしてからでないと、ホイールイベントをボタンが
  受け取る事が出来ない
です。
ダイアログ上をマウスが移動して、ボタン座標内に入ったら、ホイールボタンを押すと即座に反映するようにしたいのですが、どのようにしたら良いのでしょうか。

方針だけで良いので、宜しくお願いします。


ととと  2009-04-27 23:29:28  No: 70074

フォーカスを移さずにホイールを機能させるには?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050118.txt

親ダイアログのPreTranslateMessageにこんな記述を追加してみては

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg) 
{
    switch(pMsg->message){
    case WM_MOUSEWHEEL:
        POINT pos;
        CWnd* pWnd;
        GetCursorPos(&pos);
        pWnd = WindowFromPoint(pos);
        pWnd->SendMessage(WM_MOUSEWHEEL,pMsg->wParam,pMsg->lParam);
        return TRUE;
        break;
    }

  return CDialog::PreTranslateMessage(pMsg);
}


仲澤@失業者  2009-04-28 03:52:52  No: 70075

ととと さんのコードで問題ありませんが、

1.カーソル直下がコンボボックスだとうっとうしい事になる。

という問題が発生しがちです。できたら、

A."button"クラスのみにSendMessage()する
B.かつ、ボタンのIDまで限定すれば、なお良し
C."ComboBox"には送らない

等も検討すると、なお良いかもしれません。


こんて  2009-04-29 10:45:40  No: 70076

ととと様
ありがとうございました!解決しました。
親にC×××::PreTranslateMessage()を追加してイベントをキャッチすれば良かったんですねー。ボタンの方で何とかしなければとハマってました。
WINAPIとMFCの組み合わせ?のような使い方が思いつかなかったので、勉強になります。

仲澤様
アドバイスありがとうございます!
今回はコンボボックスは使用しないですが、参考にさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加