我用ATL做一控件,BASE ON SYSTREEVIEW32,但在控件中我想在用户改变选项后,做出一些处理,我想应该要处理WM_NOTIFY消息,是吗?我在Add Windows Message Handler中却无论如何也找不到WM_NOTIFY,请问我该如何处理systreeview的通知消息?

解决方案 »

  1.   

    class CMyClass : ...
    {
    public:
       ...   BEGIN_MSG_MAP(CMyClass)
          NOTIFY_HANDLER(IDC_MYCTL, NM_CLICK, OnClick)
          ...
       END_MSG_MAP()   // When a CMyClass object receives a WM_NOTIFY
       // message identified by IDC_MYCTL and NM_CLICK,
       // the message is directed to CMyClass::OnClick
       // for the actual processing.
       LRESULT OnClick( ... )
       { ... }};
      

  2.   

    谢谢二位,我手工添加消息映射如下:
    在BEGIN_MSG_MAP(CMyCtrlCass) 后:添加消息映射
    MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
    消息映射函数如下: LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary. ATLTRACE("In WM_NOTIFY, ((LPNMHDR) lParam)->code = %x\n",((LPNMHDR) lParam)->code);

    switch(((LPNMHDR) lParam)->code) {
    case TVN_SELCHANGING:
    ATLTRACE("TVN_SELCHANGING\n");
    break; case TVN_SELCHANGED:
    ATLTRACE("TVN_SELCHANGED\n");
    break;
    case TVN_GETDISPINFO:
    ATLTRACE("TVN_GETDISPINFO\n");
    break; case TVN_SETDISPINFO:
    ATLTRACE("TVN_SETDISPINFO\n");
    break; case TVN_ITEMEXPANDING:
    ATLTRACE("TVN_ITEMEXPANDING\n");
    break; case TVN_ITEMEXPANDED:
    ATLTRACE("TVN_ITEMEXPANDED\n");
    break; case TVN_BEGINDRAG:
    ATLTRACE("TVN_BEGINDRAG\n");
    break; case TVN_BEGINRDRAG:
    ATLTRACE("TVN_BEGINRDRAG\n");
    break; case TVN_DELETEITEM:
    ATLTRACE("TVN_DELETEITEM\n");
    break; case TVN_BEGINLABELEDIT:
    ATLTRACE("TVN_BEGINLABELEDIT\n");
    break; case TVN_ENDLABELEDIT:
    ATLTRACE("TVN_ENDLABELEDIT\n");
    break; case TVN_KEYDOWN:
    ATLTRACE("TVN_KEYDOWN\n");
    break; } m_ctlSysTreeView32.DefWindowProc(uMsg,wParam,lParam);
    return 0;
    }但问题是我每次改变选择的项目,或展开树,代码都不会执行到SWITCH子句里,((LPNMHDR) lParam)->code 每次都是fffffdee,用spy++查也是一样,请问为什么?