问题提出:mfc扩展Dll程序中,新建了一个对话框IDD_DIALOG 1及三个文本编辑控件IDC_SIGM,、IDC_RATIOLOW和IDC_RATIOHIGH。并新建了一个对话框类(派生于CDialog类)。有关控件引用的代码如下:
enum { IDD = IDD_DIALOG1 };
DDX_Text(pDX,IDC_SIGMA,m_Sigma);
DDX_Text(pDX,IDC_RATIOLOW ,m_RatioLow);
DDX_Text(pDX,IDC_RATIOHIGH ,m_RatioHigh);
编译时提示如下错误:
error C2065: “IDC_RATIOHIGH”: 未声明的标识符(其他控件是相同错误,在此省略)。
解决方法:
对于这种错误这里有就是控件未定义的意思,为什么会出现这种错误呢?因为这些控件ID都是函数的参数,一般情况我们会看下函数定义。我们在msdn中看下DDX_Text这个函数的定义:
void AFXAPI DDX_Text( CDataExchange*pDX, intnIDC, BYTE&value);
最后一个参数"value"还可以是其他数据类型(比如int、long。。。)。
再在Resource.h中看下有没有这些空间的定义,发现是有的,代码如下:
#define IDD_DIALOG1 5000
#define IDC_SIGMA 5000
#define IDC_RATIOLOW 5001
#define IDC_RATIOHIGH 5002
既然有定义还出错,我先想到把定义的具体值带进去试试,于是将 enum { IDD = IDD_DIALOG1 }改为 enum { IDD = 5000 },其他出错语句进行类似更改。结果编译链接时通过,没提示错误。我以为问题就此解决了呢,实际上更要命的在后面。
这样修改编译链接当然没有问题,因为是按定义来的,至于变量m_Sigma等能不能传不到相应的文本控件中,我就不清楚了,有时间可以做个测试。所以也就通过了。但是在用"类向导"给对话框中"确定"按钮添加事件响应消息时,却提示异常,原来问题还没实质性解决。
再想想,既然定义在"resource.h"里,会不会没有包含这个头文件,因为对话框使我们新建的,"resource.h"时随对话框自动添加的,当然不会自动包含进某个.cpp或.h文件内,用到"resource.h"里定义的是新建的对话框类,是没有包含"resource.h"的。看似问题解决了。将resource.h添加到stdafx.h或对话框类的头文件中就OK了。
#include "resource.h"
果然编译链接通过,给控件添加事件响应不会出现什么异常了。
总结:这本是很常见的问题,以前我也遇到过,在此写下来提醒自己注意,特别注意的是在遇到类似没有定义的问题时首先考虑定义是否在其他头文件内而又没包含其该文件。