主頁 > 軟體工程 > 串列控制元件顯示的內容除了在OnInitDialog里設定外,能不能在自定義的函式中實作?

串列控制元件顯示的內容除了在OnInitDialog里設定外,能不能在自定義的函式中實作?

2020-09-17 08:02:07 軟體工程

用MFC做一個界面,用到了串列控制元件,因為要讓串列的內容根據不同的選擇而有所變化,所以想要自己定義一個函式而不是在OnInitDialog函式中直接加,但是現在發現如果不在OnInitDialog函式中加,整個串列控制元件的內容是空的,如圖1所示。只有當在OnInitDialog函式中直接加時,串列控制元件才有內容,如圖2所示。但是,此時串列控制元件雖然有內容,卻并不能實作讓串列的內容根據不同的選擇而有所變化,該怎么解決呢?

圖1

圖2

uj5u.com熱心網友回復:

當然可以了,你在任何時候都可以更新控制元件資料,但是,如果在執行緒里更新控制元件內容,盡量使用發送自定義訊息,不要直接對UI上的控制元件進行更改,否則可能出錯!

你這里要實作你的操作,可以增加一個滑鼠單擊事件,在該事件函式內對右邊的CtrlList控制元件更新!

uj5u.com熱心網友回復:

參考 1 樓 Janxionwang 的回復:
當然可以了,你在任何時候都可以更新控制元件資料,但是,如果在執行緒里更新控制元件內容,盡量使用發送自定義訊息,不要直接對UI上的控制元件進行更改,否則可能出錯!

你這里要實作你的操作,可以增加一個滑鼠單擊事件,在該事件函式內對右邊的CtrlList控制元件更新!


首先,感謝您的回答,現在的問題是:不在OnInitDialog函式直接添加,現在的串列控制元件完全是空的,如圖1所示,我現在就是想讓串列控制元件能有內容,并且不在OnInitDialog函式中添加

uj5u.com熱心網友回復:

CListCtrl::DeleteAllItems 
CListCtrl::DeleteColumn
后 重新 init

uj5u.com熱心網友回復:

不在OnInitDialog函式中添加,你也可以在按鍵回應函式中追加啊!
不想按鍵回應函式追加,也可以在建構式中,把要顯示的內容扯訓到一個成員變數中。然后再OnInitDialog函式中讀取成員變數內容不就完了嗎!!

uj5u.com熱心網友回復:

樹形控制元件有洗掉樹形控制元件中的所有節點的DeleteAllItems( )、洗掉樹形控制元件中的某個節點的DeleteItem(HTREEITEM hItem),那么除了有獲取選中節點的標簽文本字串的 GetSelectedItem(),有沒有獲取所有節點的標簽文本字串的方法呢?換句話來說就是,既然有點擊洗掉和全部洗掉,那么有沒有點擊選擇和全部選擇呢?回答這個問題的同樣可以得到問題點數!!!

uj5u.com熱心網友回復:

"有沒有獲取所有節點的標簽文本字串的方法呢?“
沒有 要 一個一個 獲取

uj5u.com熱心網友回復:

你可以使用自制函式,在OnInitDialog呼叫

uj5u.com熱心網友回復:

參考 6 樓 qq_41674120 的回復:
樹形控制元件有洗掉樹形控制元件中的所有節點的DeleteAllItems( )、洗掉樹形控制元件中的某個節點的DeleteItem(HTREEITEM hItem),那么除了有獲取選中節點的標簽文本字串的 GetSelectedItem(),有沒有獲取所有節點的標簽文本字串的方法呢?換句話來說就是,既然有點擊洗掉和全部洗掉,那么有沒有點擊選擇和全部選擇呢?回答這個問題的同樣可以得到問題點數!!!


遍歷所有Item,一個個獲取

uj5u.com熱心網友回復:

參考 2 樓 qq_41674120 的回復:
Quote: 參考 1 樓 Janxionwang 的回復:

當然可以了,你在任何時候都可以更新控制元件資料,但是,如果在執行緒里更新控制元件內容,盡量使用發送自定義訊息,不要直接對UI上的控制元件進行更改,否則可能出錯!

你這里要實作你的操作,可以增加一個滑鼠單擊事件,在該事件函式內對右邊的CtrlList控制元件更新!


