MFC中关联变量的事情不太懂,不知道是怎么联系在一下的,求解释一下! 10
比如说,有一个Edit,关联一个成员变量MemberVariable,比如说是UNITa吧,这个a就代表了Edit里面的值了,这是为什么呀?是怎么关联的呢?求解释!...
比如说,有一个Edit,关联一个成员变量Member Variable ,比如说是UNIT a吧,
这个a就代表了Edit里面的值了,这是为什么呀?是怎么关联的呢?求解释! 展开
这个a就代表了Edit里面的值了,这是为什么呀?是怎么关联的呢?求解释! 展开
4个回答
展开全部
例如使用Class Wizard 给对话框里的IDC_EDIT1控件关联一个 CString 变量m_str,关联后Class Wizard 会在在对话框的头文件中添加一句CString m_str的声明;
头文件:
class CYourDlg : public CDialog
{
public:
。。。
CStringm_str;//关联CString 变量后Class Wizard自动添加的
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//虚函数
。。。
};
实现文件:
void CYourDlg ::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAsfDlg)
DDX_Text(pDX, IDC_EDIT1, m_str);//关联CString 变量后Class Wizard自动添加的
//}}AFX_DATA_MAP
}
再看DDX_Text和函数原型:
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value);
再看DLGDATA.CPP的源码,在你vc安装文件的SRC文件夹内。
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value)
{
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);//输入时
value.ReleaseBuffer();
}
else
{
AfxSetWindowText(hWndCtrl, value);输出时
}
}
再看Wincore.cpp
/////////////////////////////////////////////////////////////////////////////
// 'dialog data' support
BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
CDataExchange dx(this, bSaveAndValidate);
// prevent control notifications from being dispatched during UpdateData
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
ASSERT(hWndOldLockout != m_hWnd); // must not recurse
pThreadState->m_hLockoutNotifyWindow = m_hWnd;
BOOL bOK = FALSE; // assume failure
TRY
{
DoDataExchange(&dx);//调用虚函数
bOK = TRUE; // it worked
}
CATCH(CUserException, e)
{
// validation failed - user already alerted, fall through
ASSERT(!bOK);
// Note: DELETE_EXCEPTION_(e) not required
}
AND_CATCH_ALL(e)
{
// validation failed due to OOM or other resource failure
e->ReportError(MB_ICONEXCLAMATION, AFX_IDP_INTERNAL_FAILURE);
ASSERT(!bOK);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
pThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
return bOK;
}
综上:
1.使用Class Wizard关联变量(IDE提供的方式比较方便,也可手动添加)
2.使用UpdateData更新控件的输入和输出
3.在UpdateData函数里调用虚函数DoDataExchange
4.在DoDataExchange调用DDX_Text函数
5.在DDX_Text函数里实现输入输出。
头文件:
class CYourDlg : public CDialog
{
public:
。。。
CStringm_str;//关联CString 变量后Class Wizard自动添加的
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//虚函数
。。。
};
实现文件:
void CYourDlg ::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAsfDlg)
DDX_Text(pDX, IDC_EDIT1, m_str);//关联CString 变量后Class Wizard自动添加的
//}}AFX_DATA_MAP
}
再看DDX_Text和函数原型:
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value);
再看DLGDATA.CPP的源码,在你vc安装文件的SRC文件夹内。
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value)
{
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
if (pDX->m_bSaveAndValidate)
{
int nLen = ::GetWindowTextLength(hWndCtrl);
::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);//输入时
value.ReleaseBuffer();
}
else
{
AfxSetWindowText(hWndCtrl, value);输出时
}
}
再看Wincore.cpp
/////////////////////////////////////////////////////////////////////////////
// 'dialog data' support
BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
CDataExchange dx(this, bSaveAndValidate);
// prevent control notifications from being dispatched during UpdateData
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
ASSERT(hWndOldLockout != m_hWnd); // must not recurse
pThreadState->m_hLockoutNotifyWindow = m_hWnd;
BOOL bOK = FALSE; // assume failure
TRY
{
DoDataExchange(&dx);//调用虚函数
bOK = TRUE; // it worked
}
CATCH(CUserException, e)
{
// validation failed - user already alerted, fall through
ASSERT(!bOK);
// Note: DELETE_EXCEPTION_(e) not required
}
AND_CATCH_ALL(e)
{
// validation failed due to OOM or other resource failure
e->ReportError(MB_ICONEXCLAMATION, AFX_IDP_INTERNAL_FAILURE);
ASSERT(!bOK);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
pThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
return bOK;
}
综上:
1.使用Class Wizard关联变量(IDE提供的方式比较方便,也可手动添加)
2.使用UpdateData更新控件的输入和输出
3.在UpdateData函数里调用虚函数DoDataExchange
4.在DoDataExchange调用DDX_Text函数
5.在DDX_Text函数里实现输入输出。
展开全部
通过DDx来关联
如:DDX_Text(pDX, IDC_EDIT_FILEPATH, m_strFilePath);
UpdateData(TRUE);//获取控件里的值
UpdateData(FALSE);//把m_strFilePath的值显示在控件里
如:DDX_Text(pDX, IDC_EDIT_FILEPATH, m_strFilePath);
UpdateData(TRUE);//获取控件里的值
UpdateData(FALSE);//把m_strFilePath的值显示在控件里
更多追问追答
追问
我的意思是,为什么关联的变量是Edit里面的值呢?是怎么判断的?跟其他控件关联的变量代表的又是什么意思呢?
追答
这是微软封装好的,具体内部是怎么弄的,没有必要去深究,知道怎么调用就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单说是关联,其实内部需要代码联系在一起,只是这部分代码框架程序已经帮我们做了,所以只需要根据程序向导进行操作即可。
追问
我的意思是,为什么关联的变量是Edit里面的值呢?是怎么判断的?跟其他控件关联的变量代表的又是什么意思呢?
追答
每一个变量可以关联什么样的值程序向导会给出,只需要根据需要进行关联即可,比如编辑框,可以关联数值型、编辑框控件型,还有字符串型,一般程序向导值允许关联这三种类型变量,至于需要关联哪一种,就需要根据实际的需要。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
DVE UpdateData(TRUE) UpdateData(FALSE)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询