创建客户区窗口,列表框之间项的拖拽操作
2006-07-23 11:19:54 来源:WEB开发网核心提示: void CDragDropText::OnDrawData(CDC& dc, CRect& rc){dc.DrawText(m_text, &rc, DT_LEFT|DT_END_ELLIPSIS);}如果你想得到这个文本,你唯一需要调用的函数是 OnGetData,创建客户区窗口,列表
void CDragDropText::OnDrawData(CDC& dc, CRect& rc)
{
dc.DrawText(m_text, &rc, DT_LEFT|DT_END_ELLIPSIS);
}
如果你想得到这个文本,你唯一需要调用的函数是 OnGetData,拖拽管理器需要时在其内部调用 OnGetDragSize 和 OnDrawData。
那么所有这些工作是如何实现的呢?当 DDTest 收到 WM_DD_DRAGENTER 消息,它调用一个内部函数 GetLBItemUnderPt 来确定光标下是哪个列表框(如果有的话)。然后 DDTest 以这一项的文本作为数据创建一个 CDragDropText 对象并将 DRAGDROPINFO 中的 data 指针指向该对象:
// in CMyDlg::OnDragEnter
DRAGDROPINFO& ddi = *(DRAGDROPINFO*)lp;
int item = GetLBItemUnderPt(...);
if (item>=0) {
CString text = // get item text
ddi.data = new CDragDropText(text);
return TRUE; // allow drag-drop
}
return FALSE; // nothing to drag
由 CDragDropMgr 来做剩余的工作。当用户拖拽它时在周边绘制文本并根据光标是否出于拖拽目的地上方而相应地改变鼠标光标。
当用户松开鼠标,CDragDropMgr 便给应用程序发送一个 WM_DD_DRAGDROP 消息。暗示数据已经拖拽完成。对于 DDTest 而言,这意味着如果鼠标出于编辑框上方,则要设置编辑框中的文本,或者如果鼠标是在列表框上方,则要将文本添加到列表框中。在真正实现中,DDTest 稍显复杂,因为它可以让用户重新安排第二个列表框中的项目。DDTest 有代码可以察觉是否需要添加文本或修改列表框中文本的位置。具体细节就留给你来做了,OnDragDrop 实现的基本要点都是一样的:
- ››创建SQL2005自动备份,定期删除的维护计划
- ››创建动态表单 javascript
- ››客户端:Lync 2011 for Mac体验
- ››创建基于PPTP的站点到站点VPN连接:ISA2006系列之...
- ››创建基于L2TP的站点到站点的VPN连接:ISA2006系列...
- ››创建一个Twisted Reactor TCP服务器
- ››创建Windows Mobile上兼容性好的UI 程序
- ››创建android的Service
- ››创建远古部落环境与原住民角色
- ››创建并扩展Apache Wicket Web应用
- ››创建不在任务条中显示窗口按钮的应用
- ››客户为何忌讳外贸网络推广、营销公司等这些词汇
更多精彩
赞助商链接