1. 程式人生 > >樹形控制元件,下拉框,listbox的用法

樹形控制元件,下拉框,listbox的用法

 

MFC樹控制元件的簡單入門

  本文簡單介紹了有關MFC中樹形控制元件的最基本的用法,鑑於水平有限,僅希望能夠讀者通過簡單的程式設計例項,起到對樹形控制元件入門之目的。因為筆者對MFC知識點的學習也都是從例項中學習,這樣效率會相對較高,好了不說廢話了,開始…

1.        新建一名為“MyTree”的對話方塊(Dialog based)應用程式專案(MFC AppWizard(EXE)),編譯完成後效果如下:

圖1

2.        刪除對話方塊中的靜態文字控制元件,並新增Tree Contrl控制元件和三個 Button控制元件,各控制元件屬性見下表,完成效果如下:

表1

序號

屬性

內容

備註

1

樹形控制元件

IDC_TREE

2

按鈕控制元件

IDC_BTN_INITIAL

初始化操作

3

按鈕控制元件

IDC_BTN_DELETE

刪除一個節點

4

按鈕控制元件

IDC_BEN_CLEAR

刪除全部節點

圖2

3.        在對話方塊中的樹型控制元件上右鍵新增CTreeCtrl類的變數m_treeCtrl,此時在類檢視中的CMyTreeDlg類中增加了私有變數m_treeCtrl。

4.        在初始化按鈕上雙擊,在其初始化處理函式內新增一些程式碼,完成初始化工作,初始化工作主要實現樹型控制元件內各個節點的新增工作,此時先在MSDN中找到CTreeCtrl類的(member)成員,依次參考Create/等成員函式,可參考下面程式碼:

void CMyTreeDlg::OnBnClickedBtnInitial()

{

//新增根節點

HTREEITEM root   =     m_treeCtrl.InsertItem(_T("root"));

//新增兩個父節點

HTREEITEM parent1 = m_treeCtrl.InsertItem(_T("parent1"));

HTREEITEM parent2 = m_treeCtrl.InsertItem(_T("parent2"));

//為父節點新增子節點,child2在child1之後

HTREEITEM child1 = m_treeCtrl.InsertItem(_T("child1"),parent1);

HTREEITEM child2 = m_treeCtrl.InsertItem(_T("child2"),parent1,child1);

HTREEITEM child3 = m_treeCtrl.InsertItem(_T("child3"),parent1,child2);

HTREEITEM child11 = m_treeCtrl.InsertItem(_T("child11"),parent2);

HTREEITEM child22 = m_treeCtrl.InsertItem(_T("child22"),parent2,child11);

HTREEITEM child33 = m_treeCtrl.InsertItem(_T("child33"),parent2,child22);

}

5.        此時執行程式,多次點選初始化出現以下介面:

圖3

  此時我們發現兩處不足(bug): 一是每次點選初始化按鈕就出現一個樹結構,實際上我們需要的是一組樹結構,不應該重複相同的樹結構;二是圖中顯示的樹結構,父節點與子節點之間沒有連線,看起來不直觀,需要修改樹控制元件的型別(style)。

  解決第一個 bug的方法是:在CMyTreeDlg中定義一個BOOL型變數m_result, 該變數初始化為FALSE, 對上述程式碼進行如下修改:實現點選一次初始化按鈕,顯示樹結構;再次點選將把所有節點刪除的效用!

          解決第二個bug的方法是:由於樹型控制元件類繼承了視窗類CWnd,所以可以利用CWnd類中的ModifyStyle()函式,可以修改樹控制元件的style,使其擁有連線功能,同時我們還增添了button以及連線顏色、背景顏色的設定,算是買一送一吧!具體修改後的程式碼及介面顯示如下(真是人配衣裳馬配鞍,狗配鈴鐺跑得歡啊!):

void CMyTreeDlg::OnBnClickedBtnInitial()

{

//因為在對話方塊中已經定義了樹形控制元件變數,該控制元件在對話方塊生成時,就已經呼叫樹形類的create函式,完成了初始化工作;因此如果想修改樹形控制元件的stytle需要呼叫Modify

if (FALSE == m_result)

{

//修改樹控制元件style

m_treeCtrl.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS);

//增加了控制元件顏色修改

m_treeCtrl.SetLineColor(RGB(120,100,0));

m_treeCtrl.SetBkColor(RGB(73,169,51));

m_treeCtrl.SetTextColor(RGB(255,0,0));

//新增根節點

HTREEITEM root   =     m_treeCtrl.InsertItem(_T("root"));

//新增兩個父節點

HTREEITEM parent1 = m_treeCtrl.InsertItem(_T("parent1"));

HTREEITEM parent2 = m_treeCtrl.InsertItem(_T("parent2"));

//為父節點新增子節點

HTREEITEM child1 = m_treeCtrl.InsertItem(_T("child1"),parent1);

HTREEITEM child2 = m_treeCtrl.InsertItem(_T("child2"),parent1,child1);

HTREEITEM child3 = m_treeCtrl.InsertItem(_T("child3"),parent1,child2);

HTREEITEM child11 = m_treeCtrl.InsertItem(_T("child11"),parent2);

HTREEITEM child22 = m_treeCtrl.InsertItem(_T("child22"),parent2,child11);

HTREEITEM child33 = m_treeCtrl.InsertItem(_T("child33"),parent2,child22);

m_result = TRUE;

}

else

{

m_treeCtrl.DeleteAllItems();

m_result =FALSE;

}

}

 圖4

6. 在對話方塊資源中雙擊刪除一個節點按鈕,新增刪除一個節點的功能函式。此時我們有兩步要做,刪除一個節點,我們用到CTreeCtrl類中的DeleteItem()成員函式,第二步,我們要確定那個節點被選中,此時用到GetSeletedItem()成員函式,參考兩個函式的MSDN中的例子,我們可以輕鬆實現刪除一個節點功能,程式碼如下:

void CMyTreeDlg::OnBnClickedBtnDelete()

{

//選擇節點

HTREEITEM hItem = m_treeCtrl.GetSelectedItem();

if ((hItem != NULL))

{

       m_treeCtrl.DeleteItem(hItem);

}

}

7. 依照前面兩部分內容,有關刪除全部節點的功能, 還有難度嗎?其實我們前面在初始化時已經提前引入了有關刪除全部節點的函式!她是…? O(∩_∩)O~,想必此時的你對樹形控制元件的使用已經有感覺了吧!

圖5

水滴穿石,貴在持之以恆

VC 中的Tree Control

2010-08-06 11:08:15|  分類: 工作 閱讀372 評論1   字號:大中小 訂閱

Tree Control 的屬性和方法比較多少,用起來確實麻煩,但其強大的功能和令人耳目一新的視覺效果值得我們去學習,我從網上收到一篇文章,較詳細的的講解了它的使用,稍作整理,在此和大家共享:

       通過“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名為VCTREE的工程,在建立過程中選擇基於對話方塊(Dialog based)的應用;將對話方塊中的預設控制元件刪除,並將所有對話方塊屬性中的Language域設定為Chinese(P.R.C.),以使應用程式支援中文;建立兩個圖示IDI_PM和IDI_CJ,用來表示圖示的選中和非選中狀態,對於每個圖示都應建立32X32和16X16兩種大小,以保證程式的需要;在對話方塊視窗中新增樹控制物件(TREE    CONTROL),並設定五個按鈕“增加|刪除|檢視|排序|關閉”,其對應標識分別如下:
     控制名稱          標題名稱                  識別符號號
      樹控制                                    IDC_TREECTRL
      按鈕              增    加                    IDC_ADD
                      刪    除                    IDC_DEL
                      查    看                    IDC_VIEW
                      排    序                    IDC_SORT
                      關    閉                    IDOK
     選中樹控制控制元件,選擇“VIEW->ClassWizard->Memory Variables。 IDC_TREECTRL           引入成員變數,其變數型別為:
   

     變數名              種類              變數型別
      m_TreeCtrl          Control           CTreeCtrl
  

    同時利用“MESSAGES MAP”為各命令按鈕增加控制功能函式。
  

然後在程式碼檔案VCTREEDlg.CPP中分別加入如下控制程式碼:
      (1)在檔案開始處增加影象列表定義
  

    CImageList Cil1,Cil2;//大小圖示像列表
  

    (2)在初始化檔案開始處增加程式碼

      BOOL CVCTREEDlg::OnInitDialog()
      { CDialog::OnInitDialog();
      ......//原來其它程式碼
      // TODO: Add extra initialization here
      // 此處開始增加程式碼
      Cil1.Create(16,16,ILC_COLOR,2,2);
      Cil1.Add(AfxGetApp()->LoadIcon(IDI_PM));
      Cil1.Add(AfxGetApp()->LoadIcon(IDI_CJ));
      m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); file://設定圖象列表
    

      DWORD dwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//獲取樹控制原風格
      dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
      SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//設定風格
   

     wchar_t * CJ[4]={L"玉溪捲菸廠",L"雲南捲菸廠",L"瀋陽捲菸廠",L"成都捲菸廠"};//根資料名稱
      wchar_t * PM[4][5]={
    {L"紅梅一",L"紅梅二",L"紅梅三",L"紅梅四",L"紅梅五"},//產品資料項
    {L"白梅一",L"白梅二",L"白梅三",L"白梅四",L"白梅五"},
    {L"綠梅一",L"綠梅二",L"綠梅三",L"綠梅四",L"綠梅五"},
    {L"青梅一",L"青梅二",L"青梅三",L"青梅四",L"青梅五"}};

      int i,j;
      HTREEITEM hRoot,hCur;//樹控制專案控制代碼
      TV_INSERTSTRUCT TCItem;//插入資料項資料結構
   

      TCItem.hParent=TVI_ROOT;//增加根項
      TCItem.hInsertAfter=TVI_LAST;//在最後項之後
      TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//設遮蔽
      TCItem.item.pszText="資料選擇";
      TCItem.item.lParam=0;//序號
      TCItem.item.iImage=0;//正常圖示
      TCItem.item.iSelectedImage=1;//選中時圖示
      hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根項控制代碼
   

for(i=0;i<4;i++){//增加各廠家
     TCItem.hParent=hRoot;
     TCItem.item.pszText=CJ[i];
     TCItem.item.lParam=(i+1)*10;//子項序號
     hCur=m_TreeCtrl.InsertItem(&TCItem);
     for(j=0;j<5;j++){//增加各產品
     TCItem.hParent=hCur;
     TCItem.item.pszText=PM[i][j];
     TCItem.item.lParam=(i+1)*10+(j+1);//子項序號
     m_TreeCtrl.InsertItem(&TCItem);
    }
       m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展開樹
      }
      m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展開上一級樹
      return TRUE;    // return TRUE    unless you set the focus to a control
      }
   

    (3)增加樹項功能的實現
      在增加樹項功能時,除了需要定義和設定插入樹項的資料結構之外,還需要注意的是新增樹項的名稱初始時均為“新增資料”,增加後允許使用者給資料項設定自定義名稱。在程式設計時應特別注意m_TreeCtrl.EditLabel(hInsert);後面不能跟任何其它程式命令,否則這條編輯指令無效。
  

    void CVCTREEDlg::OnAdd()
      { file://增加子項功能函式
   

HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得選擇項控制代碼
      if(hSel==NULL) return;//無任何選項則返回
      static int nAddNo=100;//編號大於100為新增資料
   

TV_INSERTSTRUCT TCItem;//定義插入項資料結構
      TCItem.hParent=hSel;     file://設定父項控制代碼
      TCItem.hInsertAfter=TVI_LAST;//在最後增加
      TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//設遮蔽
      TCItem.item.pszText="新增資料";
      TCItem.item.lParam=nAddNo++;//索引號增加
      TCItem.item.iImage=0;//正常圖示
      TCItem.item.iSelectedImage=1;//選中時圖示
      HTREEITEM hInsert=m_TreeCtrl.InsertItem(&TCItem);//增加
  

    m_TreeCtrl.Expand(hSel,TVE_EXPAND);
      m_TreeCtrl.EditLabel(hInsert);//修改增加的資料
      }
      (4)刪除樹項功能的實現
      在實現刪除功能時,應對存在子項的樹項進行提示,以警告使用者是否連同其子項一起刪除。
   

void CVCTREEDlg::OnDel()
      { //刪除子項功能函式
        HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得選項控制代碼;
       if(hSel==NULL) return;//無任何選項則返回
    

if(m_TreeCtrl.ItemHasChildren(hSel))//判斷是否有子項
         if(MessageBox("廠家下存在品名,一同刪除?","警告",MB_YESNO)==IDNO) return;

    m_TreeCtrl.DeleteItem(hSel);
      }
      (5)排序功能的實現
      排序功能是對所選中的樹項的所有子項按字元中順序進行排序,如果想要按照其它規則進行排序,應利用SortChildrenItemBC()函式進行自行開發排序程式,這個自行開發的函式與列表控制中實現的函式基本相同,可興趣的讀可以試驗。
  

    void CVCTREEDlg::OnSort()
      { //排序子項功能函式
      HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得選項控制代碼;
      if(hSel==NULL) return;//無任何選項則返回
      m_TreeCtrl.SortChildren(hSel);
      }
      (6)檢視功能的實現
      檢視功能用來檢視選中樹項的有關資訊,函式中中顯示了樹項的文字名稱和標識號,可以將這兩個資訊作為查詢關鍵字,來檢視其它更詳細的資訊。
    

void CVCTREEDlg::OnView()
      { //檢視選中項功能函式
      HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得選項控制代碼;
      if(hSel==NULL) return;//無任何選項則返回
      CString cText=m_TreeCtrl.GetItemText(hSel);//取得資料項名
      LONG IDs=m_TreeCtrl.GetItemData(hSel);//取得資料項序號
      char temp[100];
      wsprintf(temp,"廠家:%s 編號:%05d",cText,IDs);
      MessageBox(temp,"選擇資訊");
      }
    

(7)修改功能的實現
      如果不進行其它處理,當修改樹項的文字名稱後,就會發現其未被修改,這是因為程式中沒有對修改結果進行儲存處理,這就要利用TV_DISPINFO結構和SetItemText函式對TVN_ENDLABELEDIT進行處理,這樣就可以正確地實現修改功能。
    

void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
      { TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
    // TODO: Add your control notification handler code here
        if(pTVDispInfo->item.pszText==0) return;//使用者取消修改操作
       m_TreeCtrl.SetItemText(pTVDispInfo->item.hItem,
    pTVDispInfo->item.pszText);//設定新資料
    *pResult = 0;
      }

相關推薦

樹形控制元件listbox用法

  MFC樹控制元件的簡單入門   本文簡單介紹了有關MFC中樹形控制元件的最基本的用法,鑑於水平有限,僅希望能夠讀者通過簡單的程式設計例項,起到對樹形控制元件入門之目的。因為筆者對MFC知識點的學習也都是從例項中學習,這樣效率會相對較高,好了不說廢話了,開始… 1.   

jQuery清空復選輸入

下拉 div edi 賦值 rop 更改 check sele bsp 在做前端頁面是有時需要清空或者更改一些input輸入框,select下拉框,checkbox復選框,還有普通div,span包裹的值,特別是使用ajax的時候,更需要這些 清空id為靜態aaa的 inp

通過ajax動態載入select控制元件】的option

一、JS方式 關鍵程式碼: <select id="ddlResourceType" onchange="getvalue(this)"></select> var objSelect = document.getElementById("ddlR

在visual studio 2017用xamarin for android 做個簡單的註冊頁面包含單選控制元件多選控制元件選單控制元件

照著牛腩老師的視訊,自己做了個註冊頁面,實現了簡單的單選控制元件、多選控制元件、下拉選單控制元件的使用,由於日曆控制元件太醜,就不模仿了,下面就是reg.axml的佈局效果,後面是程式碼。 , <?xml version="1.0" encoding="utf-8"?

d3之元件的運用(單選列表滑動軸多選)

目錄 目錄 單選框 下拉列表 滑動軸 多選框 單選框 1.前端 <form name="myForm" action="" method="" style="posit

easyui 綁定下選擇改變事件的觸發方法

height mbo options ble data 方法 cte com ear //①定義下拉框 //離線公司【個人或公司】 下拉框 var tmpComOrPer = { type: ‘combobox‘, options

年月周周會隨月改變

nbsp true clas sele sheet san query asc jquery <#assign basePath=request.contextPath /> <!DOCTYPE html> <html> <hea

spring mvc:常用標簽庫(文本密碼文本域復選單選按鈕隱藏於上傳文件等)

標簽庫 state -h ring lib ati gap 下拉列表 hiberna 在jsp頁面需要引入:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>標簽. 文

selenium 難定位元素時間插件定位string

word toolbar fin 適合 sss classname 其他 visible right 1.元素定位 ID定位元素: findElement(By.id(“”)); 通過元素的名稱定位元素: findElement(By.name(“”)); 通過

模擬點選滑鼠移動拖拽按鍵的處理

1.模擬點選 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Chrom

Ajax 的同步和非同步 聯動 回顯第二個不能回顯成功

Ajax 的同步和非同步,下拉框 聯動 回顯第二個不能回顯成功 示例: 使用Ajax 實現下拉框聯動 回顯 出現呢只有第一個能夠回顯成功 其餘的都不能正常回顯。 原因 :使用了Ajax的非同步 select的賦值再 非同步之前導致的 ( 賦值前個彈出 可以暫停賦值的執行順序 先載入後賦值 )

定位這裡遇到一些問題沒有新增顯式等待會導致找不到頁面元素折騰了一會兒

from selenium.webdriver import ActionChainsdriver.get("http://baidu.com")link=driver.find_element_by_link_text('設定')ActionChains(driver).move_to_element(li

input支援html5特性

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>input的下拉選

vue.js 新增動態的單選多選

1.下拉框 <FormItem label="關聯題目型別" prop="questionTypeId"> <Select v-model="addValidate.questionTypeId" placeholder="請選擇題目型

【Layui】關於單選的選中狀態預設顯示

author:咔咔 wechat:fangkangfk   案例:    我們先看一下點選修改電影這個分類的資料   在修改的這個頁面裡邊,分類也是迴圈出來的   只需要讓查出的來的id跟這個迴圈的

easyui中一個頁面多個combobox載入同一json資料無法選中問題

版本問題,可以通過升級easyui為最新版本解決,也可以通過以下程式碼處理/** * 初始化下拉框 * @param unitid dom元素id * @param value 初始化選中值 * @param data json資料集合 */ function in

單選多選程式碼結構和注意部分

<html> <head> <mate charset="utf-8"> </head> <body> <!-- 單選框,主要注意na

selenium定位 百度搜索輸入關鍵字後聯想出來的怎麼定位

百度搜索框輸入關鍵字後,下拉框聯想出來的怎麼定位? 百度下拉框聯想出來的我們按F12中的箭頭時,下拉框會消失收回去的。 這個時候怎麼辦呢 解決辦法: 就三個步驟 1.在百度搜索框輸入關鍵字“上

EXTJS中繫結事件動態賦值

在開發過程中,有時會遇到一咱情況: 兩個下拉框A和B,當選擇A時,根據A的值查詢B可以選擇的值並賦值到B中。舉個常見的例子,省份與城市兩個下拉框,當選擇省份後,城市的下拉框中只顯示該省的城市。 要實現該功能最重要的就是一個下拉框的繫結事件而已。下邊我以單位和員工關係為例。

layui獲取單選複選的值

layui 獲取下拉框的值var type = $("填寫id").find("option:selected").attr("value");// 根據id獲取指定的下拉框var type = $("select option:checked").attr("value")