控件“树”中多选拖放功能的实现
2007-03-30 21:32:29 来源:WEB开发网void CBitmapTree::SetDraggable(int base)
{
ASSERT(base < (sizeof(m_draggable)*8 -1));
m_draggable|= (1UL << base);
}
熟悉类CBitmapTree的读者可能注意到了该函数与SetExpandable()函数极其相似。变量base指明了所选的图象在"树"控件TVISL_NORMAL图象列表中的索引号。该索引号将转换成一个单位值,并且存储在成员变量m_draggable中。m_draggable成员变量类型为长整型,占4个字节32位,所以变量base指定的是位于图象列表中前32个图象中的某一个图象。而成员函数IsDraggable()可以用来查询变量m_draggable的值。成员函数IsDraggable()和IsDropTarget()都定义为虚函数,所以在需要对可拖动特性和可释放特性进行更为复杂的判断时,用户可以在类CBitmapTree的派生类中超越(overriding)该函数。网址www.pinpub.com/vcd下Subscriber Downloads部分中所包含的程序示例中,所有的文档节点都是可拖动的,所有的文件夹节点都可以作为拖动后释放的目标位置项。
准备拖动(Getting ready to drag)当成功地执行完一次拖放操作后,函数SetDrag()就会建立一个回调函数来处理树项的移动或复制。笔者曾经在前面的文章里提供了一个比较简单的回调函数MoveTreeItemCB(),它可以完成树项在"树"控件中从一个位置移动到另一个位置。注意:这个函数本身的局限性很强,如果想完成某些该函数不具备的其它方面的功能时,就需要用户根据实际需要编写自己的回调函数。(例如,当使用宏LPSTR_TEXTCALLBACK来替代表示树项的文本时,函数MoveTreeItemCB()就不能正常运行。)
另外,在拖动树项时,可以提供给函数SetDrag()一个位图的资源标识符(并不是必需的)。该位图可以作为一种提示图标,它应该具有如图1所示的格式。当拖动超出了有效范围的边界时,则显示第一个图象;当拖动项只有一项时,则显示第二个图象;当拖动项包含多项时,则显示第三个图象。如果在程序中并没有提供图象给函数SetDrag(),那么将显示一个缺省的拖动图象,即当前所选项的灰色显示。
更多精彩
赞助商链接