問題提出: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"
果然編譯鏈接通過,給控件添加事件響應不會出現什么異常了。
總結:這本是很常見的問題,以前我也遇到過,在此寫下來提醒自己注意,特別注意的是在遇到類似沒有定義的問題時首先考慮定義是否在其他頭文件內而又沒包含其該文件。