[普通]关于WM_NOTIFY的使用方法

作者(passion) 阅读(917次) 评论(0) 分类( 软件)

         
    切记:此消息只发给它的父窗口,再要发给父窗口的父窗口或主框架窗口等上级窗口,必须在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


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:ASP.NET附加数据库文件的方式,如何发布到IIS7而不导致SQLServer出错
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img