Showing posts with label CTreeCtrl. Show all posts
Showing posts with label CTreeCtrl. Show all posts

[CTreeCtrl]在Tree Item前顯示載入的BMP圖片

1.使用LoadImage()載入BMP檔。
2.使用CBitMap::Attach()載入HBITMAP。
3.將產生的CBitMap物件透過CImageList::Add()設定給CImageList。
4.使用CTreeCtrl::SetImageList()將CImageList設定給CTreeCtrl。
5.在需要塞入圖片的Item使用SetItemImage()指定圖片即可。
6.由於這邊使用LoadImage()時,是讀新的圖片進來,所以不用到圖片時,則需在使用DeleteObject()來釋放記憶體。

 HBITMAP hBMP= (HBITMAP)LoadImage(NULL,"c:\\temp\\noname.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);  
 if ( !hBMP ) {  
     CDSMsgShower::ShowMsgByErrorBox(this->m_hWnd, "ERROR", MB_OK, "Fail to load bmp file. Error =%d", ::GetLastError());  
 }  

 CBitmap *pBMP = new CBitmap;  
 pBMP->Attach(hBMP);  
   
 if (!m_cImageList.Create(16,16, ILC_COLOR16|ILC_MASK, 6, 6))  
     AfxMessageBox("Problem in creating ImageList");  
 this->m_cImageList.Add(pBMP, RGB(255, 255, 255));  //Mask部分如沒有其他顏色要過濾掉的話,就設成白色

[CTreeCtrl]取得Item的Handle

1.GetRootItem():取得目前TreeCtrl上的根項目。

使用此函式,第一個會取得的為Mountain。












2.GetNextSiblingItem():取得下一個同階層的項目。
  在此函式前呼叫GetRootItem()的話,則在呼叫此函式時會得到River、Houses、Road、Plant。

3.把GetRootItem()取得到的HTREEITEM丟給GetChildItem(),則會得到Fold。之後再使用GetNextSiblingItem(),則會得到Fault-Block。當GetNextSiblingItem()回傳為NULL時,則代表已無可用的child item存在。

4.GetSelectedItem():取得目前左鍵點選之項目。(回應之事件為OnClick時,才算有選中)

5.GetFirstVisibleItem():取得目前CTreeCtrl第一個看的到的項目。

使用此函式第一個會得到Mountain。
(目前測試,在進行item新增後,再使用此函式,有時候會得到Fault-Block。目前原因不明,需再多進行測試。)









6.GetNextVisibleItem():取得下一個看的到的項目。
即Mountain、River、Houses、Plant及其底下項目。唯獨Road只會得到根項目而已。

[TreeList]CTreeCtrl更新選定之Root項目的分支

在取得到目前所要更新的Root Item後,先呼叫CTreeCtrl::GetChildItem()取得到第一個Leaf的HTREEITEM。
之後僅需使用CTreeCtrl::GetNextSiblingItem()來取得下一個相鄰的Leaf。

程式碼如下:
 HTREEITEM hCurSelItem = this->m_TreeCtrl.GetSelectedItem();  
   
 //Update to UI  
 HTREEITEM hLeafItem = NULL;  
   
 hLeafItem = this->m_treRolesSetting.GetChildItem(hCurSelItem);  
 this->m_treRolesSetting.SetItemText(hLeafItem, "1st Leaf");  
   
 hLeafItem = this->m_treRolesSetting.GetNextSiblingItem(hLeafItem);  
 this->m_treRolesSetting.SetItemText(hLeafItem, "2nd Leaf");  

[TreeCtrl]CTreeCtrl取得目前滑鼠右鍵點選項目

這邊需使用到HitTest()來取得滑鼠點選的項目。

步驟如下:
1.使用GetCursorPos()來取得目前滑鼠座標。
2.使用CTreeCtrl::ScreenToClient()轉換滑鼠座標位置到CTreeCtrl的相對位置。
3.使用CTreeCtrl::HitTest()來取得此座標位置是否有Item存在。
4.判斷HitTest()回傳的Flag狀態是否為TVHT_ONITEM
5.如上述步驟都成立,則HitTest()回傳之HTREEITEM則為所要之Item。如此值為NULL,則代表此座標位置並無Tree Item存在。

程式碼如下:
 CPoint pt;  
 UINT unFlag = 0;  
 ::GetCursorPos(&pt);  
 pTree->ScreenToClient(&pt);  
   
 //When this function is called, the pt parameter specifies the coordinates of the point to test.   
 //The function returns the handle of the item at the specified point or NULL if no item occupies the point.   
 //In addition, the pFlags parameter contains a value that indicates the location of the specified point.  
 HTREEITEM htreeHitItem = pTree->HitTest(pt, &unFlag);  
   
 if ( htreeHitItem == NULL || !(unFlag&TVHT_ONITEM) )        //No hit item, and not on item  
 {  
     //Just show Create  
     return false;   
 }else if ( htreeHitItem && (unFlag & TVHT_ONITEM) ) {  
     //Just show edit and delete  
     pTree->Select(htreeHitItem, TVGN_CARET);        //Set this item be selected  
     //pTree->SelectItem(htreeHitItem);              //用這個也可以
 }else{        //Not allow  
     return false;  
 }    //End of if ( htreeHitItem == NULL || !(unFlag&TVHT_ONITEM) )  

如需再指定此Item被選擇,僅需使用CTreeCtrl::Select()或是CTreeCtrl::SelectItem()即可。

Build docker image from multiple build contexts

Build docker image from multiple build contexts ...