Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Setting Children Nodes of Tree View Based on Parent Node [modified]

Setting Children Nodes of Tree View Based on Parent Node [modified]

Scheduled Pinned Locked Moved C / C++ / MFC
helpjavascriptdata-structures
15 Posts 3 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Stuck At Zero

    I originally tried doing a message map of the OnNotify that I saw elsewhere through googling, but there does not seem to be a notification appropriate for what I want to do. I was using item check state to see if the node which has the user's focus was checked or not. The idea was that once a user clicks on a node within the tree view, OnNotify would fire off and it would check to see if the node was selected or not. Depending on its state, I would either select or deselect all decedent nodes from the node the user selected.

    M Offline
    M Offline
    Mark Salsbery
    wrote on last edited by
    #6

    What about something like this:

    BOOL CViewFilter::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    if (wParam == IDC_TREE1)
    {
    NMHDR *pHdr = (NMHDR *)lParam;

    if (pHdr->code == TVN\_SELCHANGED)
    {
      LPNMTREEVIEW pNMTreeView = (LPNMTREEVIEW)lParam;
    
      // pNMTreeView->itemNew is the new selected item (TVITEM)
      // pNMTreeView->itemNew.hItem is the new selected item's HTREEITEM
    
      if (pNMTreeView->itemNew.hItem)
      {
        if (m\_filterTreeCtrl.GetCheck(pNMTreeView->itemNew.hItem))
        {
          // Select All Subsequent Children Nodes
          SetDecendentNodesOn(pNMTreeView->itemNew.hItem);
        }
        else
        {
          // Deselect All Subsequent Children Nodes
          SetDecendentNodesOff(pNMTreeView->itemNew.hItem);
        }
      }
    
      return TRUE;
    }
    

    }

    return CDialog::OnNotify(wParam, lParam, pResult);
    }

    Mark Salsbery Microsoft MVP - Visual C++ :java:

    S 1 Reply Last reply
    0
    • M Mark Salsbery

      What about something like this:

      BOOL CViewFilter::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
      {
      if (wParam == IDC_TREE1)
      {
      NMHDR *pHdr = (NMHDR *)lParam;

      if (pHdr->code == TVN\_SELCHANGED)
      {
        LPNMTREEVIEW pNMTreeView = (LPNMTREEVIEW)lParam;
      
        // pNMTreeView->itemNew is the new selected item (TVITEM)
        // pNMTreeView->itemNew.hItem is the new selected item's HTREEITEM
      
        if (pNMTreeView->itemNew.hItem)
        {
          if (m\_filterTreeCtrl.GetCheck(pNMTreeView->itemNew.hItem))
          {
            // Select All Subsequent Children Nodes
            SetDecendentNodesOn(pNMTreeView->itemNew.hItem);
          }
          else
          {
            // Deselect All Subsequent Children Nodes
            SetDecendentNodesOff(pNMTreeView->itemNew.hItem);
          }
        }
      
        return TRUE;
      }
      

      }

      return CDialog::OnNotify(wParam, lParam, pResult);
      }

      Mark Salsbery Microsoft MVP - Visual C++ :java:

      S Offline
      S Offline
      Stuck At Zero
      wrote on last edited by
      #7

      It only works on the very first mouse click for the first root node only. Decendent nodes nor any of the other root nodes have any effect on the OnNotify. After the first mouse click to either select / deselect the 1st root node, that root node then behaves like the other root nodes.

      M 1 Reply Last reply
      0
      • S Stuck At Zero

        It only works on the very first mouse click for the first root node only. Decendent nodes nor any of the other root nodes have any effect on the OnNotify. After the first mouse click to either select / deselect the 1st root node, that root node then behaves like the other root nodes.

        M Offline
        M Offline
        Mark Salsbery
        wrote on last edited by
        #8

        Do you call SetCheck anywhere? How do the items get their check state set? What's happening in your SetDecendentNodes functions? Have you put a breakpoint in the OnNotify? Are you getting notifications for all item selections?

        Mark Salsbery Microsoft MVP - Visual C++ :java:

        S 1 Reply Last reply
        0
        • M Mark Salsbery

          Do you call SetCheck anywhere? How do the items get their check state set? What's happening in your SetDecendentNodes functions? Have you put a breakpoint in the OnNotify? Are you getting notifications for all item selections?

          Mark Salsbery Microsoft MVP - Visual C++ :java:

          S Offline
          S Offline
          Stuck At Zero
          wrote on last edited by
          #9

          I do not call SetCheck. The nodes get their check state set whenever the user clicks on the node's box to check or uncheck the node.

          M 1 Reply Last reply
          0
          • S Stuck At Zero

            I do not call SetCheck. The nodes get their check state set whenever the user clicks on the node's box to check or uncheck the node.

            M Offline
            M Offline
            Mark Salsbery
            wrote on last edited by
            #10

            Ohhh.... Maybe you want the TVN_ITEMCHANGED notification instead of TVN_SELCHANGED

            BOOL CViewFilter::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
            {
            if (wParam == IDC_TREE1)
            {
            NMHDR *pHdr = (NMHDR *)lParam;

            if (pHdr->code == TVN\_ITEMCHANGED)
            {
              NMTVITEMCHANGE \*pNMTVItemChange = (NMTVITEMCHANGE \*)lParam;
            
              if (pNMTVItemChange->hItem)
              {
                if (m\_filterTreeCtrl.GetCheck(pNMTreeView->itemNew.hItem))
                {
                  // Select All Subsequent Children Nodes
                  SetDecendentNodesOn(pNMTVItemChange->hItem);
                }
                else
                {
                  // Deselect All Subsequent Children Nodes
                  SetDecendentNodesOff(pNMTVItemChange->hItem);
                }
              }
            
              return TRUE;
            }
            

            }

            return CDialog::OnNotify(wParam, lParam, pResult);
            }

            Mark Salsbery Microsoft MVP - Visual C++ :java:

            S 1 Reply Last reply
            0
            • M Mark Salsbery

              Ohhh.... Maybe you want the TVN_ITEMCHANGED notification instead of TVN_SELCHANGED

              BOOL CViewFilter::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
              {
              if (wParam == IDC_TREE1)
              {
              NMHDR *pHdr = (NMHDR *)lParam;

              if (pHdr->code == TVN\_ITEMCHANGED)
              {
                NMTVITEMCHANGE \*pNMTVItemChange = (NMTVITEMCHANGE \*)lParam;
              
                if (pNMTVItemChange->hItem)
                {
                  if (m\_filterTreeCtrl.GetCheck(pNMTreeView->itemNew.hItem))
                  {
                    // Select All Subsequent Children Nodes
                    SetDecendentNodesOn(pNMTVItemChange->hItem);
                  }
                  else
                  {
                    // Deselect All Subsequent Children Nodes
                    SetDecendentNodesOff(pNMTVItemChange->hItem);
                  }
                }
              
                return TRUE;
              }
              

              }

              return CDialog::OnNotify(wParam, lParam, pResult);
              }

              Mark Salsbery Microsoft MVP - Visual C++ :java:

              S Offline
              S Offline
              Stuck At Zero
              wrote on last edited by
              #11

              Yeah, that was one I had tried using before but the problem is you need Windows Vista to use it. I'm running on XP Pro.

              M 1 Reply Last reply
              0
              • S Stuck At Zero

                Yeah, that was one I had tried using before but the problem is you need Windows Vista to use it. I'm running on XP Pro.

                M Offline
                M Offline
                Mark Salsbery
                wrote on last edited by
                #12

                Stuck At Zero wrote:

                the problem is you need Windows Vista to use it

                There's other OSs? Do you get any notification in XP when you check/uncheck an item? If so, what is the code? Mark

                Mark Salsbery Microsoft MVP - Visual C++ :java:

                S 1 Reply Last reply
                0
                • M Mark Salsbery

                  Stuck At Zero wrote:

                  the problem is you need Windows Vista to use it

                  There's other OSs? Do you get any notification in XP when you check/uncheck an item? If so, what is the code? Mark

                  Mark Salsbery Microsoft MVP - Visual C++ :java:

                  S Offline
                  S Offline
                  Stuck At Zero
                  wrote on last edited by
                  #13

                  I do not know how to find any other notification in XP other than what's listed in MSDN.... but the one you just recommended is here: http://msdn.microsoft.com/en-us/library/bb773526(VS.85).aspx It says the minimum operating system is Windows Vista.

                  M 1 Reply Last reply
                  0
                  • S Stuck At Zero

                    I do not know how to find any other notification in XP other than what's listed in MSDN.... but the one you just recommended is here: http://msdn.microsoft.com/en-us/library/bb773526(VS.85).aspx It says the minimum operating system is Windows Vista.

                    M Offline
                    M Offline
                    Mark Salsbery
                    wrote on last edited by
                    #14

                    I really thought it was available on XP. The macro is wrapped in "#if (_WIN32_IE >= 0x0600)" which seems to indicate a common controls version 6 or better feature. If you define _WIN32_IE to something >= 0x0600 does it work on XP? I don't have a handy XP machine to test on. Also, have you tried (in the debugger)to see if there's any notification sent when you change the check state? I'm interested in what notification code it is if there is one.

                    Mark Salsbery Microsoft MVP - Visual C++ :java:

                    S 1 Reply Last reply
                    0
                    • M Mark Salsbery

                      I really thought it was available on XP. The macro is wrapped in "#if (_WIN32_IE >= 0x0600)" which seems to indicate a common controls version 6 or better feature. If you define _WIN32_IE to something >= 0x0600 does it work on XP? I don't have a handy XP machine to test on. Also, have you tried (in the debugger)to see if there's any notification sent when you change the check state? I'm interested in what notification code it is if there is one.

                      Mark Salsbery Microsoft MVP - Visual C++ :java:

                      S Offline
                      S Offline
                      Stuck At Zero
                      wrote on last edited by
                      #15

                      I couldn't figure out how to filter out the other things OnNotify would trigger, but I believe part of my problem seems to be that the hItem is what the TreeView has as a keyboard highlighted region rather than the actual node clicked on by mouse. Do you have any ideas as to change hItem to reflect what is actually clicked on by the mouse and thus ignore the keyboard rectangular region that highlights the 1st root node or changes if I use my keyboard to move it around? In other words,

                      HTREEITEM hItem = m_filterTreeCtrl.GetSelectedItem(); // Keyboard Highlighted Region

                      Is not with respect to the node I click on with my mouse.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups