OnMouseWheelが呼ばれない

[戻る]
Tonny 2003/09/18(木) 21:39:14
こんばんは。Tonnyといいます。win2000sp3 VC++6 sp5 MFCです。

MFCのSDI(ドキュメントなし)で作業してます。
C**Viewを複数(4つ)用意するプログラムを作っています。
4つはC**View(ドキュメントなしなので、CWndの派生クラス)から派生させて、
個別の処理はオーバーライドさせてます。

CMainFrameのm_wndViewをポインタにして、その時々で、delete、new、Createにて
切り換えています。(キャストはしています)

ほとんどの処理は思った通りに動くのですが、OnMouseWheelだけうまく動きません。
具体的には、最初のViewではうまくいくのですが、一度でもViewを切り換えると、
OnMouseWheel自体が呼ばれなくなってしまいます。(OnMouseWheelの中にブレークポイント
を立てても止まりません。)
OnMouseWheel自体をオーバーライドしているのではないので、呼ばれて当然だと
思いますし、実際OnLButtonDownやOnLButtonDblClkはちゃんと呼ばれているのですが...

OnVScrollも想定通り、機能しています。が、少し気になったのは、OnVScroll関係を書けば、
OnMouseWheelなんか実装しなくてもスクロールしたような...
(以前ダイアログにCWndを貼り付けた時はそうでした。)

思いっきりMFCな内容ですが、どなたか対処法などご存知の方いらっしゃいませんか。

ボルシチ 2003/09/20(土) 16:06:21
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassonmouse
wheeltopic.asp
ここ嫁

2003/09/21(日) 20:05:23
ここ嫁んでも分からないから聞いているに決まっているじゃん。

馬鹿じゃないのー>ボケシチ

2003/09/21(日) 22:28:36
スマン->ボルシチさん

Tonny 2003/09/22(月) 06:31:09
。は私ではありません。(念のため)

http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassonmouse
wheeltopic.asp
このままコピペしてもMSDNのページにしかいけなくて、

http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsform
scontrolclassonmousewheeltopic.asp
なんて変えても"ページが見つかりませんでした。"にしかならなくて
書かれている内容からは、親切で教えていただいているのか、からかわれているのか
わからなかったんで、レス付けづらかったんです。

茶化すような表現ですとやはり無視せざるを得ません。親切で教えていただいているの
でしたら、キーワード等でお教え願えませんでしょうか。

FAY 2003/09/22(月) 08:43:38
ボルシチさんの言われてるURLの
改行されてるところつなげてみて。
表示されるから。

Tonny 2003/09/22(月) 09:53:00
FAYさんレスありがとうございます。
Control.OnMouseWheel メソッドにたどり着けました。

.NETだとMouseEventArgs クラスとかあるんですね。
ソースを見ていて、
"ふむふむ、ヘッダファイルは使わないで、dllで呼び込む(登録?)のね。"
"ネームスペースいっぱい使うんだなあ。"
"newはしているけどガベージコレクションっぽいのかな。"
なんて読みいっちゃたんですが、環境が違うので質問に関しては参考になりませんでした。

質問に関しては、
>CMainFrameのm_wndViewをポインタにして、その時々で、delete、new、Createにて
>切り換えています。(キャストはしています)
の部分に問題があるのかと思って、スクロールするビューを別に用意して、
m_wndViewと新しく作ったm_scrollView(こっちはポインタでなくメンバオブジェクト)
とを切り換えて表しさせたりしたんですが、現象は同じです。

void CMainFrame::ChangeView(BOOL scroll)
{
    if(scroll)
    {
        m_status |= STATUS_SCROLL ;
        UINT temp = ::GetWindowLong(m_wndView->m_hWnd, GWL_ID);
        ::SetWindowLong(m_wndView->m_hWnd, GWL_ID,
        ::GetWindowLong(m_scrollView.m_hWnd, GWL_ID));
        ::SetWindowLong(m_scrollView.m_hWnd, GWL_ID, temp);
        m_wndView->ShowWindow(SW_HIDE);
        m_scrollView.ShowWindow(SW_SHOW);
    }
    else
    {
        // 省略
    }
    RecalcLayout();
}
これなら、m_wndViewとは干渉しないはずなんですが、それでもOnMouseWheelは
最初は呼ばれているのですが、m_wndViewを切り換えると呼ばれません。
OnCmdMsgもこんな風に変えているのですが...

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, 
AFX_CMDHANDLERINFO* pHandlerInfo)
{
    if(m_status & STATUS_SCROLL)
    {
        if (m_scrollView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
            return TRUE;
    }
    else
    {
        if (m_wndView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
            return TRUE;
    }
    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

自分でも変わった使い方だとは認識していますし、同様の経験がある方いらっしゃらない
様ですので、自分でもうちょっと調べてみます。
ありがとうございました。

Gak 2003/09/22(月) 10:15:22
マウスのソフトウェア(ドライバ)には、設定によって WM_MOUSEWHEEL を 自動的に 
WM_?SCROLL に置き換えたりするものがあります。(MSのIntelliPoint等)
この設定が有効になっていたりしません?

n [E-Mail] 2003/09/22(月) 10:53:16
今やってみたんですが、
ウィンドウ切り替えの後にSetFocus()してやるとWM_MOUSEWHEELが働くみたいです。

//ON_COMMAND_RANGEハンドラ
void CMainFrame::OnNewView( UINT nID ) 
{
  m_wndView->DestroyWindow();
  delete m_wndView;

  if ( ID_CHILD_VIEW_A == nID )
    m_wndView = new CChildViewA;
  else if ( ID_CHILD_VIEW_B == nID )
    m_wndView = new CChildViewB;

  if (!m_wndView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
    CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
  {
    return;
  }

  m_wndView->SetFocus();//←これ
  RecalcLayout();
}

何故かはわかりません...

Tonny 2003/09/22(月) 11:18:38
[[解決]]
Gakさん、nさんレスありがとうございます。

nさんに教えられたとおり、SetFocus()したら、
OnMouseWheel()が呼ばれるようになりました。

WM_LBUTTONDBLCLKとかは自分でフォーカスしているんですかね。
助かりました。ありがとうございます。

Tonny 2003/09/22(月) 11:54:45
今思い出したんですが、先月もnさんに助けられてました。(違う掲示板ですが)
度々、ありがとうございます。

古いスレッドには追加発言できません。