当在Windows XP中单击项目复选框时,CTreeCtrl'TVN_ITEMCHANGED'没有被解雇?

Siv*_*iva 1 mfc windows-xp

我有树控件,Tree控件由Root节点组成,并且根节点由一个子节点组成,此子节点由3个节点组成.这个treecontrol在一个属性页面上,在我单击任何复选框后我启用向导TVN_ITEMCHANGED按钮.在事件处理程序中我启用了工作表按钮.

当我运行我的应用程序并检查treecontrol的节点后,我无法启用工作表按钮.我已经看到代码是绝对正常的我在检查节点的检查状态和启用工作表按钮.我开始调试我的代码,首先它是NM_CLICK被解雇然后我期待TVN_ITEMCHANGED事件被解雇但它根本没有被解雇.

我不知道为什么这个事件没有被解雇,我正在使用的环境是WindowsXP.

我跑我的应用程序windows7,windows 8,windows vista.有它工作正常,但在XP只有我想通了这种行为.

任何人都可以帮我解决这个问题.

Rog*_*and 5

根据MSKB,单击复选框时,您不会收到特定通知.

在具有TVS_CHECKBOXES样式的TreeView控件上,不会通知已更改项目的已检查状态.也没有通知表明项目的状态已更改.但是,您可以确定用户已单击项目的状态图标并对其进行操作.

引用该文章:

当用户单击TreeView项的复选框时,会向父窗口发送NM_CLICK通知.发生这种情况时,TVM_HITTEST消息返回TVHT_ONITEMSTATEICON.TreeView控件使用相同的条件来切​​换复选框的状态.不幸的是,TreeView控件在发送NM_CLICK通知后切换状态.

您可以将用户定义的消息发布到处理NM_CLICK通知的同一窗口,并将此用户定义的消息视为已检查状态已更改的通知.以下示例代码说明了如何实现此目的:

使用相关的示例代码:

#define UM_CHECKSTATECHANGE (WM_USER + 100)

case WM_NOTIFY:
{
   LPNMHDR lpnmh = (LPNMHDR) lParam;
   TVHITTESTINFO ht = {0};

   if(lpnmh->code  == NM_CLICK) && (lpnmh->idFrom == IDC_MYTREE))
   {
      DWORD dwpos = GetMessagePos();

      // include <windowsx.h> and <windows.h> header files
      ht.pt.x = GET_X_LPARAM(dwpos);
      ht.pt.y = GET_Y_LPARAM(dwpos);
      MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);

      TreeView_HitTest(lpnmh->hwndFrom, &ht);

      if(TVHT_ONITEMSTATEICON & ht.flags)
      {

         PostMessage(hWnd, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem);
      }
   }
}
break;

case UM_CHECKSTATECHANGE:
   {
   HTREEITEM   hItemChanged = (HTREEITEM)lParam;
   /*
   Retrieve the new checked state of the item and handle the notification.
   */ 
   }
break;
Run Code Online (Sandbox Code Playgroud)