Chinaunix首页 | 论坛 | 博客
  • 博客访问: 454255
  • 博文数量: 42
  • 博客积分: 3005
  • 博客等级: 中校
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-03 14:30
文章分类

全部博文(42)

文章存档

2008年(42)

我的朋友

分类: C/C++

2008-09-12 07:47:21

关于WM_NOTIFY的使用方法
           
    切记:此消息只发给它的父窗口,再要发给父窗口的父窗口或主框架窗口等上级窗口,必须在DefWindowProc中用如下语句进行转发
    switch(message)
    {
        case WM_NOTIFY:
             theApp.GetMainFrame()->SendNotifyMessage(message, wParam, lParam);
             break;
        default:
             break;
    }

    WM_NOTIF在WIN32中得到大量的应用,同时也是随着CommControl的出现WM_NOTIFY成为了CommControl的基本消息。可以这样说CommControl的所有的新增特性都通过WM_NOTIFY来表达。同时WM_NOTIFY也为CommControl的操作带来了一致性。
    WM_NOTIFY消息中的参数如下:
    idCtrl = (int) wParam;
    pnmh = (LPNMHDR) lParam; 其中lParam为一个
    typedef struct tagNMHDR {
        HWND hwndFrom; //发送通知消息的控制窗口句柄
        UINT idFrom;   //发送通知消息的控制ID值
        UINT code;     //通知码,如LVM_SELCHANGED
    } NMHDR;
           
    结构指针从消息的参数我们已经可以分辩出消息的来源,但是这些信息还不足以分辩出消息的具体含义。所以我们需要更多的数据来得到更多的信息。MS的做法是对每种不同用途的通知消息都定义另一种结构来表示,同时这中结构里包含了struct tagNMHDR,所以你只要进行一下类型转换就可以得到数据指针。例如对于LVN_COLUMNCLICK消息(用于在ListCtrl的列表头有鼠标点击是进行通知),结构为;
    typedef struct tagNMLISTVIEW{
        NMHDR   hdr;
        int     iItem;
        int     iSubItem;
        UINT    uNewState;
        UINT    uOldState;
        UINT    uChanged;
        POINT   ptAction;
        LPARAM  lParam;
    } NMLISTVIEW, FAR *LPNMLISTVIEW;
    在这个结构的最开始也就包含了struct tagNMHDR,所以在不损失数据和产生错误的情况下向处理消息的进程提供了更多的信息。

    此外通过WM_NOTIFY我们可以一种完全一样的方式进行消息映射,如同在前几章中所见到的一样。
    使用如下形式:ON_NOTIFY( wNotifyCode, id, memberFxn )。
    处理函数也有统一的原型:afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
    在MFC消息映射的内部将根据定义消息映射时所使用的wNotifyCode和WM_NOTIFY中参数中pnmh->code(pnmh = (LPNMHDR) lParam)进行匹配,然后调用相应的处理函数。
    还有一点是利用WM_NOTIFY/ON_NOTIFY_REFLECT可以在窗口内部处理一些消息,从而建立可重用的控件。大家可以参考Build Reusable MFC Control Classes。目前我也准备在空闲时翻译这篇文章。
 
阅读(8818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~