none
VS2013 C++ CDialogクラスにおけるエラー RRS feed

  • 質問

  • 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に不慣れなこともあり、お手上げ状態となっています。よろしければご教授お願いします。

    2014年4月8日 8:47

回答

  • >リソースIDが定義されていなくて動くことはあるのでしょうか?

    リソースIDを必要としないようにCDialogから派生したダイアログボックスを
    記述することは「可能」です。
    少なくとも2種類の記述方法が考えられます。モーダル、モードレス共に可能です。

     1.ダイアログテンプレートのIDを整数で指定する方法
     2.ダイアログテンプレートの指定をテンプレート名を表す
      文字列で与える方法

    ただし、

     3.ダイアログテンプレートリソースが不要というわけではありません。

    さて、当該のコードはいささか奇妙な部分があります。
    それは、一般のDLGには無い、水平スクロールバーの応答関数があること、
    また、マウスの左クリックに応答していることですね。
    名前から察するに、色の選択を行う機能を持つもののようです。

    以上の手がかりで、リソースから、
    相応のコントロールを持つなど、対応するダイアログリソースを探してみてはどうでしょう。

    もっとも、そのコードは動作しているEXEに比べて「古い」、または「新しい」
    「書きかけ」など異なるものかもしれません。

    2014年4月9日 8:12

すべての返信

  • 出力ペインへ出力されたエラーメッセージ行をダブルクリックすると、
    エラーの検出された行にジャンプルします。やってみましょう。

    提示された情報が少ないので、ここからは占い同然ですが、

    class MyDlg : public CDialog
    {
       //{{AFX_DATA(CMyDlg)
       enum { IDD = IDD_xxxx}
       //}}AFX_DATA

    の様なコードにジャンプするのではないかと占います。
    そのあたりのコードに問題があるのかもしれません。
    コードを精査しましょう。
    また、許されるのであれば、前後数行をこぴぺして掲載してみてください。

    2014年4月8日 9:46
  • 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/

    2014年4月8日 9:50
  • 皆様回答ありがとうございます。提示した情報が少なすぎたため、ソースコードを貼っておきます。

    #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
    }

    2014年4月9日 3:52
  • IMAGE_COLOR.h の class IMAGE_COLOR の中に、

    enum{ IDD = ダイアログのリソースID };

    という行があるはずです。そちらも確認してみてください。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2014年4月14日 6:06
    2014年4月9日 4:14
  • とっちゃんさんの指摘が重要なので、まずやってみてください。

    追加で、質問なのですが、

    #include "原子像の表示.h"

    となっていますが、本当に漢字のファイル名なのでしょうか。
    インクルードに関連するエラーは発生していませんでしょうか。
    漢字のファイル名は色々と問題を発生させる可能性があります。

    ためしに、ウィザードで新規プロジェクトを作成して、
    これらのヘッダーファイルをインクルードして、問題のないことを
    確認してみてはどうでしょう。

    場合によっては、これら漢字のファイル名を修正する必要があるかもしれません。

    2014年4月9日 4:33
  • とっちゃんさん、中澤@失業者さん回答ありがとうございます。

    ヘッダーファイルを確認したところ、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()
    };

    2014年4月9日 7:12
  • >リソースIDが定義されていなくて動くことはあるのでしょうか?

    リソースIDを必要としないようにCDialogから派生したダイアログボックスを
    記述することは「可能」です。
    少なくとも2種類の記述方法が考えられます。モーダル、モードレス共に可能です。

     1.ダイアログテンプレートのIDを整数で指定する方法
     2.ダイアログテンプレートの指定をテンプレート名を表す
      文字列で与える方法

    ただし、

     3.ダイアログテンプレートリソースが不要というわけではありません。

    さて、当該のコードはいささか奇妙な部分があります。
    それは、一般のDLGには無い、水平スクロールバーの応答関数があること、
    また、マウスの左クリックに応答していることですね。
    名前から察するに、色の選択を行う機能を持つもののようです。

    以上の手がかりで、リソースから、
    相応のコントロールを持つなど、対応するダイアログリソースを探してみてはどうでしょう。

    もっとも、そのコードは動作しているEXEに比べて「古い」、または「新しい」
    「書きかけ」など異なるものかもしれません。

    2014年4月9日 8:12
  • 返信ありがとうございます。3日ほどかけて修正を試みましたが、自分の力不足のためいまだコンパイルが通らずにいます。そこで最初からやり直すために、新しく質問を立ち上げてもう一度初めからやり直したいと思います。

    回答してくださった皆様ありがとうございました。

    2014年4月14日 8:27