如何拖动TreeView节点
如何拖动TreeView的节点 问题点数:80、回复次数:5Top
1 楼ccrun(老妖)(www.ccrun.com)回复于 2006-03-04 16:38:08 得分 80
TTreeView的节点拖动例子
void __fastcall TMainForm::TreeView1DragOver(TObject *Sender,
TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
// 发生在节点被拖动或别的拖动行为发生在TreeView1上的时候
TTreeView *pTreeView = dynamic_cast(Source);
TScrollInfo Info;
if(pTreeView == TreeView1)
{
// 哈哈,是节点被拖动的情况
GetScrollInfo(pTreeView->Handle, SB_VERT, &Info);
if(Info.nMin == Info.nMax )
return;
int NbPixels = abs(pTreeView->Font->Height);
// 根据情况滚动TreeView
if(Y < NbPixels)
{
pTreeView->Perform(WM_VSCROLL, SB_LINEUP, 0);
pTreeView->Refresh();
}
if(Y > pTreeView->Height - NbPixels - 16)
{
pTreeView->Perform(WM_VSCROLL, SB_LINEDOWN, 0);
pTreeView->Refresh();
}
}
else
Accept = false;
}
//------------------------------------
void __fastcall TMainForm::TreeView1DragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
// 发生在拖动完成的情况
TTreeView *pTreeView = dynamic_cast(Source);
TScrollInfo Info;
if(pTreeView == TreeView1)
{
// 哈哈,Item拖动完成了
TTreeNode *pSrcNode;
TTreeNode *pDstNode;
int nID;
pSrcNode = pTreeView->Selected; // 获得被拖动的Item
pDstNode = pTreeView->GetNodeAt(X, Y); // 获得当前鼠标坐标处的Item
if(pDstNode != pSrcNode) // Item被拖动到了别的Item处。
{
if(pDstNode == NULL)
{
// 鼠标当前位置没有Item,所以该Item应该是被拖动到了最上一层,节点成为根节点
pSrcNode->MoveTo(pTreeView->Items->GetFirstNode(), naAdd);
}
else
{
// 节点别拖动到了别的节点处,将要成为该节点的子节点。
pSrcNode->MoveTo(pDstNode, naAddChild);
}
}
if(pDstNode == NULL)
nID = 0;
else
nID = (int)pDstNode->ItemId;
// 让系统重新排序所有的Item。
SendMessage(pTreeView->Handle, TVM_SORTCHILDREN, 0, nID);
}
}
Top
2 楼ccrun(老妖)(www.ccrun.com)回复于 2006-03-04 16:38:44 得分 0
用FireFox回复真的是非常失败。代码缩进全没了,郁闷。Top
3 楼gyj_china(透明)回复于 2006-03-05 02:01:41 得分 0
老妖,我试了你的代码,发现不行呢?编译通不过,改了一句代码后发现没有拖动效果
TTreeView *pTreeView = dynamic_cast<TTreeView *>(Source);
是不是哪里还有什么要改罗?请大家多帮一下忙.Top
4 楼ccrun(老妖)(www.ccrun.com)回复于 2006-03-05 14:55:45 得分 0
还需要改一下TreeView的DragMode:
TreeView1->DragMode = dmAutomatic;Top
5 楼gyj_china(透明)回复于 2006-03-05 16:01:37 得分 0
老妖真是强.佩服,问题解决了,谢谢Top




