您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 开发专栏 > Visual C++开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

谈谈MFC中的消息映射
2001-03-14· ·向桢··yesky

上一页  1 2 3 4  


  控件通知消息相对而言就复杂一点了.限于篇幅不能一一涉及.这里我们仅讨论 WM_NOTIFY消息的处理.

  WM_NOTFY产生的原因如下。

  在WINDOWS3.X中控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口.简单的通知仅发送一个WM_COMMAND消息.包含一个通知码(比如BN_CLICKED)和一个在wParam中的控件ID及一个在lPraram中的控件句柄.因为wParam 和lParam均被使用.就没有方法传送其它的附加信息了.比如在BN_CLICKED 通知消息中.就没有办法发送关于当鼠标点击时光标的位置信息.在这种情况下就只能使用一些特殊的消息.包括:WM_CTLCOLOR,WM_VSCROLL, WM_HSCROLL等等.值得一提的是这些消息能被反射回发送它们的控件.就是所谓的消息反射.有兴趣的读者请参阅有关专著.

  在WIN32中同样可以使用那些在WINDOWS3.1中使用的通知消息.不过不像过去通过增加特殊目的的消息来为新的通知发送附加的数据.而是使用一个叫 WM_NOTIFY的消息,它能以一个标准的风格传送大量的附加数据.
WM_NOTIFY消息包含一个存在wParam中的发送消息控件的ID和一个存在 lParam中的指向一个结构体的指针.这个结构可能是NMHDR结构体.也可能是第一个成员是NMHDR的更大的结构.因为NMHDR是第一个成员,所以指向这个结构的指针也可以指向NMHDR.

  在许多情况下,这个指针将指向一个更大的结构,当你使用时必需转换它.只有很少的通知消息.比如通用通知消息(它的名字以NM_打头),工具提示控件的 TTN_SHOW和TTN_POP实际上在使用NMHDR结构.

  NMHDR结构包含了发送消息控件的句柄,ID及通知码(如TTN_SHOW),其格式如下:

   Typedef sturct tagNMHDR{

    HWND hwndFrom;

    UINT idFrom;

    UINT code;

   } NMHDR;

  对TTN_SHOW消息而言,code成员的值将设为TTN_SHOW.

  类向导可以创建ON_NOTIFY消息映射入口并为你提供一个处理函数的框架.来处理 WM_NOTIFY类型的消息.ON_NOTIFY消息映射宏有如下语法.

   ON_NOTIFY(wNotifyCode,id,memberFxn)

  数意义如下:

   wNotifyCode:要处理的通知消息通知码。比如:LVN_KEYDOWN.

   Id:控件标识ID.

   MemberFxn:处理此消息的成员函数.

  此成员函数必需有如下的原形申明:

   afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result);

  比如:假设你想成员函数OnKeydownList1处理ClistCtrl(标识ID=IDC_LIST1)的 LVN_KEYDOWN消息,你可以使用类向导添加如下的消息映射:

   ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )

  在上面的例子中,类向导提供如下函数:

   void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)

    {

     LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;

     // TODO: Add your control notification handler

     // code here

     *pResult = 0;

     }

   这时类向导提供了一个适当类型的指针.你既可以通过pNMHDR,也可以通过 pLVKeyDow来访问这个通知结构。

  如前所述,有时我们可能需要为一组控件处理相同的WM_NOTIFY消息.这时需要使用ON_NOTIFY_RANGE而不是ON_NOTIFY.当你使用 ON_NOTIFY_RANGE时,你需要指定控件的ID范围.其消息映射入口及函数原型如下:

   ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

    参数说明:

     wNotifyCode:消息通知码.比如:LVN_KEYDOWN,

     id: 第一控件的标识ID。

     idLast:最后一个控件的标识ID。(标识值一定要连续)

     memberFxn: 消息处理函数。

    成员函数必须有如下原型申明:

    afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

    其中id的表示发送通知消息的控件标识ID

  结束语:

  于目前介绍MFC消息映射的资料甚少.而这部分内容对编程又相当重要.本文简要地介绍了MFC中的几种重要的消息映射处理.但基于篇幅有限没能作更全面更深入的探讨.

上一页  1 2 3 4  

■ 相关内容
 COM中的可连接对象与连接点机制及其MFC程序实现
 在VC++6.0中用MFC进行COM编程
 MFC中自由使用自定义消息
 MFC中自由使用自定义消息
 截取部分文件的VB编程技巧
 C++辨析系列谈(二)
 C++辨析系列之前言
 WEB服务器配置全功略
 C++辨析系列谈(三)
 C++辨析系列谈(一)
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!