void KGTreeCtrl::SortTree(HTREEITEM hTreeItem) { HTREEITEM hSubItem = NULL; if (!hTreeItem) { hTreeItem = GetRootItem(); // hTreeItem = GetChildItem(TVI_ROOT); KG_PROCESS_ERROR(hTreeItem); SortChildren(NULL); } hSubItem = hTreeItem; SortChildren(hSubItem); HTREEITEM BrotherItem = hSubItem; if (ItemHasChildren(hSubItem)) { hSubItem = GetChildItem(hSubItem); SortTree(hSubItem); } hSubItem = GetNextSiblingItem(BrotherItem); KG_PROCESS_ERROR(hSubItem); SortTree(hSubItem); Exit0: return ; }
// Recursively sort the entire tree void CMultiSelTreeCtrl::SortTree(HTREEITEM topNode/*=NULL*/, HTREEITEM parentNode/*=NULL*/) { HTREEITEM item; // Sort things at the this level if (parentNode && (m_SortByExtension || m_SortByResolveStat || m_SortByAction || m_SortByFilename)) { TVSORTCB tvsortcb; tvsortcb.hParent = topNode; tvsortcb.lParam = (m_SortByResolveStat ? 2 : 0) + (m_SortByExtension ? 1 : 0) + (m_SortByFilename ? 8 : 0) + (m_SortByAction ? 4 : 0); tvsortcb.lpfnCompare = SortTreeCB; SortChildrenCB(&tvsortcb); } else SortChildren(topNode); // Get the first item at this level if(topNode == NULL) item=GetNextItem(TVI_ROOT, TVGN_ROOT); else item=GetChildItem(topNode); // Get first child // Recurse all items that have children while(item != NULL) { if(ItemHasChildren(item)) SortTree(item, topNode); item=GetNextSiblingItem(item); } }
void InfoFrom::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); CRect m_wndRect; GetClientRect(&m_wndRect); CRect m_headerRect; // create the header { m_headerRect.left = m_headerRect.top = -1; m_headerRect.right = m_wndRect.Width(); m_treeList.m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER); } static CFont font; font.CreateFont(100, 0, 0, 0, FW_NORMAL, FALSE,FALSE,FALSE,GB2312_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH|FF_MODERN,"宋体"); //m_treeList.m_wndHeader.SetFont(&font); m_treeList.SetFont(&font); CSize textSize; // set header's pos, dimensions and image list { CDC *pDC = m_treeList.m_wndHeader.GetDC(); pDC->SelectObject(&m_treeList.m_headerFont); textSize = pDC->GetTextExtent("A"); m_treeList.m_wndHeader.SetWindowPos(&wndTop, 0, 0, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW); //m_treeList.m_cImageList.Create(IDB_HEADER, 16, 10, 0); //m_treeList.m_wndHeader.SetImageList(&m_treeList.m_cImageList); m_treeList.m_wndHeader.UpdateWindow(); } CRect m_treeListRect; // create the tree itself { GetClientRect(&m_wndRect); m_treeListRect.left=0; m_treeListRect.top = textSize.cy+4; m_treeListRect.right = m_headerRect.Width()-5; m_treeListRect.bottom = m_wndRect.Height()-GetSystemMetrics(SM_CYHSCROLL)-4; m_treeList.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeListRect, this, ID_TREE_LIST_CTRL); } m_treeList.InsertColumn(0, "名称", LVCFMT_LEFT, 360); m_treeList.InsertColumn(1, "详细内容", LVCFMT_LEFT, 360); m_init = TRUE; SortTree(0, TRUE, m_treeList.GetRootItem()); }
void Comparer::Compare(Tree *tree1, Tree *tree2) { std::multiset<Node *, NCompare> SNodes1, SNodes2; std::multiset<Node *, NCompare>::iterator SNIter1, SNIter2; std::vector<Node *> child; element e1, e2; bool delpair=false; std::pair<std::multiset<Node *, NCompare>::iterator, std::multiset<Node *, NCompare>::iterator> p; SortTree(tree1->getTRoot(), SNodes1); SortTree(tree2->getTRoot(), SNodes2); SNodes1.erase(tree1->getTRoot()); SNodes2.erase(tree2->getTRoot()); for (SNIter1 = SNodes1.begin(); SNIter1 != SNodes1.end(); SNIter1++) { p = SNodes2.equal_range(*SNIter1); //for (SNIter2 = SNodes2.begin(); SNIter2 != SNodes2.end(); SNIter2++) for (SNIter2 = p.first; SNIter2 != p.second; SNIter2++) { if (IsSimilar(*SNIter1, *SNIter2)) { delpair = true; similarnodes.push_back(std::make_pair(*SNIter1, *SNIter2)); } else continue; } //similarnodes.push_back(std::make_pair(*SNIter1, *SNIter2)); //delete children pairs child = (*SNIter1)->getChildren(); if (delpair) { for (auto first : child) DeletePair(first); delpair = false; } } }
void CMultiSelTreeCtrl::OnTimer(UINT nIDEvent) { CTreeCtrl::OnTimer(nIDEvent); if (nIDEvent == SORT_TIMER) { m_Timer = 0; ::KillTimer(m_hWnd, SORT_TIMER); SortTree(); } }
void Comparer::SortTree(Node *p, std::multiset<Node *, NCompare> &setNodes) { std::vector<Node *> temp; setNodes.insert(p); temp = p->getChildren(); for (auto node : temp) { SortTree(node, setNodes); } temp.clear(); }
HTNode* CreatHFM(FILE *fp,short *n,WeightType *FileLength) { HTNode *ht = NULL; int i,m,s1,s2; MyType ch; ht=(HTNode *)malloc( 2*N*sizeof(HTNode) ); if(!ht) exit(1); for(i = 0;i < N;i++) { ht[i].weight = 0; ht[i].ch = (MyType)i;/*1-n号ch 为字符,初始化*/ } /* 统计字符数量 */ for(*FileLength = 0; !feof(fp) ;++(*FileLength) ) { ch = fgetc(fp);//fread(&ch,1,1,fp); ht[ch].weight++;//printf("ht[%c].weight= %ld\n",0,ht[0].weight); } --(*FileLength);//去掉文件结束后的长度 *n = SortTree(ht); m = *n*2-1; //free(&ht[m+1]); //printf("叶子个数= %d\n",*n);//getchar(); if(1 == *n) { ht[0].parent=1; return ht; } else if( 0 > *n) return NULL; for(i = m-1;i >= 0;i--) { ht[i].LChild = 0; ht[i].parent = 0; ht[i].RChild = 0; } /* ------------初始化完毕!对应算法步骤1---------*/ for(i = *n;i < m;i++) //创建非叶子结点,建哈夫曼树 { //在ht[0]~ht[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2返回 SelectMinTree(ht,i-1,&s1); ht[s1].parent=i; ht[i].LChild=s1; SelectMinTree(ht,i-1,&s2); ht[s2].parent=i; ht[i].RChild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; } /*哈夫曼树建立完毕*/// puts(" over^_^"); return ht; }
void SymbolTree::BuildTree(const wxFileName &fileName) { // Clear the tree DeleteAllItems(); m_items.clear(); m_globalsNode = wxTreeItemId(); m_prototypesNode = wxTreeItemId(); m_macrosNode = wxTreeItemId(); m_sortItems.clear(); m_fileName = fileName; // Get the current tree m_tree = TagsManagerST::Get()->Load(m_fileName); if ( !m_tree ) { return; } // Add invisible root node wxTreeItemId root; root = AddRoot(fileName.GetFullName(), 15, 15); TreeWalker<wxString, TagEntry> walker(m_tree->GetRoot()); // add three items here: // the globals node, the mcros and the prototype node m_globalsNode = AppendItem(root, wxT("Global Functions and Variables"), 2, 2, new MyTreeItemData(wxT("Global Functions and Variables"), wxEmptyString)); m_prototypesNode = AppendItem(root, wxT("Functions Prototypes"), 2, 2, new MyTreeItemData(wxT("Functions Prototypes"), wxEmptyString)); m_macrosNode = AppendItem(root, wxT("Macros"), 2, 2, new MyTreeItemData(wxT("Macros"), wxEmptyString)); // Iterate over the tree and add items m_sortItems.clear(); Freeze(); for (; !walker.End(); walker++) { // Add the item to the tree TagNode* node = walker.GetNode(); // Skip root node if (node->IsRoot()) continue; // Add the node AddItem(node); } SortTree(m_sortItems); Thaw(); //select the root node by default if (!(GetWindowStyleFlag() & wxTR_HIDE_ROOT)) { //root is visible, select it SelectItem(GetRootItem()); } }
BOOL InfoFrom::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam; if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCLICK)) { int nCol = pHDN->iItem; BOOL bAscending = FALSE; if(m_treeList.m_wndHeader.GetItemImage(nCol)==-1) bAscending = TRUE; else if(m_treeList.m_wndHeader.GetItemImage(nCol)==1) bAscending = TRUE; for(int i=0;i<m_treeList.GetColumnsNum();i++) { m_treeList.m_wndHeader.SetItemImage(i, -1); } if(bAscending) m_treeList.m_wndHeader.SetItemImage(nCol, 0); else m_treeList.m_wndHeader.SetItemImage(nCol, 1); m_treeList.SortItems(nCol, bAscending, NULL); SortTree(nCol, bAscending, m_treeList.GetRootItem()); m_treeList.UpdateWindow(); } else if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCHANGED)) { int m_nPrevColumnsWidth = m_treeList.GetColumnsWidth(); m_treeList.RecalcColumnsWidth(); //ResetScrollBar(); // in case we were at the scroll bar's end, // and some column's width was reduced, // update header's position (move to the right). CRect m_treeRect; m_treeList.GetClientRect(&m_treeRect); CRect m_headerRect; m_treeList.m_wndHeader.GetClientRect(&m_headerRect); m_treeList.Invalidate(); } else GetParent()->SendMessage(WM_NOTIFY, wParam, lParam); return CFormView::OnNotify(wParam, lParam, pResult); }
void ProjectExplorerWindow::UpdateFile(Project::File* file) { int scroll_pos = m_tree->GetScrollPos(wxVERTICAL); m_tree->Freeze(); wxArrayTreeItemIds selectedItems; m_tree->GetSelections(selectedItems); wxTreeItemId fileNode = FindFile(m_tree->GetRootItem(), file); bool isSelected = m_tree->IsSelected(fileNode); if (isSelected) m_tree->UnselectItem(fileNode); RemoveFileSymbols(m_tree->GetRootItem(), file); //If only one item is selected, need to remove it later if (isSelected && selectedItems.size() == 1) { selectedItems.clear(); m_tree->GetSelections(selectedItems); //fileNode = m_tree->UnselectItem } wxTreeItemId node = m_root; if (file->directoryPath.IsEmpty() == false) { wxStack<wxTreeItemId> stack; wxTreeItemIdValue cookie; wxTreeItemId temp = m_tree->GetFirstChild(node, cookie); wxString target = file->directoryPath; while (temp.IsOk()) { if (m_tree->GetItemText(temp) == target) break; temp = m_tree->GetNextChild(temp, cookie); } if (temp.IsOk() == false) temp = m_root; node = temp; } RebuildForFile(node, file); SortTree(m_tree->GetRootItem()); m_tree->SetScrollPos(wxVERTICAL, scroll_pos); m_tree->Thaw(); }
void InfoFrom::SortTree(int nCol, BOOL bAscending, HTREEITEM hParent) { HTREEITEM hChild; HTREEITEM hPa = hParent; while(hPa!=NULL) { if(m_treeList.ItemHasChildren(hPa)) { hChild = m_treeList.GetChildItem(hPa); m_treeList.SortItems(nCol, bAscending, hPa); SortTree(nCol, bAscending, hChild); } hPa = m_treeList.GetNextSiblingItem(hPa); } }
void ProjectExplorerWindow::SortTree(wxTreeItemId node) { m_tree->SortChildren(node); //Sort all childen recursively wxTreeItemIdValue cookie; wxTreeItemId temp = m_tree->GetFirstChild(node, cookie); while (temp.IsOk()) { if (m_tree->HasChildren(temp)) { SortTree(temp); } temp = m_tree->GetNextChild(temp, cookie); } }
void SymbolTree::AddSymbols(const std::vector<std::pair<wxString, TagEntry> > &items) { if (!m_tree) return; m_sortItems.clear(); Freeze(); for (size_t i=0; i<items.size(); i++) { TagEntry data = items.at(i).second; if (m_tree) { TagNode *node = m_tree->AddEntry(data); if (node) { AddItem(node); } } } // for(size_t i=0; i<items.size(); i++) SortTree(m_sortItems); m_sortItems.clear(); Thaw(); }
void CTreeListFrame::SortTree(int nCol, BOOL bAscending, HTREEITEM hParent) { if (m_sortingEnabled) { HTREEITEM hChild; HTREEITEM hPa = hParent; while (hPa != NULL) { if(getTree().ItemHasChildren(hPa)) { hChild = getTree().GetChildItem(hPa); getTree().SortItems(nCol, bAscending, hPa); SortTree(nCol, bAscending, hChild); } hPa = getTree().GetNextSiblingItem(hPa); } } }
void ProjectExplorerWindow::Rebuild() { m_tree->Freeze(); m_tree->DeleteAllItems(); m_root = m_tree->AddRoot("Root"); if (m_project != NULL) { for (unsigned int i = 0; i < m_project->GetNumDirectories(); ++i) { RebuildForDirectory(m_project->GetDirectory(i)); } for (unsigned int i = 0; i < m_project->GetNumFiles(); ++i) { RebuildForFile(m_root, m_project->GetFile(i)); } } SortTree(m_tree->GetRootItem()); TraverseTree(m_root, [&,this](wxTreeItemId const &id) { m_tree->SetItemSelectedColour(id, m_itemSelectBackground); }); // For whatever reason the unselect event isn't reported properly // after deleting all items, so explicitly clear out the info box. m_infoBox->SetFile(NULL); m_tree->Thaw(); // Select the first item in the newly created list wxTreeItemId firstItem = m_tree->GetFirstVisibleItem(); if (firstItem.IsOk()) m_tree->SelectItem(firstItem); }
void SymbolTree::BuildTree(const wxFileName &fileName, TagEntryPtrVector_t* tags /*NULL*/) { TagEntryPtrVector_t newTags; if ( !tags ) { // Get the current database ITagsStoragePtr db = TagsManagerST::Get()->GetDatabase(); if ( ! db ) { Clear(); return; } // Load the new tags from the database db->SelectTagsByFile(fileName.GetFullPath(), newTags); // Compare the new tags with the old ones if ( TagsManagerST::Get()->AreTheSame(newTags, m_currentTags) ) return; m_currentTags.clear(); m_currentTags.insert(m_currentTags.end(), newTags.begin(), newTags.end()); } else { m_currentTags.clear(); m_currentTags.insert(m_currentTags.end(), tags->begin(), tags->end()); } wxWindowUpdateLocker locker(this); Clear(); m_fileName = fileName; // Convert them into tree m_tree = TagsManagerST::Get()->Load(m_fileName, &m_currentTags); if ( !m_tree ) { return; } // Add invisible root node wxTreeItemId root; root = AddRoot(fileName.GetFullName(), 15, 15); TreeWalker<wxString, TagEntry> walker(m_tree->GetRoot()); // add three items here: // the globals node, the mcros and the prototype node m_globalsNode = AppendItem(root, wxT("Global Functions and Variables"), 2, 2, new MyTreeItemData(wxT("Global Functions and Variables"), wxEmptyString)); m_prototypesNode = AppendItem(root, wxT("Functions Prototypes"), 2, 2, new MyTreeItemData(wxT("Functions Prototypes"), wxEmptyString)); m_macrosNode = AppendItem(root, wxT("Macros"), 2, 2, new MyTreeItemData(wxT("Macros"), wxEmptyString)); // Iterate over the tree and add items m_sortItems.clear(); Freeze(); for (; !walker.End(); walker++) { // Add the item to the tree TagNode* node = walker.GetNode(); // Skip root node if (node->IsRoot()) continue; // Add the node AddItem(node); } SortTree(m_sortItems); if ( ItemHasChildren(m_globalsNode) == false ) { Delete(m_globalsNode); } if ( ItemHasChildren(m_prototypesNode) == false ) { Delete(m_prototypesNode); } if ( ItemHasChildren(m_macrosNode) == false ) { Delete(m_macrosNode); } Thaw(); //select the root node by default if (!(GetWindowStyleFlag() & wxTR_HIDE_ROOT)) { //root is visible, select it SelectItem(GetRootItem()); } }
void ProjectExplorerWindow::InsertDirectory(Project::Directory* directory) { RebuildForDirectory(directory); SortTree(m_tree->GetRootItem()); }
void ProjectExplorerWindow::InsertFile(Project::File* file) { RebuildForFile(m_root, file); SortTree(m_tree->GetRootItem()); }
void CTLFrame::Initialize() { // creates all the objects in frame - // header, tree, horizontal scroll bar /* CRect m_wndRect; GetWindowRect(&m_wndRect); CRect m_headerRect; // create the header { m_headerRect.left = m_headerRect.top = -1; m_headerRect.right = m_wndRect.Width(); m_tree.m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER); } CSize textSize; // set header's pos, dimensions and image list { LOGFONT logfont; CFont *pFont = GetParent()->GetFont(); pFont->GetLogFont( &logfont ); m_tree.m_headerFont.CreateFontIndirect( &logfont ); m_tree.m_wndHeader.SetFont(&m_tree.m_headerFont); CDC *pDC = m_tree.m_wndHeader.GetDC(); pDC->SelectObject(&m_tree.m_headerFont); textSize = pDC->GetTextExtent("A"); m_tree.m_wndHeader.UpdateWindow(); } CRect m_treeRect; // create the tree itself { GetWindowRect(&m_wndRect); m_treeRect.left=0; m_treeRect.top = textSize.cy+4; m_treeRect.right = m_headerRect.Width()-5; m_treeRect.bottom = m_wndRect.Height()-GetSystemMetrics(SM_CYHSCROLL)-4; m_tree.Create(WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeRect, this, ID_TREE_LIST_CTRL); } // finally, create the horizontal scroll bar { CRect m_scrollRect; m_scrollRect.left=0; m_scrollRect.top = m_treeRect.bottom; m_scrollRect.right = m_treeRect.Width()-GetSystemMetrics(SM_CXVSCROLL); m_scrollRect.bottom = m_wndRect.bottom; m_horScrollBar.Create(WS_CHILD | WS_VISIBLE | WS_DISABLED | SBS_HORZ | SBS_TOPALIGN, m_scrollRect, this, ID_TREE_LIST_SCROLLBAR); SCROLLINFO si; si.fMask = SIF_PAGE; si.nPage = m_treeRect.Width(); m_horScrollBar.SetScrollInfo(&si, FALSE); }*/ SortTree(0, TRUE, m_tree.GetRootItem()); }
BOOL CTreeListFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam; if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCLICK)) { if (m_sortingEnabled) { int nCol = pHDN->iItem; BOOL bAscending = FALSE; if(getTree().m_wndHeader.GetItemImage(nCol)==-1) bAscending = TRUE; else if(getTree().m_wndHeader.GetItemImage(nCol)==1) bAscending = TRUE; for(int i=0;i<getTree().GetColumnsNum();i++) { getTree().m_wndHeader.SetItemImage(i, -1); } if(bAscending) getTree().m_wndHeader.SetItemImage(nCol, 0); else getTree().m_wndHeader.SetItemImage(nCol, 1); getTree().SortItems(nCol, bAscending, NULL); SortTree(nCol, bAscending, getTree().GetRootItem()); getTree().UpdateWindow(); } } else if((wParam == ID_TREE_LIST_HEADER) && (pHDN->hdr.code == HDN_ITEMCHANGED)) { int m_nPrevColumnsWidth = getTree().GetColumnsWidth(); getTree().RecalcColumnsWidth(); ResetScrollBar(); // in case we were at the scroll bar's end, // and some column's width was reduced, // update header's position (move to the right). CRect m_treeRect; getTree().GetClientRect(&m_treeRect); CRect m_headerRect; getTree().m_wndHeader.GetClientRect(&m_headerRect); if((m_nPrevColumnsWidth > getTree().GetColumnsWidth()) && (m_horScrollBar.GetScrollPos() == m_horScrollBar.GetScrollLimit()-1) && (m_treeRect.Width() < getTree().GetColumnsWidth())) { getTree().m_nOffset = -getTree().GetColumnsWidth()+m_treeRect.Width(); getTree().m_wndHeader.SetWindowPos(&wndTop, getTree().m_nOffset, 0, 0, 0, SWP_NOSIZE); } getTree().Invalidate(); GetParent()->SendMessage(WM_NOTIFY, wParam, lParam); } else { GetParent()->SendMessage(WM_NOTIFY, wParam, lParam); } return CWnd::OnNotify(wParam, lParam, pResult); }
void CTreeListFrame::Initialize() { // creates all the objects in frame - // header, tree, horizontal scroll bar int scrollBarWidth = GetSystemMetrics(SM_CXHSCROLL); int scrollBarHeight = GetSystemMetrics(SM_CYHSCROLL); CRect m_wndRect; GetWindowRect(&m_wndRect); CRect m_headerRect; // create the header { //m_headerRect.left = m_headerRect.top = -1; m_headerRect.left = m_headerRect.top = 0; m_headerRect.right = m_wndRect.Width(); getTree().m_wndHeader.Create(WS_CHILD | WS_VISIBLE | HDS_BUTTONS | HDS_HORZ, m_headerRect, this, ID_TREE_LIST_HEADER); } CSize textSize; // set header's pos, dimensions and image list { LOGFONT logfont; CFont *pFont = GetParent()->GetFont(); pFont->GetLogFont( &logfont ); getTree().m_headerFont.CreateFontIndirect( &logfont ); getTree().m_wndHeader.SetFont(&getTree().m_headerFont); CDC *pDC = getTree().m_wndHeader.GetDC(); pDC->SelectObject(&getTree().m_headerFont); textSize = pDC->GetTextExtent("A"); //getTree().m_wndHeader.SetWindowPos(&wndTop, -1, -1, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW); getTree().m_wndHeader.SetWindowPos(&wndTop, 0, 0, m_headerRect.Width(), textSize.cy+4, SWP_SHOWWINDOW); getTree().m_cImageList.Create(IDB_HEADERSORTARROWS, 16, 10, RGB(192,192,192)); getTree().m_wndHeader.SetImageList(&getTree().m_cImageList); } CRect m_treeRect; // create the tree itself { GetWindowRect(&m_wndRect); m_treeRect.left = 0; m_treeRect.top = textSize.cy + 4; m_treeRect.right = m_headerRect.Width() - 5; //m_treeRect.bottom = m_wndRect.Height() - GetSystemMetrics(SM_CYHSCROLL) - 4; m_treeRect.bottom = m_wndRect.Height() - GetSystemMetrics(SM_CYHSCROLL); getTree().Create(WS_BORDER | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS, m_treeRect, this, ID_TREE_LIST_CTRL); } // finally, create the horizontal scroll bar { CRect m_scrollRect; m_scrollRect.left = 0; m_scrollRect.top = m_treeRect.bottom; int scrollRectTop = m_wndRect.bottom - GetSystemMetrics(SM_CYHSCROLL); m_scrollRect.right = m_treeRect.Width() - GetSystemMetrics(SM_CXVSCROLL); m_scrollRect.bottom = m_wndRect.bottom; m_horScrollBar.Create(WS_CHILD | WS_VISIBLE | WS_DISABLED | SBS_HORZ | SBS_TOPALIGN, m_scrollRect, this, ID_TREE_LIST_SCROLLBAR); } SortTree(0, TRUE, getTree().GetRootItem()); }