每当用户开始拖动项目时,树视图控件将父窗口发送TVN_BEGINDRAG(或TVN_BEGINRDRAG)通知消息。父窗口以WM_NOTIFY消息的形式接收通知,其【lParam的】参数是NM_TREEVIEW结构的地址。该结构的成员包括鼠标光标的屏幕坐标和包含有关待拖动项目的信息的TV_ITEM结构。
以下示例显示如何处理WM_NOTIFY消息以获取TVN_BEGINDRAG。
case WM_NOTIFY:
switch(((LPNMHDR)lParam) - > code){
case TVN_BEGINDRAG:
Main_OnBeginDrag(hwndTV, //应用程序定义的函数
(NM_TREEVIEW *) lParam);
break;
.
. //处理其他通知。
.
}
break;
开始拖动操作涉及使用ImageList_BeginDrag功能。该函数的参数包括包含要在拖动操作期间使用的图像和图像索引的图像列表的句柄。您可以提供自己的图像列表和图像,也可以使用TVM_CREATEDRAGIMAGE消息为树形图控件创建它们。
因为在拖动操作期间拖动图像替换鼠标光标,ImageList_BeginDrag需要您指定图像中的热点。热点的坐标相对于图像的左上角。ImageList_BeginDrag还要求您指定拖动图像的初始位置。应用程序通常设置初始位置,以便在用户开始拖动操作时拖动图像的热点对应于鼠标光标的热点。
以下功能演示如何开始拖动树视图项目。它使用树视图控件提供的拖动图像,并获取项目的边界矩形,以确定热点的适当点。(边界矩形的尺寸与图像的尺寸相同)。请注意,边界矩形不考虑子项的缩进。因此,该函数会为热点的x坐标添加缩进量。
该函数捕获鼠标输入,导致鼠标消息发送到父窗口。父窗口需要后续的WM_MOUSEMOVE消息来确定拖动图像和WM_LBUTTONUP消息的位置,以确定何时结束拖动操作。
// Main_OnBeginDrag - 开始在树视图控件中拖动一个项目。
// hwndTV - 图片列表的句柄
// lpnmtv - 有关要拖动的项目的信息的地址
void Main_OnBeginDrag(HWND hwndTV,NM_TREEVIEW * lpnmtv)
{
HIMAGELIST himl; //图片列表处理
RECT rcItem; //项的边界矩形
DWORD dwLevel; 项目的标题级别
DWORD dwIndent; //量化子项目缩进
//告诉树视图控件创建要使用的图像
//用于拖动。
himl = TreeView_CreateDragImage(hwndTV, lpnmtv->itemNew.hItem);
//获取要拖动的项目的边框矩形。
TreeView_GetItemRect(hwndTV,lpnmtv- > itemNew.hItem,& rcItem,TRUE);
//获取标题级别和子项目的数量
//缩进
dwLevel = lpnmtv->itemNew.lParam;
dwIndent = (DWORD) SendMessage(hwndTV, TVM_GETINDENT, 0, 0);
//开始拖动操作。
ImageList_BeginDrag(himl, 0, 0, 0);
//隐藏鼠标光标,并直接将鼠标输入到
//父窗口
ShowCursor(FALSE);
SetCapture(GetParent(hwndTV));
g_fDragging = TRUE;
return;
}