MFC控件的消息问题

在对话框中:UpdateData函数实现控件的控制,UpdateData(FALSE)时,数据由控件相关联的成员变量相控件传输;UpdateData(TRUE)或不带参数时则是相反的传输。

一,控件

1,在窗口上拖动,然后修改属性,建立相应的事件处理;(2)采用Create()函数创建。

2,DDX---数据与控件相连,在对控件添加变量时最好的命名方式是采用m_控件ID名,这样比较清楚。可以为同一控件添加多个数据成员变量,但必须保证这些变量名是互不相同的,。。。。。

DDV---数据校验。                                    

3,CWnd::UpdateData函数实现控件的控制,UpdateData(FALSE)时,数据由控件相关联的成员变量相控件传输;UpdateData(TRUE)或不带参数时则是相反的传输。

注意:控件如CButton类对象继承了其基类CWnd的特性,所以可以调用基类的成员函数,如SetWindowText来改变控件的标题,或者用GetDlgItem来获取指针,然后。。。。。

4,控件的消息。--包括消息的传递、接受和处理。用户可以向控件发送消息来完成特定的任务,或者是根据控件的产生消息执行自己的代码。控件在状态发生改变时向父窗口发送“通知“消息,消息的结构为MSG:

控件的WM_COMMAND和WM_NOTIFY消息,用户可以重载他们。

(1.对于特消息发送的通知消息,例如WM_CTLCOLOR,如果在父窗口中用户并未写代码响应此消息,则可以由控件自身响应消息.而如果用户在父窗口中响应了通知消息,并且没有调用基类的实现,则消息不被反射.即使控件自身类中有该消息的响应函数及消息映射宏,该函数也不会被调用。

(2.对于以WM_COMMAND形式发送的通知消息,比如BN_CLICKED,CBN_SELCHANGE等,如果要在控件的父窗口与控件同时响应此通知消息,则在控件自身响应此消息时,必须使用ON_CONTROL_REFLECT_EX宏进行消息映射,若函数返回TRUE,则表明控件对于此消息的响应为完全响应父窗口中没有必要再进行响应,从而即使在父窗口中有响应函数,该响应函数也不会被执行.而如果父窗口中再次进行进行信息处理,需返回FALSE.

(3.对于以WM_NOTIFY形式发送的通知消息,比如TVL_SELCHANGE,如果要在控件的父窗口与控件中同时响应此消息,则在控件自身响应此消息时,必须使用ON_NOTFY_REFLECT_EX宏,返回值同上.

控件通过向父窗口发送控件通知消息来表明发生了某种事件.例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送BN_CLICKED消息.传统控件的通知消息实际上是通过WM_COMMAND消息发给父窗口的(滚动条除外),在该消息的wParam中含有通知消息码(如BN_CLICKED)和控件的ID,在lParam中则包含了控件的句柄.

          传统控件的消息映射宏是ON_XXXX,其中XXXX表示通知消息码,如BN_CLICKED.ON_XXXX消息映射如下所示,该宏有两个参数,一个是控件的ID,一个是消息处理函数名.

ON_XXXX(nID, memberFxn)

 消息处理函数的声明应该有如下形式: 

 afx_msg void memberFxn( ); 

例如,某按钮的BN_CLICKED消息的消息映射及其处理函数的声明如下所示 

 ON_BN_CLICKED(IDC_ADD,OnAdd) 

 afx_msg void OnAdd( ); 

技巧:

有时,为了处理方便,需要把多个ID连续的控件发出的相同消息映射到同一个处理函数上.这就要用到ON_CONTROL_RANGE宏.ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。例如,要处理一组单选按钮发出的BN_CLICKED消息,相应的消息映射如下所示: 

ON_CONTROL_RANGE(BN_CLICKED, IDC_FIRST, IDC_LAST, OnRadioClicked) 

 函数OnRadioClicked的声明如下,该函数比上面的OnAdd多了一个参数nID以说明发送通知消息的控件ID. 

 afx_msg void OnRadioClicked(UINT nID); 

 ClassWizard不支持ON_CONTROL_RANGE宏,所以需要手工建立消息映射和消息处理函数

5,EnableWindow()函数用于指定一个控件窗口禁用或允许使用,它取决于该函数的参数,为TRUE时可用,否则禁用。在复选框时自然可以指定一个变量为BOOL与此相对应。按钮的选中与否:SetCheck()和GetCheck();单选按钮则用CWnd的成员函数CheckRadioButton()和GetCheckedRadioButton(),

二,编辑框

CString的Format函数使任意类型的数据转换成一个字符串。采用。TrimLeft()和TrimRight()可以剪裁左右两边的空格。

static text ---静态编辑框也是有ID的,也可以输出文本,作为不可输入(区别edit控件)的显示输出框。比如成绩统计中总成绩,平均成绩等等。使用时要注意的是将IDC_STATIC改为其他,否则无法为其添加变量的。

有个问题:为编辑框控件增加对应的变量时,如果变量是float类型的话,那老是出错了,是vc.net2003会生产该变量,可以在类视图中看到,但随后其又自动消失了,真奇怪啊!如果变成int则不会,不懂为什么呢?

WM_INITDIALOG在VC++.NET2003中怎么没踪迹了啊!在重载中的OnInitDialog()了,这个函数在对话框的显示前产生,目的为此对应的对话框类设置一些控件或其他的初始化代码,以便对话框创建时自动调用

三,列表框

常常通过索引来确定,以0为基数的

基本操作:各个函数,特别是列表框的多项选择

列表框的通知消息

列表框的难点在于:列表框的项还有相关数据时的存取,SetItemData和SetItemData,对应的是GetItemData()和GetItemDataPtr();

你可能感兴趣的:(.net,command,mfc,float,任务)