Romi-知行合一

轻轻的风轻轻的梦,轻轻的晨晨昏昏, 淡淡的云淡淡的泪,淡淡的年年岁岁。
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

使用控件时提示"未声明标识符"的解决方法

Posted on 2012-01-06 13:38  romi  阅读(30626)  评论(0编辑  收藏  举报

问题提出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"

果然编译链接通过,给控件添加事件响应不会出现什么异常了。


总结这本是很常见的问题,以前我也遇到过,在此写下来提醒自己注意,特别注意的是遇到类似没有定义的问题时首先考虑定义是否在其他头文件内而又没包含其该文件