使用节点和复选框创建TreeView

用户名

我已经创建了TreeView像这样:

TreeView=CreateWindowEx(0, WC_TREEVIEW, TEXT("Tree View"), WS_VISIBLE | WS_CHILD, 0, 0, 200, 500, hwnd, (HMENU)ID_TREE_VIEW, GetModuleHandle(NULL), NULL);

现在,我向其中添加了一个项目,如本网站上所示

没关系,但是经过数小时的谷歌搜索,我仍然没有找到以下问题的答案:

  1. 如何添加子项(节点)?

  2. 如何在每个项目上添加复选框(如何确定是否选中了指定的复选框)?

AlwaysLearningNewStuff

编辑#4:

为了响应OP的请求,我添加了一个示例,该示例从父节点中删除了复选框。

问题是,当用户选择一个节点并按空格键时,复选框仍会出现。

这个问题解决了这个问题。

编辑#3:

我添加了创建已被检查的节点的代码。

这是WM_CREATE处理程序中的第二个子预兆

编辑结束

case WM_CREATE:
    {
        // this is your treeview

        TreeView = CreateWindowEx(0, WC_TREEVIEW, 
            TEXT("Tree View"), WS_VISIBLE | WS_CHILD, 
            0, 0, 200, 500, 
            hwnd, (HMENU)ID_TREE_VIEW, GetModuleHandle(NULL), NULL);

        /************ enable checkboxes **************/

        DWORD dwStyle = GetWindowLong( TreeView , GWL_STYLE);
        dwStyle |= TVS_CHECKBOXES;
        SetWindowLongPtr( TreeView , GWL_STYLE, dwStyle );

        /************ add items and subitems **********/

        // add root item

        TVINSERTSTRUCT tvis = {0};

        tvis.item.mask = TVIF_TEXT;
        tvis.item.pszText = L"This is root item";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = TVI_ROOT;

        HTREEITEM hRootItem = reinterpret_cast<HTREEITEM>( SendMessage( TreeView , 
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

        // and here is an example of removing a checkbox 
        // from a specific item/subitem in case you ever need it

        TVITEM tvi;
        tvi.hItem = hRootItem ;
        tvi.mask = TVIF_STATE;
        tvi.stateMask = TVIS_STATEIMAGEMASK;
        tvi.state = 0;
        TreeView_SetItem( TreeView, &tvi );

        // add firts subitem for the hTreeItem

        memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

        tvis.item.mask = TVIF_TEXT;
        tvis.item.pszText = L"This is first subitem";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = hRootItem;

        HTREEITEM hTreeSubItem1 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView , 
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

        // now we insert second subitem for hRootItem

        memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

        tvis.item.mask = TVIF_TEXT | TVIF_STATE; // added extra flag
        tvis.item.pszText = L"This is second subitem";
        tvis.hInsertAfter = TVI_LAST;
        tvis.hParent = hRootItem;

        // for demonstration purposes let us check this node;
        // to do that add the following code, and add the extra flag for 
        // mask member like above
        tvis.item.stateMask = TVIS_STATEIMAGEMASK;
        tvis.item.state = 2 << 12;

        HTREEITEM hTreeSubItem2 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView , 
            TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

        // let us expand the root node so we can see if checked state is really set
        TreeView_Expand( TreeView, hRootItem, TVE_EXPAND );
    }
    return 0L;

编辑#2:

这是解释如何检查项目是否已被检查的部分(现在,当您单击复选框和按空格键时,它会正确检查!):

case WM_NOTIFY:
    {
        LPNMHDR lpnmh = (LPNMHDR) lParam;

        if( lpnmh->idFrom == ID_TREE_VIEW  )  // if this is our treeview control
        {
            switch( lpnmh->code )  // let us filter notifications
            {
            case TVN_KEYDOWN:  // tree has keyboard focus and user pressed a key
                {

                    LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)lParam; 

                    if( ptvkd->wVKey == VK_SPACE )  // if user pressed spacebar
                    {

                        // get the currently selected item
                        HTREEITEM ht = TreeView_GetSelection( ptvkd->hdr.hwndFrom );

                        // Prepare to test items state

                        TVITEM tvItem;

                        tvItem.mask = TVIF_HANDLE | TVIF_STATE;
                        tvItem.hItem = (HTREEITEM)ht;
                        tvItem.stateMask = TVIS_STATEIMAGEMASK;

                        // Request the information.
                        TreeView_GetItem( ptvkd->hdr.hwndFrom, &tvItem );

                        // Return zero if it's not checked, or nonzero otherwise.
                        if( (BOOL)(tvItem.state >> 12) - 1 )
                            MessageBox( hwnd, L"Not checked!", L"", MB_OK );
                        else
                            MessageBox( hwnd, L"Checked!", L"", MB_OK );

                    }
                }
                return 0L;  // see the documentation for TVN_KEYDOWN

            case NM_CLICK:  // user clicked on a tree
                {
                    TVHITTESTINFO ht = {0};

                    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)
                    {
                        // Prepare to receive the desired information.

                        TVITEM tvItem;

                        tvItem.mask = TVIF_HANDLE | TVIF_STATE;
                        tvItem.hItem = (HTREEITEM)ht.hItem;
                        tvItem.stateMask = TVIS_STATEIMAGEMASK;

                        // Request the information.
                        TreeView_GetItem( lpnmh->hwndFrom, &tvItem );

                        // Return zero if it's not checked, or nonzero otherwise.
                        if( (BOOL)(tvItem.state >> 12) - 1 )
                            MessageBox( hwnd, L"Not checked!", L"", MB_OK );
                        else
                            MessageBox( hwnd, L"Checked!", L"", MB_OK );

                    }
                }
            default:
                break;
        }
    }
}
break;

