こんばんは。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な内容ですが、どなたか対処法などご存知の方いらっしゃいませんか。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassonmouse
wheeltopic.asp
ここ嫁
ここ嫁んでも分からないから聞いているに決まっているじゃん。
馬鹿じゃないのー>ボケシチ
スマン->ボルシチさん
。は私ではありません。(念のため)
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
なんて変えてもページが見つかりませんでした。にしかならなくて
書かれている内容からは、親切で教えていただいているのか、からかわれているのか
わからなかったんで、レス付けづらかったんです。
茶化すような表現ですとやはり無視せざるを得ません。親切で教えていただいているの
でしたら、キーワード等でお教え願えませんでしょうか。
ボルシチさんの言われてるURLの
改行されてるところつなげてみて。
表示されるから。
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);
}
自分でも変わった使い方だとは認識していますし、同様の経験がある方いらっしゃらない
様ですので、自分でもうちょっと調べてみます。
ありがとうございました。
マウスのソフトウェア(ドライバ)には、設定によって WM_MOUSEWHEEL を 自動的に
WM_?SCROLL に置き換えたりするものがあります。(MSのIntelliPoint等)
この設定が有効になっていたりしません?
今やってみたんですが、
ウィンドウ切り替えの後に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();
}
何故かはわかりません...
Gakさん、nさんレスありがとうございます。
nさんに教えられたとおり、SetFocus()したら、
OnMouseWheel()が呼ばれるようになりました。
WM_LBUTTONDBLCLKとかは自分でフォーカスしているんですかね。
助かりました。ありがとうございます。
今思い出したんですが、先月もnさんに助けられてました。(違う掲示板ですが)
度々、ありがとうございます。