前些天有人在论坛里问在动态创建TreeCtrl后怎么响应消息,于是便写了一点自己的心得,现整理如下。

1.DDX_Control 与 DDX_Text 区别

  本例在view中动态创建一个ListCtrl并响应其NM_CLICK消息,先写出动态创建的代码:

DDX_TEXT()的作用可以理解为把字符串变量和控件的文本(WindowText)关联起来, 
DDX_Control()的作用可以理解为把变量和控件本身关联起来,
 
DoDataExchange(pDX)就是处理所有变量与其关联控件交换数据的函数。

    新建一SDI工程,给view加上一个成员变量:
 CListCtrl m_list;
    在view的OnCreate中创建它:
 if(!m_list.Create(WS_BORDER |WS_CHILD|WS_VISIBLE|LVS_ICON
|LVS_AUTOARRANGE|LVS_SHOWSELALWAYS|LVS_EDITLABELS,CRect(10,10,310,210),this,ID_LISTCTRL))
 {
  TRACE0(“Failed to create ListCtrl windown”);
  return -1;
 }
 //添加一些项
 CString str;
 for(int i=0;i<10;i++)
 {
  str.Format(“item%d”,i);
  m_list.InsertItem(i,str);
 }
   
其中的ID_LISTCTRL是这个控件的ID,当然你可以直接用数值来表示,但为了程序清淅还是定义一个常量的好,在主菜单View->Resource
Symbols弹出的对话框中点击New按钮,在Name下面输入ID_LISTCTRL.

void CView::DoDataExchange(CDataExchange* pDX)

CFormView::DoDataExchange(pDX);
DDX_Text(pDX, IDC_ID_VALUE, m_strID);
DDX_Control(pDX, IDC_ID_VALUE, m_editID);

在程序中
通过update(TRUE)取得控件上的值到m_strID,处理修改后通过update(FALSE)传回控件,界面显示
通过m_editID.GetWindText(str),取得值,处理后,通过m_editID.SetWindText(str)传回控件界面显示

   
创建完毕,编译链接后就可以运行了,但你怎么点击它都没反应,当然,因为我们还没写消息处理的代码。
  通常做法是手动写消息处理函数及消息映射,至少得三步:1,在头文件中定义消息处理函数的原型,2,在cpp中实现这个函数,3,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间写上消息映射。如果是单单处理一个消息的话那还可以忍受,消息一多的话不但麻烦还容易出错。
  
    所以我采取下面的方法:
   
1.打开about对话框资源,放入一个ListCtrl控件到对话框中,并将其ID设为ID_LISTCTRL.
    2.Ctrl+W,把Class Name由原来的CAboutDlg改为CxxxView,在左边的Object
IDS中选择ID_LISTCTRL,这时右边会出现相应的通知消息,这时就可以跟平常一样双击添加消息映射了.
    嘿嘿,是不是跟在对话框里响应控件的消息一样很方便呀.
   
有一点需要注意,只有当打开你加入控件的那个对话框资源编辑器的时候按Ctrl+W时,Class
Wizard中才会出现那个ID_LISTCTRL,还有发行时注意把对话框上的listctrl控件删掉.

2.MFC BEGIN_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CpassApp, CWinApp)
    ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()

这些都是宏定义,不是函数。 
在BEGIN_澳门新葡亰游戏网址,MESSAGE_MAP()和END_MESSAGE_MAP()之间添加你的消息响应函数,为每个消息处理函数加入一个入口

BEGIN_MESSAGE_MAP( theClass, baseClass
)

参数:

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 用户双击按钮时

3.ON_COMMAND和ON_MESSAGE的区别

网站地图xml地图