利用winx的DDX机制得到,设置、得到edit控件内容
目的
利用DDX便利性,进行edit控件内容的设置和获取
原理
WTL提供了一个模板类来单独处理DDX机制,该类为:
// CWinDataExchange - provides support for DDX
template <class T>
class CWinDataExchange
Winx自该类继承了一个新类:
template <class T>
class WinDataExchange : public WTL::CWinDataExchange
某对话框类如果要使用DDX机制,则应该使用多继承机制,继承WinDataExchange
DDX机制本质,实际上是帮我们调用GetDlgItemText函数的封装而已。
步骤
新增加IDC_EDIT_SRC对应的字符串成员变量winx::CString m_strSrc;
新增CMyDialog的父类,如下:
class CMyDialog : public winx::ModelDialog
,public winx::WinDataExchange
在按钮事件中,利用DDX_Text函数,得到控件内容:
void OnCmdButton1(HWND hWnd)
{
DDX_Text(IDC_EDIT_SRC, m_strSrc,0,TRUE);
MessageBox( m_strSrc );
}
分析
可以看出,这方法简便是简便,但跟MFC还是有很大不一样。如果有多个地方需要设置得到控件内容,那每次都要调用一次DDX_Text,比较麻烦,如何才能像MFC那样,每次需要DDX的时候,调用一个函数UpdateData即可完成呢?请看下回分解:利用winx DDX宏处理DDX
利用winx DDX宏处理DDX
问题
MFC的UpdateData函数,并没有指定Update哪个控件,所以MFC是把能DDX的都DDX掉吧。一个问题,对话框上有这么多的控件,怎么得到这么些控件的ID并一一的进行DDX_Text呢?
原理
Winx 提供了几个跟DDX相关的宏。如下:
#define WINX_DDX_BEGIN() BEGIN_DDX_MAP(void)
#define WINX_DDX_TEXT(nID, var) DDX_TEXT(nID, var)
#define WINX_DDX_TEXT_LEN(nID, var, len) DDX_TEXT_LEN(nID, var, len)
#define WINX_DDX_INT(nID, var) DDX_INT(nID, var)
#define WINX_DDX_INT_RANGE(nID, var, min, max) DDX_INT_RANGE(nID, var, min, max)
#define WINX_DDX_UINT(nID, var) DDX_UINT(nID, var)
#define WINX_DDX_UINT_RANGE(nID, var, min, max) DDX_UINT_RANGE(nID, var, min, max)
#define WINX_DDX_CHECK(nID, var) DDX_CHECK(nID, var)
#define WINX_DDX_RADIO(nID, var) DDX_RADIO(nID, var)
#define WINX_DDX_END() END_DDX_MAP()
BEGIN:
#define BEGIN_DDX_MAP(thisClass) /
BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) /
{ /
bSaveAndValidate; /
nCtlID;
DDX_TEXT:
#define DDX_TEXT(nID, var) /
if(nCtlID == (UINT)-1 || nCtlID == nID) /
{ /
if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate)) /
return FALSE; /
}
END
#define END_DDX_MAP() /
return TRUE; /
}
嗯,还是老一套。
什么时候需要更新数据了,就调用DoDataExchange函数就可以了。
步骤
代码如下:
WINX_DDX_BEGIN()
WINX_DDX_TEXT(IDC_EDIT_SRC,m_strSrc)
WINX_DDX_END()
void OnCmdButton1(HWND hWnd)
{
DoDataExchange( TRUE );
MessageBox( m_strSrc );
}
用winx开发基于对话框程序总结
走到这里,基本上,用Winx开发基于对话框的程序,就比较简单了。简单总结如下:
新建一对话框资源模板,拖拉布置控件位置及设置ID。
新建一对话框类,继承于winx::ModelDialog, 在模板参数中,将对话框ID传递与资源模板关联。
消息处理
按钮事件,菜单事件,以OnCommand函数处理之,有WINX_CMDS_BEGIN宏辅助之。
系统命令,有WINX_SYSCMD_BEGIN辅助之,请照葫芦画瓢处理之。
类似的宏记录如下,请自行研究。
// Unify style of map macro, such as:
// WINX_TEST_SUITE/WINX_TEST/WINX_TEST_SUITE_END;
// WINX_CMDS_BEGIN/WINX_CMD/WINX_CMDS_END;
// WINX_SYSCMD_BEGIN/WINX_SYSCMD/WINX_SYSCMD_END;
// WINX_NOTIFY_BEGIN/WINX_NOTIFY/WINX_NOTIFY_END;
// WINX_REFLECT_NOTIFY_BEGIN/WINX_REFLECT_NOTIFY/WINX_REFLECT_NOTIFY_END;
至此,则对话框控件及相关事件处理没有问题。
DDX相关,有DDX宏处理。就不再多说什么了。