###前提・実現したいこと
仕事で、MFCを使うことが度々ありますが、毎回といっていいほど、メッセージが受信できずに困ることがあります。
いつもは対処療法のように、色々なところを少しずつ変更し、メッセージが受信できたらOKとしていますが、毎回毎回時間がかかりすぎています。
OnCreateのタイミングをずらした(必要なとき→親のOnCreate直後に変更した)ら出来るようになった等、原因がまったくわからないがとりあえず出来た、が多いので、ちゃんとした原因が知りたいです。
こういった、メッセージ自体が飛ばない問題の、予防的な解決方法をご存知の方、また、そういった情報が載っているサイトをご存知の方いらっしゃいましたら、教えていただけませんでしょうか。
調べると、たいてい解決方法は見つかりますが、見つけて試すより、はじめから問題がないものを作りたいです。
###発生している問題・エラーメッセージ
メッセージが受信できない場合がある。
以下最近起きて、解決していない問題
例1:OnPaintがこない
MFC ActiveXオブジェクトを、以下の親子関係で作成し、ダイアログに貼り付ける
COleControl->CFrameWnd(COleControlはCFrameWndを表示するだけ)
→テスト用プロジェクトのダイアログに貼り付けたとき、OnPaintが受信できなかった
→テスト用プロジェクトをコピーし、ダイアログに貼り付けたとき、OnPaintが受信できた
→両者の違いは、何処からも呼ばれていない関数を削除したかどうかのみ
→Send(or Post)Message(WM_PAINT)を実行時は、OnPaintが呼ばれる
例2:OnTimerがこない
COleControlのOnDraw関数にてSetTimer(1, 50, NULL)を実行(戻り値は1)
→OnTimerが呼ばれない
→他のActiveXオブジェクトで上記と同じことをしているものは、OnTimerが実行されている
→Send(or Post)Message(WM_TIMER)を実行時は、OnTimerが呼ばれる
上記例1は一応の解決、例2はきちんと解決したので載せておきます。
例1:OnPaintがこない
→問題のあるプロジェクトをコピーし、コードには修正を加えずに実行すると、何度試してもうまくいくため、プロジェクトに問題があると判断
例2:OnTimerがこない
COleControlの子ウィンドウにOnPaintを設定しているが、そこで親クラスのOnPaintを呼ぶようになっていなかった
→子ウィンドウ側のクラスのOnPaintに、"__super::OnPaint()"を追記することで解決できた
やはり一口にメッセージが来ないといっても、様々な原因があります。
予防的な解決方法だけでなく、問題が起きた時の原因特定のヒントになりうるもの等も、教えていただければ幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/23 08:03
2017/06/23 08:18
2017/06/23 08:26
2017/06/23 08:52
2017/06/26 23:55 編集