工作日志 4.16

一.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 表示对话框数据有效性

    值得注意的一点是:MSDN后面附加了一句 Never call this function directly. It is called by the UpdateData member function. Call UpdateData to initialize a dialog box’s controls or retrieve data from a dialog box.就是说此函数永远不被直接调用,它只是呼叫UpdateData函数时才会被调用。
    UpdateData函数内部调用了DoDataExchange。该函数只有一个布尔型参数,它决定了数据传送的方向。调用UpdateData(TRUE)将数据从对话框的控件中传送到对应的数据成员中,调用UpdateData(FALSE)则将数据从数据成员中传送给对应的控件。
    UpdateData(FALSE)是将变量的值传到控件,表示对话框正在初始化。
    UpdateData(TRUE)是从控件中取值到关联的变量,表示数据正在获取。

二.DDX、DDV

    对话框数据交换负责数据在控件中的进出。当对话首次出现的时候,每个控件窗口自动用相应的成员变量的值进行初始化。当用户通过单击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的基类的名字。

使用BEGIN_MESSAGE_MAP宏开始你的消息映射的定义。
在你的类的成员函数的实现文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏开始消息映射,然后为每个消息处理函数加入一个入口,最后用END_MESSAGE_MAP宏结束消息映射。
每个消息映射入口的格式如下:
ON_Notification(id, memberFxn)
其中id指定了发送通知的控件的子窗口的ID,而memberFxn指定了处理该通知的父对象中的成员函数名。
父对象的函数原型格式如下:
afx_msg void memberFxn( );
可能的消息映射入口如下:
映射入口
何时向父对象发送消息
ON_BN_CLICKED
用户单击按钮时
ON_BN_DOUBLECLICKED
用户双击按钮时
    

只要是CCmdTarget(用于所有能够消息映射的基类)派生类,必有消息映射以处理消息,则在类的说明文件的尾部有DECLARE_MESSAGE_MAP宏,在类的定义文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以处理用户消息。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值