首先,感謝您的回答,現在的問題是:不在OnInitDialog函式直接添加,現在的串列控制元件完全是空的,如圖1所示,我現在就是想讓串列控制元件能有內容,并且不在OnInitDialog函式中添加


兄Dei,可能你沒有聽懂我的回答,我的意思是你更新控制元件顯示內容,在任何時候都可以,不一定在初始化對話框的函式內,結合你的應用場景,你想什么時候添加,就在你的事件回應函式內添加,就是說你在你程式對話框啟動后的任何地方,就是在OnInitDialog之后,想改變它的時候就發一個自定義訊息就可以了,在訊息處理函式中操作控制元件顯示內容!
舉例:一個button,你雙擊會在對話框類里產生一個單擊事件回應函式,你就可以在那個按鈕下更新任UI上的何控制元件!

我感覺你的問題是在于:你不清楚對話框創建程序和windows訊息機制!(或許)

uj5u.com熱心網友回復:

參考 9 樓 worldy 的回復:
Quote: 參考 6 樓 qq_41674120 的回復:

樹形控制元件有洗掉樹形控制元件中的所有節點的DeleteAllItems( )、洗掉樹形控制元件中的某個節點的DeleteItem(HTREEITEM hItem),那么除了有獲取選中節點的標簽文本字串的 GetSelectedItem(),有沒有獲取所有節點的標簽文本字串的方法呢?換句話來說就是,既然有點擊洗掉和全部洗掉,那么有沒有點擊選擇和全部選擇呢?回答這個問題的同樣可以得到問題點數!!!


遍歷所有Item,一個個獲取


能不能給段遍歷的代碼,在網上找了一些都不能得到想要的效果,感徑訓是對這個還是不太了解。
下面兩張圖是我的樹和我寫的遍歷樹的代碼,但是還是不完善,能不能幫幫忙完善一下或者給個思路!現在還不能得到以“C”開頭的文本!!

圖1

圖2

uj5u.com熱心網友回復:

我現在的代碼:
        vector<string> vec;
vec.clear();
// TODO: Add your control notification handler code here
HTREEITEM hRoot = m_treeCtrl.GetRootItem(); //根節點
HTREEITEM hTreeItemChlid1=m_treeCtrl.GetChildItem(hRoot);//得到根節點的子節點(第一個)
HTREEITEM hTreeItemChlid=m_treeCtrl.GetChildItem(hTreeItemChlid1);//得到子節點的子節點(第一個)
while (hTreeItemChlid!=NULL)  
    {  
        CString temp=m_treeCtrl.GetItemText(hTreeItemChlid);//獲取節點上的文本  
        vec.push_back(string(temp));//壓入容器  
        hTreeItemChlid=m_treeCtrl.GetNextSiblingItem(hTreeItemChlid);//得到子節點的兄弟節點  
    } 
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;
         }

uj5u.com熱心網友回復:


void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent)
{
HTREEITEM hChild,hNext;
CString str;
// enter all child
hChild=m_TreeCtrl.GetChildItem(hParent);
str=m_TreeCtrl.GetItemText(hChild);
// output child 
afxDump << str << "\n";
while (hChild)
{
if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild);
hNext=m_TreeCtrl.GetNextSiblingItem(hChild);
hChild=hNext;
}
}

void CTreeCtrlDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
HTREEITEM hParent=m_TreeCtrl.GetRootItem();
CString str=m_TreeCtrl.GetItemText(hParent);
// output root
afxDump << str << "\n";
// 
WalkTreeCtrl(hParent);
}

uj5u.com熱心網友回復:

注意
        if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild);
遞回·

uj5u.com熱心網友回復:

“給定一個小點的輸入,完整單步跟蹤(同時按Alt+7鍵查看Call Stack里面從上到下列出的對應從里層到外層的函式呼叫歷史)一遍。”是理解遞回函式作業原理的不二法門!
遞回函式關注以下幾個因素
·退出條件
·引數有哪些
·回傳值是什么
·區域變數有哪些
·全域變數有哪些
·何時輸出
·會不會導致堆疊溢位

uj5u.com熱心網友回復:

下面是全路徑輸出