按下空格键时进行正确测试的相关想法是处理TVN_KEYDOWN消息。

我们使用此消息来填充NMTVKEYDOWN结构,该结构将为我们提供按下按钮的虚拟键代码以及HWND发送通知的树视图的虚拟键代码

现在,我们使用TreeView_GetItem()宏来获取当前选定的节点,并以与进行测试时相同的方式检查其状态。

我唯一的问题是有关文档的这一部分TVN_KEYDOWN

返回值

如果lParam的wVKey成员是字符键码,则该字符将用作增量搜索的一部分。返回非零以从增量搜索中排除字符,或者返回零以在搜索中包括字符。对于所有其他键,将忽略返回值。

我只是不知道如何处理返回结果,所以我提出了0L

重要说明:如果您需要从对话框过程中返回值,请使用以下方法:

SetWindowLongPtr( hwnd, DWLP_MSGRESULT, (LONG_PTR)1 );
return TRUE;

请参阅本文档中有关“返回值”的注释,并使用代替,以便您可以同时支持版本的 SetWindowLongPtrSetWindowLongx32x64Windows

仅此而已。希望您解决了问题。如果您需要进一步的帮助,请发表评论。

编辑结束

我从未检查过是否检查了树项目,但我相信对这个问题的公认答案是正确的方法。

笔记:

如果有人可以提供代码段来显示如何确定是否treeview检查节点,我将不胜感激

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

仅为Treeview父节点添加复选框WPF

来自分类Dev

TreeView复选框可用作C#.Net中的单个和单独的复选框

来自分类Dev

带有复选框和单选按钮的TreeView

来自分类Dev

使用复选框创建数组

来自分类Dev

使用复选框创建 SQL 查询

来自分类Dev

无法使用互斥复选框实现Treeview

来自分类Dev

如何使用复选框和搜索?

来自分类Dev

如何使用 php 和 ajax 创建 FILTER BY LOCATION(使用复选框)引擎

来自分类Dev

在TreeView上设置复选框的样式

来自分类Dev

如何在React钩子中使用CheckAll复选框创建复选框?

来自分类Dev

使用CSS和Bootstrap创建自定义复选框

来自分类Dev

如何使用AngularJS基于复选框检查和取消检查来创建chckbox列表?

来自分类Dev

使用has_many:通过fields_for和复选框来创建关联

来自分类Dev

使用jquery和bootstrap CSS创建动态复选框列表

来自分类Dev

使用has_many:通过fields_for和复选框来创建关联

来自分类Dev

在Javascript和Dhtmlx中创建复选框

来自分类Dev

使用HTML和CSS打印选中的复选框/复选框

来自分类Dev

使用HTML和CSS打印选中的复选框/复选框

来自分类Dev

使用任何选中的复选框启用/禁用所有输入和复选框

来自分类Dev

FormData和复选框

来自分类Dev

复选框和localStorage

来自分类Dev

如何使用Dojo创建复选框列表?

来自分类Dev

在AngularJs中使用Font Awesome创建复选框

来自分类Dev

使用C#管理jquery创建的复选框

来自分类Dev

Jade-如何使用复选框创建表

来自分类Dev

Tkinter-使用循环创建多个复选框

来自分类Dev

如何使用Vue创建具有值的复选框

来自分类Dev

使用C#管理jquery创建的复选框

来自分类Dev

使用复选框从结果集中创建表模型

Related 相关文章

热门标签

归档