win32tree.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 1,700 行 · 第 1/3 页
CPP
1,700 行
if ( (keyState >> 15) ) { keyMask |= kmShift; } keyState = GetKeyState( VK_CONTROL ); if ( (keyState >> 15) ) { keyMask |= kmCtrl; } keyState = GetKeyState( VK_MENU ); if ( (keyState >> 15) ) { keyMask |= kmAlt; } VCF::MouseEvent event( treeControl_, Control::MOUSE_MOVE, mbmLeftButton, keyMask, &pt ); treeControl_->beginDragDrop( &event ); } } break; case TVN_BEGINDRAGA:{ NMTREEVIEWA* treeview = (NMTREEVIEWA*)lParam ; TreeItem* item = (TreeItem*)treeview->itemNew.lParam; if ( NULL != item ) { Point pt( treeview->ptDrag.x, treeview->ptDrag.y ); TreeItem* oldItem = treeControl_->getSelectedItem(); if ( item != oldItem ) { //hmm, we haven't selected this item before, so //let's go ahead and make it selected now //we do this because the TVN_SELECTIONCHANGED //won't get called at this point item->setSelected( true ); ItemEvent event( treeControl_, TREEITEM_SELECTED ); event.setUserData( (void*)item ); event.setPoint( &pt ); treeControl_->handleEvent( &event ); if ( NULL != oldItem ) { oldItem->setSelected( false ); } } SHORT keyState = GetKeyState( VK_SHIFT ); ulong32 keyMask = kmUndefined; if ( (keyState >> 15) ) { keyMask |= kmShift; } keyState = GetKeyState( VK_CONTROL ); if ( (keyState >> 15) ) { keyMask |= kmCtrl; } keyState = GetKeyState( VK_MENU ); if ( (keyState >> 15) ) { keyMask |= kmAlt; } VCF::MouseEvent event( treeControl_, Control::MOUSE_MOVE, mbmLeftButton, keyMask, &pt ); treeControl_->beginDragDrop( &event ); } } break; case TVN_BEGINLABELEDIT:{ } break; case TVN_BEGINRDRAG:{ } break; case TVN_DELETEITEM:{ } break; case TVN_ENDLABELEDITW:{ LPNMTVDISPINFOW lptvdi = (LPNMTVDISPINFOW) lParam ; if ( lptvdi->item.pszText ) { String text = lptvdi->item.pszText; TreeItem* item = (TreeItem*)lptvdi->item.lParam; item->setCaption( text ); wndProcResult = 1; result = true; } return false; } break; case TVN_ENDLABELEDITA:{ LPNMTVDISPINFOA lptvdi = (LPNMTVDISPINFOA) lParam ; if ( lptvdi->item.pszText ) { AnsiString text = lptvdi->item.pszText; TreeItem* item = (TreeItem*)lptvdi->item.lParam; item->setCaption( text ); wndProcResult = 1; result = true; } return false; } break; case TVN_GETDISPINFOW: { LPNMTVDISPINFOW lptvdi = (LPNMTVDISPINFOW) lParam ; if ( lptvdi->item.mask & TVIF_TEXT ) { static String text; TreeItem* item = (TreeItem*)lptvdi->item.lParam; if ( NULL != item ) { text = item->getCaption(); text.copy( lptvdi->item.pszText, text.size() ); lptvdi->item.pszText[text.size()] = 0; } } } break; case TVN_GETDISPINFOA: { LPNMTVDISPINFOA lptvdi = (LPNMTVDISPINFOA) lParam ; if ( lptvdi->item.mask & TVIF_TEXT ) { static AnsiString text; TreeItem* item = (TreeItem*)lptvdi->item.lParam; if ( NULL != item ) { text = item->getCaption(); text.copy( lptvdi->item.pszText, text.size() ); lptvdi->item.pszText[text.size()] = 0; } } } break; case TVN_GETINFOTIP:{ } break; case TVN_ITEMEXPANDEDA:{ internalTreeItemExpanded_ = true; NMTREEVIEWA* treeview = (NMTREEVIEWA*)lParam; TreeItem* item = (TreeItem*)treeview->itemNew.lParam; if ( NULL != item ) { if ( treeview->action & TVE_EXPAND ) { item->expand( true ); } else if ( treeview->action & TVE_COLLAPSE ) { item->expand( false ); } POINT tmpPt = {0,0}; GetCursorPos( &tmpPt ); ::ScreenToClient( hwnd_, &tmpPt ); ItemEvent event( treeControl_, TREEITEM_EXPANDED ); event.setUserData( (void*)item ); Point pt( tmpPt.x, tmpPt.y ); event.setPoint( &pt ); treeControl_->handleEvent( &event ); } internalTreeItemExpanded_ = false; } break; case TVN_ITEMEXPANDEDW:{ internalTreeItemExpanded_ = true; NMTREEVIEWW* treeview = (NMTREEVIEWW*)lParam; TreeItem* item = (TreeItem*)treeview->itemNew.lParam; if ( NULL != item ) { if ( treeview->action & TVE_EXPAND ) { item->expand( true ); } else if ( treeview->action & TVE_COLLAPSE ) { item->expand( false ); } POINT tmpPt = {0,0}; GetCursorPos( &tmpPt ); ::ScreenToClient( hwnd_, &tmpPt ); ItemEvent event( treeControl_, TREEITEM_EXPANDED ); event.setUserData( (void*)item ); Point pt( tmpPt.x, tmpPt.y ); event.setPoint( &pt ); treeControl_->handleEvent( &event ); } internalTreeItemExpanded_ = false; } break; case TVN_ITEMEXPANDING:{ } break; case TVN_KEYDOWN:{ } break; case TVN_SELCHANGEDW:{ NMTREEVIEWW* treeview = (NMTREEVIEWW*)lParam; TreeItem* item = (TreeItem*)treeview->itemNew.lParam; if ( NULL != item ) { item->setSelected( true ); POINT tmpPt = {0,0}; GetCursorPos( &tmpPt ); ::ScreenToClient( hwnd_, &tmpPt ); ItemEvent event( treeControl_, TREEITEM_SELECTED ); event.setUserData( (void*)item ); Point pt( tmpPt.x, tmpPt.y ); event.setPoint( &pt ); treeControl_->handleEvent( &event ); } item = (TreeItem*)treeview->itemOld.lParam; if ( NULL != item ) { item->setSelected( false ); } } break; case TVN_SELCHANGEDA:{ NMTREEVIEWA* treeview = (NMTREEVIEWA*)lParam; TreeItem* item = (TreeItem*)treeview->itemNew.lParam; if ( NULL != item ) { item->setSelected( true ); POINT tmpPt = {0,0}; GetCursorPos( &tmpPt ); ::ScreenToClient( hwnd_, &tmpPt ); ItemEvent event( treeControl_, TREEITEM_SELECTED ); event.setUserData( (void*)item ); Point pt( tmpPt.x, tmpPt.y ); event.setPoint( &pt ); treeControl_->handleEvent( &event ); } item = (TreeItem*)treeview->itemOld.lParam; if ( NULL != item ) { item->setSelected( false ); } } break; case TVN_SELCHANGING:{ } break; case TVN_SETDISPINFO:{ } break; case TVN_SINGLEEXPAND:{ } break;/*JCDo we need these? What advantage does processing these events have for us??? case NM_RCLICK :{ POINT pt = {0,0}; GetCursorPos( &pt ); ScreenToClient( hwnd_, &pt ); Point tmpPt( pt.x, pt.y ); VCF::MouseEvent event( getControl(), Control::MOUSE_CLICK, mbmRightButton, kmUndefined, &tmpPt ); if ( peerControl_ ) { peerControl_->handleEvent( &event ); } } break; case NM_CLICK :{ POINT pt = {0,0}; GetCursorPos( &pt ); ScreenToClient( hwnd_, &pt ); Point tmpPt( pt.x, pt.y ); VCF::MouseEvent event( getControl(), Control::MOUSE_CLICK, mbmLeftButton, kmUndefined, &tmpPt ); if ( peerControl_ ) { peerControl_->handleEvent( &event ); } } break; */ case NM_CUSTOMDRAW:{ static Rect itemRect; wndProcResult = CDRF_DODEFAULT; result = true; NMTVCUSTOMDRAW__* treeViewDraw = (NMTVCUSTOMDRAW__*)lParam; if ( NULL != treeViewDraw ) { switch ( treeViewDraw->nmcd.dwDrawStage ) { case CDDS_PREPAINT : { wndProcResult = CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT; } break; case CDDS_ITEMPREPAINT : { wndProcResult = CDRF_NOTIFYPOSTPAINT; } break; case CDDS_ITEMPOSTPAINT : { wndProcResult = CDRF_DODEFAULT; if ( NULL != treeViewDraw->nmcd.lItemlParam ) { TreeItem* item = (TreeItem*)treeViewDraw->nmcd.lItemlParam; if ( item->canPaint() ) { itemRect.left_ = treeViewDraw->nmcd.rc.left; itemRect.top_ = treeViewDraw->nmcd.rc.top; itemRect.right_ = treeViewDraw->nmcd.rc.right; itemRect.bottom_ = treeViewDraw->nmcd.rc.bottom; item->paint( peerControl_->getContext(), &itemRect ); } } } break; default : { wndProcResult = 0; } break; } } } break; default: { result = AbstractWin32Component::handleEventMessages( message, wParam, lParam, wndProcResult ); //result = CallWindowProc( oldTreeWndProc_, hwnd_, message, wParam, lParam ); } break; } return result;}void Win32Tree::addItem( TreeItem* item ){ HTREEITEM addedItem = NULL; if ( System::isUnicodeEnabled() ) { TVINSERTSTRUCTW insert; memset( &insert, 0, sizeof(TVINSERTSTRUCTW) ); TVITEMW tvItem; memset( &tvItem, 0, sizeof(TVITEMW) ); TreeItem* parent = item->getParent(); HTREEITEM itemParent = NULL; if ( NULL != parent ){ std::map<TreeItem*,HTREEITEM>::iterator it = treeItems_.find( parent ); if ( it != treeItems_.end() ){ itemParent = it->second; } else{ //throw exception; } } tvItem.mask = TVIF_TEXT | TVIF_PARAM; if ( imageListCtrl_ != NULL ) { tvItem.mask |= TVIF_IMAGE; tvItem.iImage = item->getImageIndex(); } if ( item->getStateImageIndex() >= 0 ) { tvItem.mask |= TVIF_STATE; //INDEXTOSTATEIMAGEMASK is one based, but Item::getStateImageIndex() is zero based tvItem.state = INDEXTOSTATEIMAGEMASK( item->getStateImageIndex() ); tvItem.stateMask = TVIS_STATEIMAGEMASK; } if ( item->getSelectedImageIndex() >= 0 ) { tvItem.mask |= TVIF_SELECTEDIMAGE ; tvItem.iSelectedImage = item->getSelectedImageIndex(); } tvItem.cchTextMax = 0;//item->getCaption().size()+1; //VCFChar* tmpName = new VCFChar[tvItem.cchTextMax]; //memset( tmpName, 0, tvItem.cchTextMax*sizeof(VCFChar) ); //item->getCaption().copy( tmpName, tvItem.cchTextMax-1 ); tvItem.pszText = LPSTR_TEXTCALLBACKW;//tmpName; tvItem.lParam = (LPARAM)item; insert.hParent = itemParent; insert.hInsertAfter = TVI_LAST; insert.item = tvItem; addedItem = (HTREEITEM)::SendMessage( hwnd_, TVM_INSERTITEMW, 0, (LPARAM)&insert ); } else { TVINSERTSTRUCTA insert; memset( &insert, 0, sizeof(TVINSERTSTRUCTA) ); TVITEMA tvItem; memset( &tvItem, 0, sizeof(TVITEMA) ); TreeItem* parent = item->getParent(); HTREEITEM itemParent = NULL; if ( NULL != parent ){ std::map<TreeItem*,HTREEITEM>::iterator it = treeItems_.find( parent ); if ( it != treeItems_.end() ){ itemParent = it->second; } else{ //throw exception; } } tvItem.mask = TVIF_TEXT | TVIF_PARAM; if ( imageListCtrl_ != NULL ) { tvItem.mask |= TVIF_IMAGE; tvItem.iImage = item->getImageIndex(); } if ( item->getStateImageIndex() >= 0 ) { tvItem.mask |= TVIF_STATE; //INDEXTOSTATEIMAGEMASK is one based, but Item::getStateImageIndex() is zero based tvItem.state = INDEXTOSTATEIMAGEMASK( item->getStateImageIndex() ); tvItem.stateMask = TVIS_STATEIMAGEMASK; } if ( item->getSelectedImageIndex() >= 0 ) { tvItem.mask |= TVIF_SELECTEDIMAGE ; tvItem.iSelectedImage = item->getSelectedImageIndex(); } tvItem.cchTextMax = 0;//item->getCaption().size()+1; //VCFChar* tmpName = new VCFChar[tvItem.cchTextMax]; //memset( tmpName, 0, tvItem.cchTextMax*sizeof(VCFChar) ); //item->getCaption().copy( tmpName, tvItem.cchTextMax-1 ); tvItem.pszText = LPSTR_TEXTCALLBACKA;//tmpName; tvItem.lParam = (LPARAM)item; insert.hParent = itemParent; insert.hInsertAfter = TVI_LAST; insert.item = tvItem; addedItem = (HTREEITEM)SendMessage( hwnd_, TVM_INSERTITEMA, 0, (LPARAM)&insert ); } //delete [] tmpName; treeItems_[item] = addedItem; item->addItemAddedHandler( itemAddedHandler_ ); item->addItemChangedHandler( itemChangedHandler_ ); item->addItemDeletedHandler( itemDeletedHandler_ ); item->addItemPaintHandler( itemPaintedHandler_ ); item->addItemSelectedHandler( itemSelectedHandler_ ); //now check the children Enumerator<TreeItem*>* children = item->getChildren(); if ( NULL != children ){ while ( children->hasMoreElements() ){ TreeItem* child = children->nextElement(); if ( NULL != child ){ addItem( child ); } } }}void Win32Tree::clear(){ treeItems_.clear(); TreeView_DeleteAllItems( hwnd_ );}void Win32Tree::onItemPaint( ItemEvent* event ){}void Win32Tree::onItemChanged( ItemEvent* event ){ if ( (NULL != event) && (peerControl_->getComponentState() != Component::csDestroying) ){ Object* source = event->getSource(); if ( NULL != source ){ TreeItem* item = dynamic_cast<TreeItem*>(source); if ( NULL != item ){ std::map<TreeItem*,HTREEITEM>::iterator it = treeItems_.find( item ); if ( it != treeItems_.end() ){ if ( event->getType() == DefaultTreeItem::teItemExpanded ) { if ( !internalTreeItemExpanded_ ){ if ( item->isExpanded() ) { TreeView_Expand( hwnd_, it->second, TVE_EXPAND ); } else { TreeView_Expand( hwnd_, it->second, TVE_COLLAPSE ); } } } else { if ( System::isUnicodeEnabled() ) { TVITEMW tvItem; memset( &tvItem, 0, sizeof(TVITEMW) ); tvItem.mask = TVIF_HANDLE | TVIF_IMAGE ; tvItem.iImage = item->getImageIndex(); tvItem.mask |= TVIF_STATE; if ( item->getTextBold() ) { tvItem.state |= TVIS_BOLD; } tvItem.stateMask |= TVIS_BOLD; if ( item->getStateImageIndex() >= 0 ) { tvItem.mask |= TVIF_STATE; tvItem.state |= INDEXTOSTATEIMAGEMASK( item->getStateImageIndex() ); tvItem.stateMask |= TVIS_STATEIMAGEMASK; } if ( item->getSelectedImageIndex() >= 0 ) { tvItem.mask |= TVIF_SELECTEDIMAGE ; tvItem.iSelectedImage = item->getSelectedImageIndex(); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?