C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NufuNufu

C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#1

投稿記事 by NufuNufu » 12年前

Microsoft Visual Stdio 2010にて,MFC/ダイアログベースを用いて,OpenGLを描画としてつかうアプリケーションを作っているのですが,

・本体の"プロジェクト名Dlgクラス"でOnMouseWheelを呼び出す.
・そのOnMouseWheel()内で,描画専用のクラスのOnMouseWheelを呼び出す.

以上の挙動をしたときに,実行時例外を投げられてしまいます.
描画専用のクラスは,
http://d.hatena.ne.jp/minami_SC/20110406/1302113824
このサイトを参考に,CStaticを継承して作られています.

デバッグで調べているうちに,

コード:

BOOL ConMouseWheelTestDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
	this->testObject.OnMouseWheel(nFlags, zDelta, pt);

	return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}

..

BOOL testObject::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。

	return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}
この2つの関数が何らかの原因でループしてしまっていることがわかりました.
具体的には上記のコードでtestObjectがreturnを返す時に,大元のDlgクラスのOnMouseWheelを呼び出してしまい,結果(おそらくループのネストが深すぎて)例外を投げ出されているのだと思います.

しかしながら原因がわかりません.
原因がわかりそうな方,ぜひご教授お願いします.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#2

投稿記事 by softya(ソフト屋) » 12年前

イベントが子から親へと伝わる仕組みが有るので、親が子のイベント呼ぶとループしてしまっているのでは?
ダイアログからCStaticのOnMouseWheelって呼ばないとダメでしょうか? 呼ばなくても呼び出されているのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NufuNufu

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#3

投稿記事 by NufuNufu » 12年前

softya(ソフト屋) さんが書きました:イベントが子から親へと伝わる仕組みが有るので、親が子のイベント呼ぶとループしてしまっているのでは?
ダイアログからCStaticのOnMouseWheelって呼ばないとダメでしょうか? 呼ばなくても呼び出されているのでは?
ご返事ありがとうございます.
ダイアログの本体のクラスと描画用のクラスは別々に存在しており,先ほどのサンプルでいうConMouseWheelTestDlgクラスとtestObejctクラスは継承関係はまったくありません(サンプル中ではtestObject変数によりインスタンス化してtestObjectクラスを使用しています)
しかしながら試しに問題のプログラム中で提示していただいた解決法を施してみましたが,やはり問題解決には至りませんでした.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#4

投稿記事 by softya(ソフト屋) » 12年前

描画単位としての親子なのでクラスの継承は無関係ですが、インスタンスを生成している仕組みの中で親子関係が出来ます。
親ダイアログに乗っかいっていれば子だと思いますが、それも無いんでしょうか?

【追記】
this->testObject.OnMouseWheel(nFlags, zDelta, pt);を止めても落ちるのなら別の問題だと思われます。
既に最初の前提が崩れるてしまうので、エラーコードなど詳細なものを提示して下さい。
あと呼出し履歴を確認してもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NufuNufu

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#5

投稿記事 by NufuNufu » 12年前

softya(ソフト屋) さんが書きました:描画単位としての親子なのでクラスの継承は無関係ですが、インスタンスを生成している仕組みの中で親子関係が出来ます。
親ダイアログに乗っかいっていれば子だと思いますが、それも無いんでしょうか?

【追記】
this->testObject.OnMouseWheel(nFlags, zDelta, pt);を止めても落ちるのなら別の問題だと思われます。
既に最初の前提が崩れるてしまうので、エラーコードなど詳細なものを提示して下さい。
あと呼出し履歴を確認してもらえますか?
なかなか無知なものでもしかしたらご回答していただいた点について,親子関係はあるかもしれません.
追記に関してですが,OnMouseWheelに関して,描画クラスのものを呼び出しをせずに行った場合は,きちんとした動作をすることを確認しています.
デバッグ,ブレークポイントにて,両方のOnMouseWheel上で謎のループが発生していることを確認していますが,ステップインなどしてプログラムを追って詳細をつかんだほうがよろしいでしょうか?

