📄 mytreectrl.cpp
字号:
// Make an image list containing small icons wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[5]; icons[0] = wxIcon(icon1_xpm); icons[1] = wxIcon(icon2_xpm); icons[2] = wxIcon(icon3_xpm); icons[3] = wxIcon(icon4_xpm); icons[4] = wxIcon(icon5_xpm); int sizeOrig = icons[0].GetWidth(); for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) { if ( size == sizeOrig ) { images->Add(icons[i]); } else { images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size))); } } AssignImageList(images);}#if USE_GENERIC_TREECTRL || !defined(__WXMSW__)void MyTreeCtrl::CreateButtonsImageList(int size){ if ( size == -1 ) { SetButtonsImageList(NULL); return; } // Make an image list containing small icons wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[4]; icons[0] = wxIcon(icon3_xpm); // closed icons[1] = wxIcon(icon3_xpm); // closed, selected icons[2] = wxIcon(icon5_xpm); // open icons[3] = wxIcon(icon5_xpm); // open, selected for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) { int sizeOrig = icons[i].GetWidth(); if ( size == sizeOrig ) { images->Add(icons[i]); } else { images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size))); } } AssignButtonsImageList(images);#elsevoid MyTreeCtrl::CreateButtonsImageList(int WXUNUSED(size)){#endif}int MyTreeCtrl::OnCompareItems(const wxTreeItemId& item1, const wxTreeItemId& item2){ if ( m_reverseSort ) { // just exchange 1st and 2nd items return wxTreeCtrl::OnCompareItems(item2, item1); } else { return wxTreeCtrl::OnCompareItems(item1, item2); }}void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent, size_t numChildren, size_t depth, size_t folder){ if ( depth > 0 ) { bool hasChildren = depth > 1; wxString str; for ( size_t n = 0; n < numChildren; n++ ) { // at depth 1 elements won't have any more children if ( hasChildren ) str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1)); else str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1)); // here we pass to AppendItem() normal and selected item images (we // suppose that selected image follows the normal one in the enum) int image, imageSel; if ( m_showImages ) { image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; imageSel = image + 1; } else { image = imageSel = -1; } wxTreeItemId id = AppendItem(idParent, str, image, imageSel, new MyTreeItemData(str)); // and now we also set the expanded one (only for the folders) if ( hasChildren && m_showImages ) { SetItemImage(id, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); } // remember the last child for OnEnsureVisible() if ( !hasChildren && n == numChildren - 1 ) { m_lastItem = id; } AddItemsRecursively(id, numChildren, depth - 1, n + 1); } } //else: done!}void MyTreeCtrl::AddTestItemsToTree(size_t numChildren, size_t depth){ int image = m_showImages ? MyTreeCtrl::TreeCtrlIcon_Folder : -1; wxTreeItemId rootId = AddRoot(wxT("Root"), image, image, new MyTreeItemData(wxT("Root item"))); if ( image != -1 ) { SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); } AddItemsRecursively(rootId, numChildren, depth, 0); // set some colours/fonts for testing SetItemFont(rootId, *wxITALIC_FONT); wxTreeItemIdValue cookie; wxTreeItemId id = GetFirstChild(rootId, cookie); SetItemTextColour(id, *wxBLUE); id = GetNextChild(rootId, cookie); id = GetNextChild(rootId, cookie); SetItemTextColour(id, *wxRED); SetItemBackgroundColour(id, *wxLIGHT_GREY);}void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, wxTreeItemIdValue cookie){ wxTreeItemId id; if ( !cookie ) id = GetFirstChild(idParent, cookie); else id = GetNextChild(idParent, cookie); if ( !id.IsOk() ) return; //wxString text = GetItemText(id); //wxLogMessage(text); if (ItemHasChildren(id)) GetItemsRecursively(id); GetItemsRecursively(idParent, cookie);}void MyTreeCtrl::DoToggleIcon(const wxTreeItemId& item){ int image = (GetItemImage(item) == TreeCtrlIcon_Folder) ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; SetItemImage(item, image, wxTreeItemIcon_Normal); image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected) ? TreeCtrlIcon_FileSelected : TreeCtrlIcon_FolderSelected; SetItemImage(item, image, wxTreeItemIcon_Selected);}void MyTreeCtrl::LogEvent(const wxChar *name, const wxTreeEvent& event){ /*wxTreeItemId item = event.GetItem(); wxString text; if ( item.IsOk() ) text << _T('"') << GetItemText(item).c_str() << _T('"'); else text = _T("invalid item"); wxLogMessage(wxT("%s(%s)"), name, text.c_str()); */}// avoid repetition#define TREE_EVENT_HANDLER(name) \void MyTreeCtrl::name(wxTreeEvent& event) \{ \ LogEvent(_T(#name), event); \ SetLastItem(wxTreeItemId()); \ event.Skip(); \}TREE_EVENT_HANDLER(OnBeginRDrag)TREE_EVENT_HANDLER(OnDeleteItem)TREE_EVENT_HANDLER(OnGetInfo)TREE_EVENT_HANDLER(OnSetInfo)TREE_EVENT_HANDLER(OnItemExpanded)TREE_EVENT_HANDLER(OnItemExpanding)TREE_EVENT_HANDLER(OnItemCollapsed)TREE_EVENT_HANDLER(OnSelChanged)TREE_EVENT_HANDLER(OnSelChanging)TREE_EVENT_HANDLER(OnItemActivated)#undef TREE_EVENT_HANDLERvoid LogKeyEvent(const wxChar *name, const wxKeyEvent& event){ wxString key; long keycode = event.GetKeyCode(); { switch ( keycode ) { case WXK_BACK: key = wxT("BACK"); break; case WXK_TAB: key = wxT("TAB"); break; case WXK_RETURN: key = wxT("RETURN"); break; case WXK_ESCAPE: key = wxT("ESCAPE"); break; case WXK_SPACE: key = wxT("SPACE"); break; case WXK_DELETE: key = wxT("DELETE"); break; case WXK_START: key = wxT("START"); break; case WXK_LBUTTON: key = wxT("LBUTTON"); break; case WXK_RBUTTON: key = wxT("RBUTTON"); break; case WXK_CANCEL: key = wxT("CANCEL"); break; case WXK_MBUTTON: key = wxT("MBUTTON"); break; case WXK_CLEAR: key = wxT("CLEAR"); break; case WXK_SHIFT: key = wxT("SHIFT"); break; case WXK_ALT: key = wxT("ALT"); break; case WXK_CONTROL: key = wxT("CONTROL"); break; case WXK_MENU: key = wxT("MENU"); break; case WXK_PAUSE: key = wxT("PAUSE"); break; case WXK_CAPITAL: key = wxT("CAPITAL"); break; case WXK_END: key = wxT("END"); break; case WXK_HOME: key = wxT("HOME"); break; case WXK_LEFT: key = wxT("LEFT"); break; case WXK_UP: key = wxT("UP"); break; case WXK_RIGHT: key = wxT("RIGHT"); break; case WXK_DOWN: key = wxT("DOWN"); break; case WXK_SELECT: key = wxT("SELECT"); break; case WXK_PRINT: key = wxT("PRINT"); break; case WXK_EXECUTE: key = wxT("EXECUTE"); break; case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break; case WXK_INSERT: key = wxT("INSERT"); break; case WXK_HELP: key = wxT("HELP"); break; case WXK_NUMPAD0: key = wxT("NUMPAD0"); break; case WXK_NUMPAD1: key = wxT("NUMPAD1"); break; case WXK_NUMPAD2: key = wxT("NUMPAD2"); break; case WXK_NUMPAD3: key = wxT("NUMPAD3"); break; case WXK_NUMPAD4: key = wxT("NUMPAD4"); break; case WXK_NUMPAD5: key = wxT("NUMPAD5"); break; case WXK_NUMPAD6: key = wxT("NUMPAD6"); break; case WXK_NUMPAD7: key = wxT("NUMPAD7"); break; case WXK_NUMPAD8: key = wxT("NUMPAD8"); break; case WXK_NUMPAD9: key = wxT("NUMPAD9"); break; case WXK_MULTIPLY: key = wxT("MULTIPLY"); break; case WXK_ADD: key = wxT("ADD"); break; case WXK_SEPARATOR: key = wxT("SEPARATOR"); break; case WXK_SUBTRACT: key = wxT("SUBTRACT"); break; case WXK_DECIMAL: key = wxT("DECIMAL"); break; case WXK_DIVIDE: key = wxT("DIVIDE"); break; case WXK_F1: key = wxT("F1"); break; case WXK_F2: key = wxT("F2"); break; case WXK_F3: key = wxT("F3"); break; case WXK_F4: key = wxT("F4"); break; case WXK_F5: key = wxT("F5"); break; case WXK_F6: key = wxT("F6"); break; case WXK_F7: key = wxT("F7"); break; case WXK_F8: key = wxT("F8"); break; case WXK_F9: key = wxT("F9"); break; case WXK_F10: key = wxT("F10"); break; case WXK_F11: key = wxT("F11"); break; case WXK_F12: key = wxT("F12"); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -