Thread: C++ - Win32 - Finding out selected treeview item

  1. #1
    Registered User
    Join Date
    Oct 2007
    Posts
    4

    C++ - Win32 - Finding out selected treeview item

    The following is the code I have managed to write so far for my GUI:

    Code:
    #include "QSDCHub.h"
    #include "stdafx.h"
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
    	case WM_NOTIFY:
    		switch(LOWORD(wParam))
    		{
    		case IDC_TVMAIN:
    			{
    				switch(((LPNMHDR) lParam)->code)
    				{
    				case NM_CLICK:
    					//This is where I am stuck... I would like a conditional statement so if a particular item is selected, it performs a particular function (like showing a dialog that is a child of the main form)
    				break;
    				}
    			}
    			break;
    		}
    		break;
    		case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    HTREEITEM AddItemToTree(HWND hwndTrV, LPSTR lpszItem, int nLevel)
    { 
        TVITEM tvi; 
        TVINSERTSTRUCT tvins; 
        static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; 
        static HTREEITEM hPrevRootItem = NULL; 
        static HTREEITEM hPrevLev2Item = NULL; 
        HTREEITEM hti; 
    
        tvi.mask = TVIF_TEXT | TVIF_IMAGE 
                   | TVIF_SELECTEDIMAGE | TVIF_PARAM; 
    
        tvi.pszText = LPWSTR(lpszItem); 
        tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]); 
    
        tvi.lParam = (LPARAM)nLevel; 
        tvins.item = tvi; 
        tvins.hInsertAfter = hPrev; 
    
        if (nLevel == 1) 
            tvins.hParent = TVI_ROOT; 
        else if (nLevel == 2) 
            tvins.hParent = hPrevRootItem; 
        else 
            tvins.hParent = hPrevLev2Item; 
    
        hPrev = (HTREEITEM)SendMessage(hwndTrV, 
                                       TVM_INSERTITEM, 
                                       0,
                                       (LPARAM)(LPTVINSERTSTRUCT)&tvins); 
    
        if (nLevel == 1)
            hPrevRootItem = hPrev; 
        else if (nLevel == 2) 
            hPrevLev2Item = hPrev; 
    
        if (nLevel > 1)
        { 
            hti = TreeView_GetParent(hwndTrV, hPrev); 
            tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
            tvi.hItem = hti; 
            TreeView_SetItem(hwndTrV, &tvi); 
        } 
    
        return hPrev; 
    } 
    
    BOOL InitTreeViewImageLists(HWND hwndTV) 
    { 
        return TRUE; 
    } 
    
    BOOL InitTreeViewItems(HWND hwndTrV) 
    {
        int nLevel;
    
             AddItemToTree(hwndTrV, LPSTR(TEXT("Main")), 2); 
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Hub Statistics")), -1);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Appearance")), -1);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Network")), -1);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Hublists")), -1);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Expert Settings")), -1);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("User Settings")), 2);
    		 AddItemToTree(hwndTrV, LPSTR(TEXT("Bots")), -1);
    
    		 return TRUE;
    } 
    
    HWND CreateTreeView(HWND parent)
    {
    	HWND hwndTrV;
    	RECT rcClient;
    
    	GetClientRect(parent, &rcClient);
    	hwndTrV = CreateWindowEx(0, WC_TREEVIEW, TEXT("TV_Menu"), 
    		WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, 
    		0, 0, 150, rcClient.bottom, parent,
    		(HMENU)IDC_TVMAIN, GetModuleHandle(NULL), NULL);
    	    
    	
    	if (!InitTreeViewItems(hwndTrV))
        { 
            DestroyWindow(hwndTrV); 
            return FALSE; 
        }
    	return hwndTrV;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BLKSRV));
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = TEXT("QSDCHubMain");
        wc.hIconSm       = LoadIcon(wc.hInstance, MAKEINTRESOURCE(IDI_BLKSRV));
    
        if(!RegisterClassEx(&wc))
        {
            MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error!"),
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
    		TEXT("QSDCHubMain"),
            TEXT("QSDCHub"),
            WS_BORDER | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 440,
            NULL, NULL, hInstance, NULL);
    
    	CreateTreeView(hwnd);
    
    
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error!"),
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    In WndProc, i have commented exactly where I am stuck. I do not know what to do from here and have tried looking through other places for a solution to this dilemma.

  2. #2
    Registered User
    Join Date
    Oct 2007
    Posts
    4
    It would also make my life easier if I can find out what the name of the selected treeview node is.

  3. #3
    Registered User
    Join Date
    Oct 2007
    Posts
    4
    I have solved this problem now. And in case anyone has the same problem, here is how I did it. I am sure there are more elegant ways of coding this, but this is what I came up with:

    First, I initialized values on the top of my source that will store addresses to the treeview items:


    Code:
    static HTREEITEM TVI_MAIN = NULL;
    static HTREEITEM TVI_HSTATS = NULL;
    static HTREEITEM TVI_APP = NULL;
    static HTREEITEM TVI_NTWRK = NULL;
    static HTREEITEM TVI_HLST = NULL;
    static HTREEITEM TVI_SETEX = NULL;
    static HTREEITEM TVI_USET = NULL;
    static HTREEITEM TVI_BOTS = NULL;
    Then, in AddItemToTree, I specified a pointer to the static value of the item being added's handle:

    Code:
    HTREEITEM *TrI = NULL;
    In the same function, I specified which values to place where:

    Code:
    	if(lpszItem == "Main") { TrI = &TVI_MAIN; *TrI = hPrev; }
    	else if(lpszItem == "Hub Statistics") { TrI = &TVI_HSTATS; *TrI = hPrev; }
    	else if(lpszItem == "Appearance") { TrI = &TVI_APP; *TrI = hPrev; }
    	else if(lpszItem == "Network") { TrI = &TVI_NTWRK; *TrI = hPrev; }
    	else if(lpszItem == "Hublists") { TrI = &TVI_HLST; *TrI = hPrev; }
    	else if(lpszItem == "Expert Settings") { TrI = &TVI_SETEX; *TrI = hPrev; }
    	else if(lpszItem == "User Settings") { TrI = &TVI_USET; *TrI = hPrev; }
    	else if(lpszItem == "Bots") { TrI = &TVI_BOTS; *TrI = hPrev; }
    So my entire code ends up like this (The following code will send a message box indicating the selected Item in the treeview when selection is changed):

    Code:
    #include "QSDCHub.h"
    #include "stdafx.h"
    
    using namespace std;
    
    static HTREEITEM TVI_MAIN = NULL;
    static HTREEITEM TVI_HSTATS = NULL;
    static HTREEITEM TVI_APP = NULL;
    static HTREEITEM TVI_NTWRK = NULL;
    static HTREEITEM TVI_HLST = NULL;
    static HTREEITEM TVI_SETEX = NULL;
    static HTREEITEM TVI_USET = NULL;
    static HTREEITEM TVI_BOTS = NULL;
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	NMHDR  *nmptr;
        switch(msg)
        {
    	case WM_NOTIFY:
    		switch(LOWORD(wParam))
    		{
    		case IDC_TVMAIN:
    			{
    				nmptr = (LPNMHDR) lParam;
    				switch(nmptr->code)
    				{
    				case TVN_SELCHANGED:
    					{
    						std::stringstream ss;
    						HTREEITEM tvi = ((LPNM_TREEVIEW)nmptr)->itemNew.hItem;
    						if(tvi == TVI_MAIN) { ss << "Selected Item : Main";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK);}
    						else if(tvi == TVI_HSTATS) { ss << "Selected Item : Hub Statistics";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_APP) { ss << "Selected Item : Appearance";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_NTWRK) { ss << "Selected Item : Network";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_HLST) { ss << "Selected Item : Hublists";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_SETEX) { ss << "Selected Item : Expert Settings";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_USET) { ss << "Selected Item : User Settings";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    						else if(tvi == TVI_BOTS) { ss << "Selected Item : Bots";
    							MessageBox(NULL, ss.str().c_str(), "Item Selection", MB_OK); }
    					}	
    				break;
    				}
    			}
    			break;
    		}
    		break;
    		case WM_COMMAND:
    			switch(wParam)
    			{
    
    			}
    		break;
    		case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    HTREEITEM AddItemToTree(HWND hwndTrV, LPSTR lpszItem, int nLevel)
    { 
        TVITEM tvi; 
        TVINSERTSTRUCT tvins; 
        static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; 
        static HTREEITEM hPrevRootItem = NULL; 
        static HTREEITEM hPrevLev2Item = NULL; 
        HTREEITEM hti;
    	HTREEITEM *TrI = NULL;
    
        tvi.mask = TVIF_TEXT | TVIF_IMAGE 
                   | TVIF_SELECTEDIMAGE | TVIF_PARAM; 
    
        tvi.pszText = lpszItem; 
        tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]); 
    
        tvi.lParam = (LPARAM)nLevel; 
        tvins.item = tvi; 
        tvins.hInsertAfter = hPrev; 
    
        if (nLevel == 1) 
            tvins.hParent = TVI_ROOT; 
        else if (nLevel == 2) 
            tvins.hParent = hPrevRootItem; 
        else 
            tvins.hParent = hPrevLev2Item; 
    
        hPrev = (HTREEITEM)SendMessage(hwndTrV, 
                                       TVM_INSERTITEM, 
                                       0,
                                       (LPARAM)(LPTVINSERTSTRUCT)&tvins); 
    
        if (nLevel == 1)
            hPrevRootItem = hPrev; 
        else if (nLevel == 2) 
            hPrevLev2Item = hPrev; 
    
    	if(lpszItem == "Main") { TrI = &TVI_MAIN; *TrI = hPrev; }
    	else if(lpszItem == "Hub Statistics") { TrI = &TVI_HSTATS; *TrI = hPrev; }
    	else if(lpszItem == "Appearance") { TrI = &TVI_APP; *TrI = hPrev; }
    	else if(lpszItem == "Network") { TrI = &TVI_NTWRK; *TrI = hPrev; }
    	else if(lpszItem == "Hublists") { TrI = &TVI_HLST; *TrI = hPrev; }
    	else if(lpszItem == "Expert Settings") { TrI = &TVI_SETEX; *TrI = hPrev; }
    	else if(lpszItem == "User Settings") { TrI = &TVI_USET; *TrI = hPrev; }
    	else if(lpszItem == "Bots") { TrI = &TVI_BOTS; *TrI = hPrev; }
    
        if (nLevel > 1)
        { 
            hti = TreeView_GetParent(hwndTrV, hPrev); 
            tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; 
            tvi.hItem = hti; 
            TreeView_SetItem(hwndTrV, &tvi); 
        } 
    
        return hPrev; 
    } 
    
    BOOL InitTreeViewImageLists(HWND hwndTV) 
    { 
        return TRUE; 
    } 
    
    BOOL InitTreeViewItems(HWND hwndTrV) 
    {
        int nLevel;
    
             AddItemToTree(hwndTrV, LPSTR("Main"), 2); 
    		 AddItemToTree(hwndTrV, LPSTR("Hub Statistics"), -1);
    		 AddItemToTree(hwndTrV, LPSTR("Appearance"), -1);
    		 AddItemToTree(hwndTrV, LPSTR("Network"), -1);
    		 AddItemToTree(hwndTrV, LPSTR("Hublists"), -1);
    		 AddItemToTree(hwndTrV, LPSTR("Expert Settings"), -1);
    		 AddItemToTree(hwndTrV, LPSTR("User Settings"), 2);
    		 AddItemToTree(hwndTrV, LPSTR("Bots"), -1);
    
    		 return TRUE;
    } 
    
    HWND CreateTreeView(HWND parent)
    {
    	HWND hwndTrV;
    	RECT rcClient;
    
    	GetClientRect(parent, &rcClient);
    	hwndTrV = CreateWindowEx(0, WC_TREEVIEW, "TV_Menu", 
    		WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES, 
    		0, 0, 150, rcClient.bottom, parent,
    		(HMENU)IDC_TVMAIN, GetModuleHandle(NULL), NULL);
    	    
    	
    	if (!InitTreeViewItems(hwndTrV))
        { 
            DestroyWindow(hwndTrV); 
            return FALSE; 
        }
    	return hwndTrV;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BLKSRV));
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = TEXT("QSDCHubMain");
        wc.hIconSm       = LoadIcon(wc.hInstance, MAKEINTRESOURCE(IDI_BLKSRV));
    
        if(!RegisterClassEx(&wc))
        {
            MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error!"),
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
    		TEXT("QSDCHubMain"),
            TEXT("QSDCHub"),
            WS_BORDER | WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640, 440,
            NULL, NULL, hInstance, NULL);
    
    	CreateTreeView(hwnd);
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error!"),
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Immediate programming help! Please!
    By xMEGANx in forum C++ Programming
    Replies: 6
    Last Post: 02-20-2008, 12:52 PM
  2. Retail Outlet Managment System - the 4th
    By Presidentofusa in forum C Programming
    Replies: 3
    Last Post: 11-10-2007, 10:44 PM
  3. Constructive Feed Back (Java Program)
    By xddxogm3 in forum Tech Board
    Replies: 12
    Last Post: 10-10-2004, 03:41 AM
  4. Struct *** initialization
    By Saravanan in forum C Programming
    Replies: 20
    Last Post: 10-09-2003, 12:04 PM
  5. Menu Item Caption - /a for right aligned Accelerator?
    By JasonD in forum Windows Programming
    Replies: 6
    Last Post: 06-25-2003, 11:14 AM