WEB开发网
开发学院软件开发VC 创建客户区窗口,列表框之间项的拖拽操作 阅读

创建客户区窗口,列表框之间项的拖拽操作

 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 实现的基本要点都是一样的:

上一页  1 2 3 4 5 6  下一页

Tags:创建 客户 窗口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接