DEV Community

海前 王
海前 王

Posted on

treectrl


// MFCApplication1Dlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"
#include"Resource.h"
#include<vector>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

///////////////////////////////////////////////
void InitTreeControl(CString strRoot, HTREEITEM hTreeItemParent = NULL);
///////////////////////////////////////////////////////////
CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
    , m_find(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    //  DDX_Text(pDX, IDC_EDIT1, treeCtrl);
    DDX_Text(pDX, IDC_EDIT1, m_find);
    DDX_Control(pDX, IDC_TREE1, treeCtrl);
    DDX_Control(pDX, IDC_TREE2, m_ctlTree);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_EN_CHANGE(IDC_EDIT1, &CMFCApplication1Dlg::OnEnChangeEdit1)
    ON_BN_CLICKED(IDOK, &CMFCApplication1Dlg::OnBnClickedOk)
END_MESSAGE_MAP()


// CMFCApplication1Dlg 消息处理程序

BOOL CMFCApplication1Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != nullptr)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码


    // Initialize the tree control
    CString root[2] = { TEXT("A"), TEXT("B") };

    for (int i = 0; i < 2; i++)
    {
        HTREEITEM r = treeCtrl.InsertItem(root[i], NULL);

        CString str;
        for (int j = 0; j < 3; j++)
        {
            str.Format(TEXT("%s%d"), root[i], j + 1);
            HTREEITEM j1 = treeCtrl.InsertItem(str, r);

            CString str1;
            for (int m = 0; m < 3; m++)
            {
                str1.Format(TEXT("%s%d%d"), root[i], j + 1, m + 1);
                HTREEITEM m1 = treeCtrl.InsertItem(str1, j1);

                CString str2;
                for (int q = 0; q < 3; q++)
                {
                    str2.Format(TEXT("%s%d%d%d"), root[i], j + 1, m + 1, q + 1);
                    HTREEITEM q1 = treeCtrl.InsertItem(str2, m1);

                    CString str3;
                    for (int s = 0; s < 3; s++)
                    {
                        str3.Format(TEXT("%s%d%d%d%d"), root[i], j + 1, m + 1, q + 1, s + 1);
                        HTREEITEM s1 = treeCtrl.InsertItem(str3, q1);
                    }
                }
            }
        }
    }
    m_ctlTree.ModifyStyle(NULL, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);




    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMFCApplication1Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CMFCApplication1Dlg::func(HTREEITEM root, CString condition)
{
    CString itemText = treeCtrl.GetItemText(root);

    if (itemText.Find(condition) != -1)
    {
        treeCtrl.SelectItem(root);
        treeCtrl.SetCheck(root, TRUE);
        treeCtrl.Expand(root, TVM_EXPAND);
        return;
    }

    HTREEITEM A1 = treeCtrl.GetChildItem(root);
    std::vector<HTREEITEM> vecItem;

    while (A1 != NULL)
    {
        vecItem.push_back(A1);
        A1 = treeCtrl.GetNextItem(A1, TVGN_NEXT);
    }

    for (int q = (int)vecItem.size() - 1; q > -1; q--)
    {
        CString itemText = treeCtrl.GetItemText(vecItem[q]);

        if (itemText.Find(condition) != -1)
        {
            treeCtrl.SelectItem(vecItem[q]);
            treeCtrl.SetCheck(vecItem[q], TRUE);
            treeCtrl.Expand(vecItem[q], TVM_EXPAND);
            vecItem.clear();
            return;
        }
        else
        {
            func(vecItem[q], condition);
        }
    }
}




void CMFCApplication1Dlg::OnEnChangeEdit1()
{
    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
}


void CMFCApplication1Dlg::OnBnClickedOk()
{
    UpdateData(TRUE);

    std::vector<HTREEITEM> vecItem;
    HTREEITEM root = treeCtrl.GetRootItem();

    while (root != NULL)
    {
        vecItem.push_back(root);
        root = treeCtrl.GetNextItem(root, TVGN_NEXT);
    }

    for (int q = (int)vecItem.size() - 1; q > -1; q--)
    {
        func(vecItem[q], m_find);
    }

    CString rootPath = _T("E:\\BaiduNetdiskDownload"); // Change to your root folder path
    m_ctlTree.DeleteAllItems(); // Clear existing items
    InitTreeControl(rootPath);
    UpdateData();
}

void CMFCApplication1Dlg::InitTreeControl(CString strRoot, HTREEITEM hTreeItemParent)
{

    CStringArray strArrayFolderPath;
    CStringArray strArrayFilePath;

    HTREEITEM hTreeItemChild = NULL;
    CString strParentData = L"";
    CString strChildData = L"";

    if (hTreeItemParent == NULL)
    {
        strParentData = strRoot;
        hTreeItemParent = m_ctlTree.InsertItem(strParentData);
    }

    FileSearch(strRoot, strArrayFolderPath, strArrayFilePath);

    for (int i = 0; i < strArrayFolderPath.GetSize(); i++)
    {
        strChildData = strArrayFolderPath.GetAt(i);
        hTreeItemChild = m_ctlTree.InsertItem(strChildData, hTreeItemParent);

        // Recursive call to add subfolders and files
        InitTreeControl(strChildData, hTreeItemChild);
    }

    for (int i = 0; i < strArrayFilePath.GetSize(); i++)
    {
        strChildData = strArrayFilePath.GetAt(i);
        hTreeItemChild = m_ctlTree.InsertItem(strChildData, hTreeItemParent);
    }
}
int CMFCApplication1Dlg::FileSearch(CString strRootFolderPath, CStringArray& strArrayFolderPath, CStringArray& strArrayFilePath)
{
    strArrayFolderPath.RemoveAll();
    strArrayFilePath.RemoveAll();

    int nChildFolderCounts = 0;
    CFileFind ff;
    CString FilePath;

    if (strRootFolderPath.Right(1) != _T("\\"))
    {
        strRootFolderPath += _T("\\");
    }
    strRootFolderPath += _T("*.*");

    BOOL res = ff.FindFile(strRootFolderPath);
    while (res)
    {
        res = ff.FindNextFile();
        FilePath = ff.GetFilePath();
        if (ff.IsDirectory() && !ff.IsDots()) // Found a directory
        {
            strArrayFolderPath.Add(FilePath);
            nChildFolderCounts++;
        }
        else if (!ff.IsDirectory() && !ff.IsDots()) // Found a file
        {
            strArrayFilePath.Add(FilePath);
        }
    }

    return nChildFolderCounts;
}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay