樹形控制元件,下拉框,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")