トップ回答者
ON_WM_MOUSEMOVE ハンドラを追加するとC3861エラー

質問
-
Visual C++ ダイアログベースで WM_MOUSEMOVE メッセーハンドラ(OnMouseMove)を追加してコンパイルすると、次のようなコンパイルエラーが出ます。
"エラー 1 error C3861: 'ON_WM_MOUSEMOVE': 識別子が見つかりませんでした ..."
ヘッダには、ちゃんと次の記述がなされ、
Class CXxxxDlg : public CDialog
{
...
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
...ソースのメッセージマップと定義も実装されています。
BEGIN_MESSAGE_MAP(CXxxxDlg, CDialog)
...
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()void CXxxxDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。CDialog::OnMouseMove(nFlags, point);
}他のソースを一切追加記述しないダイアログベースプロジェクトの作成直後でも発生します。
ちなみに、Visual C++ 2005、2010 ではもちろん発生していません。
なにとぞ、解決策をご教示ください。よろしくお願いします。
回答
-
1.インクルードのエラーは出ていない。
のであれば、何らかの原因で、afxmsg_.h の当該定義が削除されている可能性があります。
afxmsg_.hを開いてON_WM_MOUSEMOVEを検索してみましょう。
当該ヘッダーファイルは一般に
C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include
にあります。
もし、見つからない場合は、SDKの提供するヘッダーファイルを
編集してしまった可能性があるということになります。
ヘッダーのタイムスタンプが他のものと比べて妙に最近になっていないか調べましょう。- 編集済み 仲澤@失業者 2013年2月15日 1:08
- 回答としてマーク YadokariBei 2013年2月15日 7:06
すべての返信
-
C3861は、識別子が見つからないというエラーだと思います。
なので、記述しているON_WM_MOUSEMOVEという綴りの定義が見つからないと
言っていると思うのですが、エラーメッセージや書き込まれたソースの部分は原本から
コピー&ペーストした物でしょうか?素直に考えると綴りが間違っているか、もしくは2バイト文字が混ざっているというような
原因しか思いつかないです。現在VisualStudio2008の環境が既に無い状態なので
実際に試して確認するという事が出来ないので外しているかもしれませんが、
私自身はこういう現象には当たった事がないので綴りの方が違っているのではと考えています。解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
-
1.インクルードのエラーは出ていない。
のであれば、何らかの原因で、afxmsg_.h の当該定義が削除されている可能性があります。
afxmsg_.hを開いてON_WM_MOUSEMOVEを検索してみましょう。
当該ヘッダーファイルは一般に
C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include
にあります。
もし、見つからない場合は、SDKの提供するヘッダーファイルを
編集してしまった可能性があるということになります。
ヘッダーのタイムスタンプが他のものと比べて妙に最近になっていないか調べましょう。- 編集済み 仲澤@失業者 2013年2月15日 1:08
- 回答としてマーク YadokariBei 2013年2月15日 7:06
-
# エラー 1 error C3861: 'ON_WM_MOUSEMOVE': 識別子が見つかりませんでした d:\home\temp\sample\sampledlg.cpp 66 Sample
# エラー 2 error C2143: 構文エラー : '}' が '{' の前にありません。 d:\home\temp\sample\sampledlg.cpp 67 Sample
■以降、延々とエラーが続く// SampleDlg.h : ヘッダー ファイル
//#pragma once
// CSampleDlg ダイアログ
class CSampleDlg : public CDialog
{
// コンストラクション
public:
CSampleDlg(CWnd* pParent = NULL); // 標準コンストラクタ
// ダイアログ データ
enum { IDD = IDD_SAMPLE_DIALOG };protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
};// 実装
protected:
HICON m_hIcon;// 生成された、メッセージ割り当て関数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};BEGIN_MESSAGE_MAP(CSampleDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
...void CSampleDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。CDialog::OnMouseMove(nFlags, point);
}上記は 2008 で作成したプロジェクトのコピーで、エラーが発生しますが、
このプロジェクトを 2010 でコンパイルすると、すんなり通ります。また、2005 でのグレードダウン(ツールを作成しています)でのコンパイル、
および、
2005で作成したプロジェクトのソースとヘッダをスクラッチで入れ替えたものでの
コンパイルのどちらもエラー無くコンパイルできます。2008 は、使っているうちに、問題が無かった #region での折りたたみができなくなったり、
どこかがおかしくなるのでしょうか? -
以下延々と続くのは、最初の識別子が見つからない所為で
その後解釈がおかしくなってしまっているのだと思うので一旦は無視してよろしいかと。とにもかくにもON_WM_MOUSEMOVEの定義がインクルードパスが通った場所にあるかどうかを
grep等のツールで検索して見た方が良いと思います。
もし見つからないとすると何らかの原因でインクルードファイルの中身が書き換わってしまっているか、
インクルードファイルが壊れているのか。VisualStudio2008はサービスパックが出ていましたっけ?
サービスパックをあてているかどうかでも状況が変わりそうな気もしますが。
IDEの動作自体に不安があるのであれば、一旦アンインストールして
インストールし直すとかした方がよいかもしれませんね。可能性を言い出すとキリが無いですが、ハードディスクドライブの調子が悪くて
そっちの影響とかも全く無いとは言い切れません。
もっともそれなら他のアプリケーションでも動作が不安定になりそうですけれど。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
- 編集済み PATIO 2013年2月15日 1:42