一.DoDataExchange()函数
DoDataExchange是框架调用此函数来改写与确认对话框数据。 DoDataExchange函数其实是一项数据动态绑定技术。
MSDN是这样描述的:Called by the framework to exchange and validate dialog data.大意是框架调用此函数来改写与确认对话框数据。
看了下DoDataExchange函数里的DDX型函数,似乎明白了DoDataExchange函数的作用。原来DoDataExchange函数是被框架与控件用来交流数据的,而里面的DDX函数才是动态绑定技术。
比如文本框控件的ID为IDC_USER_EDIT,为对话框类添加CString变量m_username,再用DoDataExchange函数将它绑定到你的动态按扭中:DDX_Text(pDX,IDC_USER_EDIT, m_username);这就是将m_username绑定到IDC_USER_EDIT中。
<span style="font-family:SimSun;font-size:18px;"> void CUserDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_USER_EDIT, m_username);
DDV_MaxChars(pDX,m_username,10); //将用户名的最大长度控件在10个字符
}</span>
DDX:Dialog Data Exchange 表示对话框数据交换
DDV:Dialog Data Valid 表示对话框数据有效性
对话框数据交换负责数据在控件中的进出。当对话首次出现的时候,每个控件窗口自动用相应的成员变量的值进行初始化。当用户通过单击OK按钮,或通过按Enter键关闭对话的时候,该控件无论是包含哪一个值或文本,都将被复制回该变量。
对话数据验证可以确保值落在规定的限制之内。交换和验证机制都是由MFC框架提供的。每个函数都有一个前缀DDX_或DDV_,来把它作为数据交换或数据验证函数来标识。
1. 对话数据交换(DDX)
常见的对话数据交换函数
交换函数 | 获得/设置的数据类型 | 应用于控件 |
---|---|---|
DDX_CBIndex | int | Combobox |
DDX_CBString | Cstring | Combobox |
DDX_CBStringExact | Cstring | Combobox |
DDX_Check | intCheck | box |
DDX_DateTimeCtrl | Ctime | Datetimepicker |
DDX_LBIndex | int | List box |
DDX_LBString | CString | Listbox |
DDX_LBStringExact | CString | List box |
DDX_MonthCalCtrl | Ctime | Month calendar |
DDX_Radio | int | Radio button |
DDX_Scroll | int | Scroll bar |
DDX_Text | CString or numerical(BYTE,short,int,UINT,long,etc.) | Edit control |
在所有的数据交换函数之中,该函数是独一无二的,它只应用于一组控件,而不是一个控件。DDX_Radio返回一个int值用来指示用户打开了组中的哪个按钮:0代表组中的第一个按钮,1代表第二个按钮,以此类推。值-1的意思是小组中的所有按钮都是清除的。你可以调用DDX_Radio来确定单个单选按钮的状态(假如它是组中的唯一一个按钮)。在这种情况下,返回值0的意思是按钮是打开的,值-1意为按钮是关闭的。
2.对话数据验证(DDV)
对话数据验证函数,它们仅仅应用于接受用于从键盘输入数据的控件成员变量。换言之,就是编辑控件和组合框。
常见的对话数据验证函数
(1)DDV_MinMaxByte 指定限制范围内的一个BYTE值。
(2)DDV_MinMaxInt 指定限制范围内的一个int值。
(3)DDV_MinMaxUInt 指定限制范围内的一个UNIT值。
(4)DDV_MinMaxLong 指定限制范围内的一个long值。
(5)DDV_MinMaxDWord 指定限制范围内的一个DWORD值。
(6)DDV_MinMaxFloat 指定限制范围内的一个float值。
(7)DDV_MinMaxDouble 指定限制范围内的一个double值。
(8)DDV_MaxCharsCString 字符串的长度不能超过指定的最大长度。
当你为编辑控件或组合框添加成员变量,然后在Member Variable选项卡中的Control IDs框中选择控件的时候,两个提示之一将会出现在该选项卡的底部。究竟出现哪一个提示取决于变量所具有的是数字数据,还是文字数据;在任一种情况下,都要输入用于验证的变量限制值。
除了一个对话数据验证函数之外,所有函数都监视数值数据,以确保由用户输入的值落在指定的上下限之间。
例外是DDV_MaxChars函数,它用来验证键入到编辑控件或组合框中的字符数不超过给定的最大值。与交换函数不同,验证函数仅仅在对话关闭的时候起作用,而不在它刚出现的时候起作用。
如果输入到一个控件的值落到了指定的限制之外,那么,该控件的验证函数将显示一个消息框,以通知用户出了问题。当消息框被关闭的时候,出问题的控件将具有一个焦点,提示用户重新输入数据。除非所有的数据验证函数都满足了,否则,用户不能够通过单击OK来关闭对话。
三.m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME)在资源视图里展开icon看到,这个标志iDR_MAiNFRAME,双击它就是一个图标“MFC”;注意这个函数就是获取这个icon的句柄,以便以后用Drawicon(句柄),把它画在标题栏。
四.BEGIN_MESSAGE_MAP、END_MESSAGE_MAP、DECLARE_MESSAGE_MAP
BEGIN_MESSAGE_MAP( theClass, baseClass )宏定义的一种。在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加你的消息响应函数,为每个消息处理函数加入一个入口。
theClass:指定消息映射所属的类的名字。
baseClass:指定theClass的基类的名字。
映射入口
|
何时向父对象发送消息
|
ON_BN_CLICKED
|
用户单击按钮时
|
ON_BN_DOUBLECLICKED
|
用户双击按钮时
|
只要是CCmdTarget(用于所有能够消息映射的基类)派生类,必有消息映射以处理消息,则在类的说明文件的尾部有DECLARE_MESSAGE_MAP宏,在类的定义文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以处理用户消息。