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 + -
显示快捷键?