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

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

 2006-07-23 11:19:54 来源:WEB开发网   
核心提示: 一旦你用窗口表对拖拽管理器进行了初始化,下一步便是改写主窗口的 PreTranslateMessage 函数以便将消息传递给拖拽管理器:BOOL CMyDlg::PreTranslateMessage(MSG* pMsg){ return m_ddm.PreTranslateMessage

一旦你用窗口表对拖拽管理器进行了初始化,下一步便是改写主窗口的 PreTranslateMessage 函数以便将消息传递给拖拽管理器:

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
  return m_ddm.PreTranslateMessage(pMsg) ? TRUE :
   CDialog::PreTranslateMessage(pMsg);
}

一切准备就绪,当用户试图从一个窗口到另一个窗口实施拖拽操作时,拖拽管理器便会察觉到并通知应用程序要做相应的处理。CDragDropMgr 可以发送四个消息/通知:WM_DD_DRAGENTER、WM_DD_DRAGOVER、WM_DD_ DRAGDROP 和 WM_DD_DRAGABORT。收到这些消息/通知后,做什么样的处理由你来决定。WM_DD_DRAGENTER 和 WM_DD_DRAGDROP 是拖拽操作必须要做的处理。其它两个可选。WM_DD_DRAGABORT 用来处理用户取消操作时的清除工作。WM_DD_ DRAGOVER 使你能够在用户实施拖拽操作而移动鼠标时进行连续不断的处理。DDTest 这样简单的程序不需要处理这些消息。

当拖拽管理器发送 WM_DD_DRAGENTER 消息时,它在 LPARAM 中传递一个 DRAGDROPINFO 结构。你的任务是将 DRAGDROPINFO::data 指向一个包含你想要拖拽数据的 CDragDropData 实例,然后返回 TRUE。如果拖拽是不允许的(也许用户单击了列表框中的某个死区(dead area))则应该返回 FALSE,并不要设置 DRAGDROPINFO::data,CDragDropData 类似 COM 的 IDataObject,但要简单得多:它保存拟拽动的数据。CDragDropData 有三个虚拟函数:OnGetDragSize 获得一个拖拽图像的绑定矩形,OnDrawData 绘制拖拽图像,OnGetData 获取数据本身。我在我的库中提供了一个叫 CDragDropText 的类,它实现了这些函数,用来处理文本拖拽操作。它将文本保存在一个 CString 中。OnGetData 返回这个串,OnGetDragSize 计算该文本矩形,OnDrawData 则绘制该文本:

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

Tags:创建 客户 窗口

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