//
void CTreeCtrlDlg::GetTreePath(HTREEITEM hItem)
{
CString Path;
CString tmp;
    while (hItem)
{
tmp=m_TreeCtrl.GetItemText(hItem);
Path=tmp+"\\"+Path;
// get parent
hItem=m_TreeCtrl.GetParentItem(hItem);
}
if(Path.Right(1)=="\\") Path=Path.Left(Path.GetLength()-1);
// AfxMessageBox(treepath);
afxDump << Path << "\n";
return;
}
//
void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent)
{
HTREEITEM hChild;
CString str;
// enter all child
if(hParent==0) hChild=m_TreeCtrl.GetRootItem();
else hChild=m_TreeCtrl.GetChildItem(hParent);
//
while (hChild)
{
GetTreePath(hChild);
if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild);
hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
}
}

void CTreeCtrlDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
WalkTreeCtrl(0);
}

結果
Root
Root\Child1
Root\Child1\Child2
Root\Child1\Child2\Child3
Root\Child1\Child2\Child3\Child4
Root\Child1\Child2\Child3\Child5

uj5u.com熱心網友回復:

如何利用遞回添加父子節點給樹形控制元件呢?各位大神幫幫忙!
本來想再發一個求助帖的,但是不知道怎么回事被刪帖了,只能趁著這個求助帖還沒結貼,又有這么多熱心的朋友幫忙,謝謝啦!
這個問題我會追加得分的!!!謝謝啦!
希望這個回復不要再被刪了!!

uj5u.com熱心網友回復:

你已經有個 tree 了 ?

uj5u.com熱心網友回復:

參考 18 樓 schlafenhamster 的回復:
你已經有個 tree 了 ?

沒有tree,所以想利用遞回添加父子節點給樹形控制元件,得到一個tree

uj5u.com熱心網友回復:

不知道你的意思是不是選擇樹形控制元件,則重繪串列控制元件的資料?
如果是,那么就實作NM_CLICK事件即可。
具體步驟: 
Step1.添加NM_CLICK訊息回應函式 
Step2.樹形控制元件使用GetSelectedItem獲取當前選擇項
Step3.遍歷樹形控制元件節點,回圈判斷是哪個節點被選擇
Step4.顯示對應節點 資料到串列控制元件即可。

uj5u.com熱心網友回復:

參考 20 樓 l357630798 的回復:
不知道你的意思是不是選擇樹形控制元件,則重繪串列控制元件的資料?
如果是,那么就實作NM_CLICK事件即可。
具體步驟: 
Step1.添加NM_CLICK訊息回應函式 
Step2.樹形控制元件使用GetSelectedItem獲取當前選擇項
Step3.遍歷樹形控制元件節點,回圈判斷是哪個節點被選擇
Step4.顯示對應節點 資料到串列控制元件即可。

就是現在我已經在MFC上添加了樹形控制元件了,但是還沒往里加節點,所以我想問問怎么把父子節點通過vector加進樹形控制元件里,我是把節點的父子關系寫在了文本里,然后從文本里讀取資料到vector里,現在就是想把vector里的有關父子的節點添加到樹形控制元件,請幫忙看看能否做到這一點,謝謝啦!

uj5u.com熱心網友回復:

“我是把節點的父子關系寫在了文本里” 
能否 看看 這個 文本 ?

uj5u.com熱心網友回復:

參考 21 樓 qq_41674120 的回復:
Quote: 參考 20 樓 l357630798 的回復:

不知道你的意思是不是選擇樹形控制元件,則重繪串列控制元件的資料?
如果是,那么就實作NM_CLICK事件即可。
具體步驟: 
Step1.添加NM_CLICK訊息回應函式 
Step2.樹形控制元件使用GetSelectedItem獲取當前選擇項
Step3.遍歷樹形控制元件節點,回圈判斷是哪個節點被選擇
Step4.顯示對應節點 資料到串列控制元件即可。

就是現在我已經在MFC上添加了樹形控制元件了,但是還沒往里加節點,所以我想問問怎么把父子節點通過vector加進樹形控制元件里,我是把節點的父子關系寫在了文本里,然后從文本里讀取資料到vector里,現在就是想把vector里的有關父子的節點添加到樹形控制元件,請幫忙看看能否做到這一點,謝謝啦!

可以的,但文本最好是XML格式的會比較好。

uj5u.com熱心網友回復:

0 Root A
1 A B1
1 A B2
1 A B3
2 B1 C1
2 B1 C2
2 B2 C4
2 B2 C6
2 B3 C7
2 B3 C8

uj5u.com熱心網友回復:

Root 0 0
A 1 0
B1 2 1
B2 3 1
B3 4 1
C1 5 2
C2 6 2
C4 7 3
C6 8 3
C7 9 4
C8 10 4

uj5u.com熱心網友回復:

1 A 0
2 B1 1
3 B2 1
4 B3 1
5 C1 2
6 C2 2
7 C4 3
8 C6 3
9 C7 4
10 C8 4

uj5u.com熱心網友回復:

按結果
Root
Root\Child1
Root\Child1\Child2
Root\Child1\Child2\Child3
Root\Child1\Child2\Child3\Child4
Root\Child1\Child2\Child3\Child5
書寫 txt !
插入 時 ,根據名(root) 看 有沒有 這個 hItem, 有就 不插入 ,沒有就 插入 ,插入 成功后 ,保存 這個 hItem ,這樣快些。
慢的辦法就是,根據名(root)遍歷tree ,取名 比較 ,再插入。

uj5u.com熱心網友回復:

用 xml 的 方法 參考
“EditXML.rar”
https://download.csdn.net/download/schlafenhamster/8685007
“本程式 決議XML 檔案, 并可以 修改 屬性值.
使用 MSXML2”

uj5u.com熱心網友回復:

以上三個就是我的文本檔案內容了,不知道哪一個可以實作我要的功能,或者其他人有什么更好的想法

參考 27 樓 schlafenhamster 的回復:
按結果
Root
Root\Child1
Root\Child1\Child2
Root\Child1\Child2\Child3
Root\Child1\Child2\Child3\Child4
Root\Child1\Child2\Child3\Child5
書寫 txt !
插入 時 ,根據名(root) 看 有沒有 這個 hItem, 有就 不插入 ,沒有就 插入 ,插入 成功后 ,保存 這個 hItem ,這樣快些。
慢的辦法就是,根據名(root)遍歷tree ,取名 比較 ,再插入。

非常感謝您提供的辦法,請問一下,如果用遍歷要怎么做呢?

uj5u.com熱心網友回復:

其實就是 用 path 找到 那個 要 插入 的 hTreeItem

uj5u.com熱心網友回復:

參考 30 樓 schlafenhamster 的回復:
其實就是 用 path 找到 那個 要 插入 的 hTreeItem

可以說得詳細一點兒嗎?或者是給我給一段代碼看看,謝謝啦!

uj5u.com熱心網友回復:

給你 寫了一個

// in ".h"
// CString m_TreePath;
// HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{
m_TreeCtrl.DeleteAllItems();
//
CStringArray aStr;
aStr.Add("R");
aStr.Add("R\\C1");
aStr.Add("R\\C2");
aStr.Add("R\\C1\\G1");
aStr.Add("R\\C1\\G2");
aStr.Add("R\\C2\\G2");
//
for(int i=0;i<aStr.GetSize();i++)
{// 
CString tmp=aStr[i];
int at=tmp.ReverseFind('\\');
if(at==-1)
{
m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
continue;
}
else
{
CString tmpPath=tmp.Left(at);
at++;
CString tmpInsert=tmp.Right(tmp.GetLength()-at);
m_hTiFound=0;
FindTreeItem(0,tmpPath);
if(m_hTiFound)
{
m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
}
else
{
AfxMessageBox("Tree path not found !");
}
}
}
}
// not return anything !
void CTreeCtrlDlg::FindTreeItem(HTREEITEM hParent,CString &SearchPath)
{
HTREEITEM hChild;
// enter all child
if(hParent==0) hChild=m_TreeCtrl.GetRootItem();
else hChild=m_TreeCtrl.GetChildItem(hParent);
//
while (hChild)
{
GetTreePath(hChild);
if(SearchPath==m_TreePath)
{
m_hTiFound=hChild;// global !
break;
}
if(m_TreeCtrl.ItemHasChildren(hChild)) FindTreeItem(hChild,SearchPath);
hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
}
}

uj5u.com熱心網友回復:

C=child G=grandSon

uj5u.com熱心網友回復:

補 一個 

//
void CTreeCtrlDlg::GetTreePath(HTREEITEM hItem)
{
CString Path;
CString tmp;
    while (hItem)
{
tmp=m_TreeCtrl.GetItemText(hItem);
Path=tmp+"\\"+Path;
// get parent
hItem=m_TreeCtrl.GetParentItem(hItem);
}
// delete last '\'
if(Path.Right(1)=="\\") Path=Path.Left(Path.GetLength()-1);
// output Path
// afxDump << Path << "\n";
m_TreePath=Path;
return;
}

uj5u.com熱心網友回復:

參考 32 樓 schlafenhamster 的回復:
給你 寫了一個

// in ".h"
// CString m_TreePath;
// HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{
m_TreeCtrl.DeleteAllItems();
//
CStringArray aStr;
aStr.Add("R");
aStr.Add("R\\C1");
aStr.Add("R\\C2");
aStr.Add("R\\C1\\G1");
aStr.Add("R\\C1\\G2");
aStr.Add("R\\C2\\G2");
//
for(int i=0;i<aStr.GetSize();i++)
{// 
CString tmp=aStr[i];
int at=tmp.ReverseFind('\\');
if(at==-1)
{
m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
continue;
}
else
{
CString tmpPath=tmp.Left(at);
at++;
CString tmpInsert=tmp.Right(tmp.GetLength()-at);
m_hTiFound=0;
FindTreeItem(0,tmpPath);
if(m_hTiFound)
{
m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
}
else
{
AfxMessageBox("Tree path not found !");
}
}
}
}
// not return anything !
void CTreeCtrlDlg::FindTreeItem(HTREEITEM hParent,CString &SearchPath)
{
HTREEITEM hChild;
// enter all child
if(hParent==0) hChild=m_TreeCtrl.GetRootItem();
else hChild=m_TreeCtrl.GetChildItem(hParent);
//
while (hChild)
{
GetTreePath(hChild);
if(SearchPath==m_TreePath)
{
m_hTiFound=hChild;// global !
break;
}
if(m_TreeCtrl.ItemHasChildren(hChild)) FindTreeItem(hChild,SearchPath);
hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
}
}

請問一下,m_TreePath和m_hTiFound代表什么,在哪定義?

uj5u.com熱心網友回復:

// in ".h" 在 CTreeCtrlDlg 頭檔案中 定義。
//    CString m_TreePath;
//    HTREEITEM m_hTiFound;

m_TreePath 即路徑
m_hTiFound Tree Item Found


aStr.Add("R\\C1"); 會被分成 2部分
m_TreePath=“R”;
所以 FindTreeItem 找文字為 “R”的 m_hTiFound ,如果 找到 則 插入  “C1”
要插入的 是 “C1”

這樣 定義的 txt 只要 保證 路徑 存在 就可 插入, 后插入 的 項 在 txt 中的 位置 比較隨意 。

uj5u.com熱心網友回復:

參考 36 樓 schlafenhamster 的回復:
// in ".h" 在 CTreeCtrlDlg 頭檔案中 定義。
//    CString m_TreePath;
//    HTREEITEM m_hTiFound;

m_TreePath 即路徑
m_hTiFound Tree Item Found


aStr.Add("R\\C1"); 會被分成 2部分
m_TreePath=“R”;
所以 FindTreeItem 找文字為 “R”的 m_hTiFound ,如果 找到 則 插入  “C1”
要插入的 是 “C1”

這樣 定義的 txt 只要 保證 路徑 存在 就可 插入, 后插入 的 項 在 txt 中的 位置 比較隨意 。

按你這個怎么只有一個R出來,沒有C1,C2。。。呢?麻煩啦!

uj5u.com熱心網友回復:

參考 37 樓 qq_41674120 的回復:
Quote: 參考 36 樓 schlafenhamster 的回復:

// in ".h" 在 CTreeCtrlDlg 頭檔案中 定義。
//    CString m_TreePath;
//    HTREEITEM m_hTiFound;

m_TreePath 即路徑
m_hTiFound Tree Item Found


aStr.Add("R\\C1"); 會被分成 2部分
m_TreePath=“R”;
所以 FindTreeItem 找文字為 “R”的 m_hTiFound ,如果 找到 則 插入  “C1”
要插入的 是 “C1”

這樣 定義的 txt 只要 保證 路徑 存在 就可 插入, 后插入 的 項 在 txt 中的 位置 比較隨意 。

按你這個怎么只有一個R出來,沒有C1,C2。。。呢?麻煩啦!

哈哈哈,忘了加“m_TreeCtrl.ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);”這個!

uj5u.com熱心網友回復:

“CStringArray aStr;
    aStr.Add("R");
    aStr.Add("R\\C1");
    aStr.Add("R\\C2");
    aStr.Add("R\\C1\\G1");
    aStr.Add("R\\C1\\G2");
    aStr.Add("R\\C2\\G2");”
