我用ATL做一控件,BASE ON SYSTREEVIEW32,但在控件中我想在用户改变选项后,做出一些处理,我想应该要处理WM_NOTIFY消息,是吗?我在Add Windows Message Handler中却无论如何也找不到WM_NOTIFY,请问我该如何处理systreeview的通知消息?
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( ... ) { ... }};
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++查也是一样,请问为什么?
{
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( ... )
{ ... }};
在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++查也是一样,请问为什么?