念のため,問題のプログラムをソリューションファイルごとアップしておきます.
また,環境によっては(ネストの深さの限界の問題?)例外を出されず,普通に動く場合が存在します(それはこちらで確認済みです)
https://www.dropbox.com/s/xu9ujdnx1s3zc ... 282%29.zip

例外を出された時点でのデバックコンソールは以下のような感じでした
CellularAutomatonForStainv0.2.exe の 0x77ea22c9 で初回の例外が発生しました: 0xC00000FD: Stack overflow
CellularAutomatonForStainv0.2.exe の 0x77ea22c9 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#6

投稿記事 by softya(ソフト屋) » 12年前

すいませんVisualStudio2008standardまでしか無いので実行確認は難しいかも知れません。
ソースコードを確認させてもらいます。

>追記に関してですが,OnMouseWheelに関して,描画クラスのものを呼び出しをせずに行った場合は,きちんとした動作をすることを確認しています.

呼び出さなくても大丈夫って事はなかったですか?

【補足】
今忙しので返答は夜になるかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NufuNufu

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#7

投稿記事 by NufuNufu » 12年前

softya(ソフト屋) さんが書きました:すいませんVisualStudio2008standardまでしか無いので実行確認は難しいかも知れません。
ソースコードを確認させてもらいます。

>追記に関してですが,OnMouseWheelに関して,描画クラスのものを呼び出しをせずに行った場合は,きちんとした動作をすることを確認しています.

呼び出さなくても大丈夫って事はなかったですか?

【補足】
今忙しので返答は夜になるかもしれません。
確認ありがとうございます.夜になっても全然かまいません.

呼び出さなくても大丈夫ということはありませんでした.
呼び出さなければ,描画クラスのOnMouseWheelは呼び出されることはありませんでした.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#8

投稿記事 by softya(ソフト屋) » 12年前

OnMouseWheelはフォーカスがないと呼び出されない様です。
つまりStaticTextにフォーカスがないのでOnMouseWheelが呼び出されない状況なのだと思います。

フォーカスはStaticTextのtabstopを有効にするとフォーカスできるようになるはずです。
ダイアログでOnMouseWheelになったら、m_xcGLPictureCtrlにSetFocus()するのでうまくいかないでしょうか?
「CWnd::SetFocus」
http://msdn.microsoft.com/ja-jp/library ... s.90).aspx

あるいは、OnMouseWheelを直接呼び出すのではなく、CellularAutomatonかその親クラスに代用するオリジナルのメンバ関数を新設して下さい。

未検証で勘だけで書いているので間違っている可能性もあります。その場合はご容赦下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NufuNufu

Re: C++/MFC VC2010でOnMouseWheel呼び出し時に実行時例外

#9

投稿記事 by NufuNufu » 12年前

softya(ソフト屋) さんが書きました:OnMouseWheelはフォーカスがないと呼び出されない様です。
つまりStaticTextにフォーカスがないのでOnMouseWheelが呼び出されない状況なのだと思います。

フォーカスはStaticTextのtabstopを有効にするとフォーカスできるようになるはずです。
ダイアログでOnMouseWheelになったら、m_xcGLPictureCtrlにSetFocus()するのでうまくいかないでしょうか?
「CWnd::SetFocus」
http://msdn.microsoft.com/ja-jp/library ... s.90).aspx

あるいは、OnMouseWheelを直接呼び出すのではなく、CellularAutomatonかその親クラスに代用するオリジナルのメンバ関数を新設して下さい。

未検証で勘だけで書いているので間違っている可能性もあります。その場合はご容赦下さい。
返信が遅くなり申し訳ありません.
OnMouseWheel時にm_xcGLPictureCtrlにSetFocusすることで問題は解決できました.

勉強になりました.本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る