這個怎么和我的txt文本檔案結合使用呢?
就是當我想要改變樹的分支情況時,只需要改變txt文本檔案就能實作,不用改動代碼?

uj5u.com熱心網友回復:

"只需要改變txt文本檔案就能實作"
按上面的 格式 寫 Txt 檔案,
保存時 使用 給你的 void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent)
(即 16 樓的 代碼)

uj5u.com熱心網友回復:


//
void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent)
{
HTREEITEM hChild;
CString str;
// enter all child
if(hParent==0) hChild=m_TreeCtrl.GetRootItem();
else hChild=m_TreeCtrl.GetChildItem(hParent);
//
while (hChild)
{
#if 1  // need path
GetTreePath(hChild);
afxDump << m_TreePath << "\n";//  在這里把 path 寫入 TXT檔案 !
#else  // no path
str=m_TreeCtrl.GetItemText(hChild);
// output 
// afxDump << str << "\n";
#endif
if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild);
hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
}
}

uj5u.com熱心網友回復:

你的那個 txt 格式 是 累贅 的,不 直接。

uj5u.com熱心網友回復:

參考 42 樓 schlafenhamster 的回復:
你的那個 txt 格式 是 累贅 的,不 直接。

那應該怎么寫呢?我的意思是在不改動代碼的前提下,能夠修改樹形控制元件的結構,通過修改組態檔的方法

uj5u.com熱心網友回復:

用 筆記本 寫一個 TreePath.txt 內容 如下:
R
R\C1
R\C1\G1
R\C1\G2
R\C2
R\C2\G1
R\C2\G2
R\C2\G2\X1

讀檔案

// in ".h"
// CString m_TreePath;
// HTREEITEM m_hTiFound;
void CTreeCtrlDlg::OnButton1() 
{// read Tree Path
m_TreeCtrl.DeleteAllItems();
//
CStdioFile f;
f.Open("TreePath.txt",CFile::modeRead);
CString tmp;
while(f.ReadString(tmp))
{
if(tmp.IsEmpty()) continue;
int at=tmp.ReverseFind('\\');
if(at==-1)
{
if(m_TreeCtrl.GetRootItem())
{// has a root !
AfxMessageBox(tmp + " can't be a Second root item,only one root item allowed!");
}
else
{
HTREEITEM hroot=m_TreeCtrl.InsertItem(tmp,6,0,TVI_ROOT);
//afxDump << m_TreeCtrl.GetItemText(hroot) << "\n";
}
continue;
}
else
{
CString tmpPath=tmp.Left(at);
at++;
CString tmpInsert=tmp.Right(tmp.GetLength()-at);
m_hTiFound=0;
FindTreeItem(0,tmpPath);
if(m_hTiFound)
{
m_TreeCtrl.InsertItem(tmpInsert,6,0,m_hTiFound);
}
else
{
AfxMessageBox(tmpPath + " Tree path not found !");
}
}
}
f.Close();
}

寫 檔案

//
void  CTreeCtrlDlg::WalkTreeCtrl(HTREEITEM hParent,CStdioFile &file)
{
HTREEITEM hChild;
CString str;
// enter all child
if(hParent==0) hChild=m_TreeCtrl.GetRootItem();
else hChild=m_TreeCtrl.GetChildItem(hParent);
//
while (hChild)
{// need path
GetTreePath(hChild);
m_TreePath += "\n";
if(file) file.WriteString((LPCSTR)m_TreePath);
if(m_TreeCtrl.ItemHasChildren(hChild)) WalkTreeCtrl(hChild,file);
hChild=m_TreeCtrl.GetNextSiblingItem(hChild);
}
}
////////////////////////////////
void CTreeCtrlDlg::OnButton2() 
{// save tree path to txt
CStdioFile f;
f.Open("TreePath1.txt",CFile::modeCreate | CFile::modeWrite);
WalkTreeCtrl(0,f);
f.Close();
}


uj5u.com熱心網友回復:

uj5u.com熱心網友回復:

uj5u.com熱心網友回復:

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/64000.html

標籤:界面

上一篇:error MSB8013: 此專案不包含配置和平臺組合 Release|x64。

下一篇:vfp中合并兩個關聯表組成新的臨時表

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more