zoukankan      html  css  js  c++  java
  • Duilib实现 Windows资源管理器前进后退原理

    一、用两个vector保存路径

      vector<wstring> vctBacks;//保存后退路径的集合

      vector<wstring> vctForwards//保存前进路径集合

      CButtonUI*  pBackbtn;//后退按钮

      CButtonUI* pForwardbtn;//前进按钮

    1.程序初始化时,两个按钮不可用状态

    2.当点击一系列目录后,后退集合把这些路径保存,后退按钮设为可用状态

    3.当点击后退按钮,把vctBacks最后一个元素取出来 wstring temp = vctBacks.back(),放进前进集合里 vctForwards.push_back(temp),然后后退集合删除掉最后一个 vctBacks.pop_back()

    4.再点击前进按钮,把vctForwards最后一个元素取出来 wstring temp = vctForwards.back(),,放进前进集合里 vctBacks.push_back(temp),然后后退集合删除掉最后一个 vctForwards.pop_back()

    5.若前进集合还有一个元素时,取出元素push到后退集合里。然后把前进按钮设为不可用;若后退集合还有一个元素时,取出元素push到前几集合里,然后把后退按钮设为不可用

      1 void OnClickBtnForward()
      2 {
      3     if (m_vctForwards.size() > 0)
      4     {
      5         if (m_vctForwards.size() == 1)
      6         {
      7             wstring wstr = m_vctForwards.back();
      8             CListLabelElementUI* pElement = (CListLabelElementUI*)(m_pLeftTree->FindSubControl(wstr.c_str()));
      9 
     10             if (pElement)
     11             {
     12                 pElement->Select();
     13             }
     14             
     15             m_vctBacks.push_back(wstr);
     16             m_vctForwards.pop_back();
     17 
     18             if (m_vctForwards.empty())//在此判断有点多余
     19             {
     20                 m_pForwardbtn->SetEnabled(false);
     21             }
     22 
     23             if (!m_vctBacks.empty())
     24             {
     25                 m_pBackbtn->SetEnabled(true);
     26             }
     27             
     28             m_pPath->SetText(wstr.c_str());
     29             m_pFileList->RemoveAll();
     30             InitFileList(wstr.c_str());
     31             return;
     32         }
     33         else
     34         {
     35             wstring  temp = m_vctForwards.back();
     36             m_vctBacks.push_back(temp);
     37             m_vctForwards.pop_back();
     38             temp = m_vctBacks.back();
     39 
     40             CListLabelElementUI* pElement = (CListLabelElementUI*)(m_pLeftTree->FindSubControl(temp.c_str()));
     41             if (pElement != NULL)
     42             {
     43                 pElement->Select();
     44             }
     45 
     46             if (!m_vctBacks.empty())
     47             {
     48                 m_pBackbtn->SetEnabled(true);
     49             }
     50 
     51             m_pFileList->RemoveAll();
     52             InitFileList(temp.c_str());
     53             m_pPath->SetText(temp.c_str());
     54         }
     55     }
     56 }
     57 
     58 void OnClickBtnBack()
     59 {
     60     if (m_vctBacks.size() > 0)
     61     {
     62 
     63         if (m_vctBacks.size() == 1)
     64         {
     65             wstring wstr = m_vctBacks.back();
     66             CListLabelElementUI* pElement = (CListLabelElementUI*)(m_pLeftTree->FindSubControl(wstr.c_str()));
     67 
     68             if (pElement)
     69             {
     70                 pElement->Select();
     71             }
     72             m_vctForwards.push_back(wstr);
     73             m_vctBacks.pop_back();
     74             m_pPath->SetText(_T(""));
     75             m_pBackbtn->SetEnabled(false);
     76             m_pFileList->RemoveAll();
     77             return;
     78         }
     79         else
     80         {
     81             wstring temp = m_vctBacks.back();
     82             m_vctForwards.push_back(temp);//只要执行这行代码,前进按钮就可用
     83             if (!m_vctForwards.empty())
     84             {
     85                 m_pForwardbtn->SetEnabled(true);
     86             }
     87             m_vctBacks.pop_back();
     88             temp = m_vctBacks.back();
     89 
     90             CListLabelElementUI* pElement = (CListLabelElementUI*)(m_pLeftTree->FindSubControl(temp.c_str()));
     91 
     92             if (pElement != NULL)
     93             {
     94                 pElement->Select();
     95             }
     96             m_pFileList->RemoveAll();
     97             InitFileList(temp.c_str());
     98             m_pPath->SetText(temp.c_str());
     99         }    
    100     }
    101 }
  • 相关阅读:
    JavaScript作用域闭包(你不知道的JavaScript)
    Python笔记---错误笔记
    Go语言核心之美 1.5-作用域
    Android经常使用自己定义控件(二)
    Java开发者最经常使用19个Linux命令
    Python: scikit-image binary descriptor
    android 自己定义状态栏和导航栏分析与实现
    程序猿增加新团队的那些坑
    LeetCode 06 ZigZag Conversion
    【UWP通用应用开发】控件、应用栏
  • 原文地址:https://www.cnblogs.com/chechen/p/5341587.html
Copyright © 2011-2022 走看看