zoukankan      html  css  js  c++  java
  • MFC中的拖曳

    刚刚完成了树控件中树节点的拖曳功能,将一些东西记录下来。

     
    先得说一下,这次实现这个功能,基本上没有通过google,完全是通过看MSDN学到的。
    时间上来看,反而比google后实现出来要快不少,因为google出来的代码是别人消化完的,都是一些纯代码,而一些心得性的文章反而比msdn写得还复杂。。。
     
    这次查找资料的顺序是:
          MSDN -> CTreeCtrl -> Using CtreeCtrl -> Tree Control Drag-and-Drop Operations
    然后就找到了想要的东西,而且那篇文章很短,很实用:)
    过程中还顺便学了下Notify消息的一些相关知识,相当不错。(原来WM_COMMAND也是一种NOTIFY消息,而且是最简单的消息,因为它能带的参数太少了。。。)
     
    言归正传,拖曳是控件的一个通用的功能,要实现拖曳首先需要在父窗口或控件窗口中对 TVN_BEGINDRAG 消息进行处理。
    然后在消息处理函数中添加上拖曳的启动代码:
    COleDataSource* pOleSourceObj = new COleDataSource;
    DROPEFFECT dropeffect = pOleSourceObj->DoDragDrop();
    delete pOleSourceObj;
     
    在调用DoDragDrop函数后,就会进入拖曳过程中,这时需要一个处理对象来处理拖曳的消息,这里我们在窗口中添加一个成员对象 COleDropTarget,并在窗口的Create函数中进行注册:
    m_dragTarget.register(this);
     
    这时所有的拖曳消息就都会由m_dragTarget对象进行处理。
     
    我们可以对 COleDropTarget 进行派生,来处理各个拖曳操作。
    COleDropTarget 主要以下几个虚函数:
    • virtual DROPEFFECT OnDragEnter(CWnd * pWndCOleDataObject * pDataObjectDWORD dwKeyStateCPoint point );
         在拖曳刚开始的时候调用,主要用于定制拖曳支持哪些功能,支持的有:
         #define     DROPEFFECT_NONE    ( 0 ) // 啥也不支持
         #define     DROPEFFECT_COPY    ( 1 ) // 拷贝
         #define     DROPEFFECT_MOVE    ( 2 ) // 移动
         #define     DROPEFFECT_LINK    ( 4 ) // 链接
         #define     DROPEFFECT_SCROLL  ( 0x80000000 ) // 滚动
    • virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObjectDWORD dwKeyStateCPoint point );

         当在窗口中拖曳时,就会调用这个函数。就是鼠标划过窗口的意思。

         这个函数可用于拖曳过程中鼠标的样式,还有鼠标到窗口边缘时窗口的滚动操作等。

    • virtual void OnDragLeave(CWnd * pWnd );

         当拖曳到窗口外面的时候,会调用此函数。

    • virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObjectDROPEFFECT dropEffectCPoint point );

         松开鼠标左键,完成拖曳操作时会调用此函数。

  • 相关阅读:
    感觉跟奇怪
    人多
    淡忘
    可疑
    js判断对象是否为空对象的几种方法
    互联网隐私泄漏
    清明时节
    垃圾mac
    【ES6】---JavaScript(二)
    【微信小程序】---Socket聊天功能实现
  • 原文地址:https://www.cnblogs.com/chaoswong/p/3092912.html
Copyright © 2011-2022 走看看