トップ回答者
VS2013 C++ CDialogクラスにおけるエラー

質問
-
VS 6.0 からVS 2013への移行で悩んでいます。
あるプロジェクトを以下の手順でVS 2013に移行しました。
・ファイル→開く→プロジェクト/ソリューション
その際にCDialogクラスにおいてエラーが発生してしまい、困っています。
error C2065: 'IDD' : 定義されていない識別子です。
error C2039: 'IDD' : 'IMAGE_COLOR' のメンバーではありません。
一応resource.hを確認しましたが、定義されていました。過去の質問を調べたところ、xxx.cpp (ウィザードが生成した新規クラスの実装ファイル)内で、#include "xxx.h" の前に #include "resource.h" と書けばとりあえずコンパイルできるようになる、と書いてあり、試したところまだエラーが発生しました。
VSに不慣れなこともあり、お手上げ状態となっています。よろしければご教授お願いします。
回答
-
>リソースIDが定義されていなくて動くことはあるのでしょうか?
リソースIDを必要としないようにCDialogから派生したダイアログボックスを
記述することは「可能」です。
少なくとも2種類の記述方法が考えられます。モーダル、モードレス共に可能です。1.ダイアログテンプレートのIDを整数で指定する方法
2.ダイアログテンプレートの指定をテンプレート名を表す
文字列で与える方法ただし、
3.ダイアログテンプレートリソースが不要というわけではありません。
さて、当該のコードはいささか奇妙な部分があります。
それは、一般のDLGには無い、水平スクロールバーの応答関数があること、
また、マウスの左クリックに応答していることですね。
名前から察するに、色の選択を行う機能を持つもののようです。以上の手がかりで、リソースから、
相応のコントロールを持つなど、対応するダイアログリソースを探してみてはどうでしょう。
もっとも、そのコードは動作しているEXEに比べて「古い」、または「新しい」
「書きかけ」など異なるものかもしれません。- 編集済み 仲澤@失業者 2014年4月9日 8:17
- 回答の候補に設定 星 睦美 2014年4月14日 6:06
- 回答としてマーク fender1118 2014年4月14日 8:22
すべての返信
-
出力ペインへ出力されたエラーメッセージ行をダブルクリックすると、
エラーの検出された行にジャンプルします。やってみましょう。提示された情報が少ないので、ここからは占い同然ですが、
class MyDlg : public CDialog
{
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_xxxx}
//}}AFX_DATAの様なコードにジャンプするのではないかと占います。
そのあたりのコードに問題があるのかもしれません。
コードを精査しましょう。
また、許されるのであれば、前後数行をこぴぺして掲載してみてください。- 編集済み 仲澤@失業者 2014年4月8日 9:47
-
C2065 は、エラーの通りで定義が見つからないことが原因で発生します。
C2039 は、IMAGE_COLOR という何か(ソースにおかしな手入れをしていないければenumのはずですが詳細不明)のメンバーとして、IDD が定義されていないと出ています。
Visual C++ で作成したプロジェクトであれば、どのバージョンのどのエディションで作成したプロジェクトであるかにかかわりなく、IDD は、ダイアログクラスのヘッダーに
enum { IDD = IDD_???? }; // IDD_???? はダイアログのリソースID
と定義されているはずです。
モーダルダイアログであればコンストラクタで(C???Dlg は、このIDDを使うダイアログのクラス名)
C???Dlg : CDialog( C???Dlg::IDD ) { // ... 何らかの初期化コード類 }
という感じで参照されていると思います。
エラーの箇所やそのソースがわからないので、これ以上は何とも言えませんが、もし身近にVisualC++での開発経験がある人がいるのであれば、その人にエラーの詳細を聞いてみるとよいと思います。
IDEの見た目や機能などは、VS6.0あるいはそれ以前と比べると大きく違っていますが、MFCプロジェクトの基本的な部分は何も変わっていません(ほぼ100%のソース互換があります)。
周りに聞ける人がいないのであれば、エラーが発生する箇所周辺のソースコードを張り付けてみると、より具体的な対処方法が聞けるかもしれません。
とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/
-
皆様回答ありがとうございます。提示した情報が少なすぎたため、ソースコードを貼っておきます。
#include "stdafx.h"
#include "原子像の表示.h"
#include "IMAGE_COLOR.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// IMAGE_COLOR ダイアログ
IMAGE_COLOR::IMAGE_COLOR(CWnd* pParent /*=NULL*/)
: CDialog(IMAGE_COLOR::IDD, pParent) //エラー箇所
{
//{{AFX_DATA_INIT(IMAGE_COLOR)
//}}AFX_DATA_INIT
} -
とっちゃんさん、中澤@失業者さん回答ありがとうございます。
ヘッダーファイルを確認したところ、enum{IDD = ダイアログのリソースID}の定義がされていませんでした。
自分が作ったプログラムではなく、他人(大学院の先輩)が作ったプログラムを改良しようとしているので、詳しいことは分からずコードを見直しているのですが、リソースIDが定義されていなくて動くことはあるのでしょうか?
また、最初に記述しましたが、ファイル→開く→プロジェクト/ソリューションで一気にプロジェクトを立ち上げ、エラーを修正しています。この方法よりも、コードを参考程度にし、一から作り直す方法のほうがいいのでしょうか?回答お願いします。
以下にIMAGE_COLORのヘッダーファイルのソースコードを記述しておきます。
class IMAGE_COLOR : public CDialog
{
protected:
void SetDlgItemDouble(int ID, double data);
// コンストラクション
public:
IMAGE_COLOR(CWnd* pParent = NULL); // 標準のコンストラクタ
int num,return_num;
int max_sli,min_sli;
// ダイアログ データ
//{{AFX_DATA(IMAGE_COLOR)
//}}AFX_DATA
// オーバーライド
// ClassWizard は仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(IMAGE_COLOR)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
//}}AFX_VIRTUAL
// インプリメンテーション
protected:
// 生成されたメッセージ マップ関数
//{{AFX_MSG(IMAGE_COLOR)
virtual BOOL OnInitDialog();
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
-
>リソースIDが定義されていなくて動くことはあるのでしょうか?
リソースIDを必要としないようにCDialogから派生したダイアログボックスを
記述することは「可能」です。
少なくとも2種類の記述方法が考えられます。モーダル、モードレス共に可能です。1.ダイアログテンプレートのIDを整数で指定する方法
2.ダイアログテンプレートの指定をテンプレート名を表す
文字列で与える方法ただし、
3.ダイアログテンプレートリソースが不要というわけではありません。
さて、当該のコードはいささか奇妙な部分があります。
それは、一般のDLGには無い、水平スクロールバーの応答関数があること、
また、マウスの左クリックに応答していることですね。
名前から察するに、色の選択を行う機能を持つもののようです。以上の手がかりで、リソースから、
相応のコントロールを持つなど、対応するダイアログリソースを探してみてはどうでしょう。
もっとも、そのコードは動作しているEXEに比べて「古い」、または「新しい」
「書きかけ」など異なるものかもしれません。- 編集済み 仲澤@失業者 2014年4月9日 8:17
- 回答の候補に設定 星 睦美 2014年4月14日 6:06
- 回答としてマーク fender1118 2014年4月14日 8:22