QQ登录

只需一步,快速开始

上位机MFC实现编辑框之间内容的拖拽

[ 复制链接 ]

效果展示

上位机MFC实现编辑框之间内容的拖拽

上位机MFC实现编辑框之间内容的拖拽

我们知道,缺省的编辑框仅支持剪接板的剪切、拷贝、粘贴操作,不支持拖放操作,
当前这个例程扩展了CEdit类为CDragEdit类,并再实现了CDEDropTarget和CDEDataSource,
实现编辑之间拖放文本的操作,参见上图。
可以直接复制下面代码使用,或下载工程源代码学习:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CEditEx.rar 
文件大小:40.26 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



实现过程
1.新建一基于对话框的应用程序,如上图添加编辑框控件与排版。
2.将例程根目录内两文件CDRAGEDIT.CPP,CDRAGEDIT.H复制到自己工程根目录,
并加载导入到自己工程,两文件源代码也可以在帖子底部复制使用。
这样自己的工程就多出了三个类CDragEdit,CDEDropTarget,CDEDataSource,如图:

上位机MFC实现编辑框之间内容的拖拽

上位机MFC实现编辑框之间内容的拖拽

3.然后就是这集成类的使用。
在对话框头文件包含类头文件#include "CDragEdit.h",
添加类的编译框对象
        CDragEdit        m_edit2;
        CDragEdit        m_edit1;

        DDX_Control(pDX, IDC_EDIT2, m_edit2);
        DDX_Control(pDX, IDC_EDIT1, m_edit1);

并初始化两个编辑框对象
        m_edit1.Init();
    m_edit2.Init();
m_edit1.SetFocus();

4.这样编译执行例程,在两个编辑框内输入的内容就可以想到拖拽了。
下面是上面提到的两文件的源代码,可以复制使用
  1. #if !defined(AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_)
  2. #define AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_

  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. // CDragEdit.h : header file
  7. //

  8. /////////////////////////////////////////////////////////////////////////////
  9. // CDragEdit window
  10. #include <afxole.h>

  11. class CDragEdit;

  12. class CDEDropTarget : public COleDropTarget
  13. {
  14. public:
  15.     CDEDropTarget()
  16.         {
  17.         ms_bBeginDrop=FALSE;
  18.         ms_pEditCtl=NULL;
  19.         }
  20.     BOOL        Register(CDragEdit* pEdit);
  21.     BOOL        OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
  22.     DROPEFFECT  OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  23.     void        OnDragLeave(CWnd* pWnd);
  24.     DROPEFFECT  OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  25.     DROPEFFECT  OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point);

  26. private:
  27.     BOOL        ms_bBeginDrop;
  28.     CDragEdit*  ms_pEditCtl;
  29. };

  30. class CDEDataSource : public COleDataSource
  31. {
  32. };

  33. #define CDragEditBase   CEdit

  34. class CDragEdit : public CDragEditBase
  35. {
  36. // Construction
  37. public:
  38.         CDragEdit();

  39. // Attributes
  40. public:
  41.     enum {  DE_ENABLE_DRAG=1,
  42.             DE_ENABLE_DROP=2
  43.     };

  44. private:
  45.     static  BOOL    ms_bOleInit;

  46.     BOOL            ms_bDragInit;

  47.     int             ms_nEnableFlags;

  48.     BOOL            ms_bInDragging;

  49.     BOOL            ms_bDropEqualDrag;
  50.     int             ms_nDropPtLine;
  51.     int             ms_nDropPtPos;

  52.         CDEDropTarget        ms_dropTarget;
  53.         CDEDataSource        ms_dropSource;

  54. // Operations
  55. public:
  56.     BOOL    Init(int nFlags=(DE_ENABLE_DRAG|DE_ENABLE_DROP));

  57.     BOOL    IsInDragging()                  {return ms_bInDragging;}
  58.     void    SetDropEqualDrag(BOOL bEqual)   {ms_bDropEqualDrag=bEqual;}
  59.     void    SetDropPos(int nLine, int nPos) {ms_nDropPtLine=nLine,
  60.                                              ms_nDropPtPos=nPos;}

  61.     BOOL    GetCurRange(int& nLine1, int& nPos1, int& nLine2, int& nPos2);
  62.     BOOL    GetLinePosByCursor(int& nLine, int& nPos);

  63.     BOOL    SetCaretByCursor();
  64.     BOOL    SetCaret(int nLine, int nPos);

  65.     BOOL    DrawCaretByCursor();

  66.     CPoint  GetPosFromLinePos(int nLine, int nPos)  
  67.                 {return PosFromChar(_LinePosToChar(nLine,nPos));}
  68.     //we reimpelmented this function for fixing SDK's bug
  69.     CPoint  PosFromChar(UINT uChar);

  70.     BOOL    IsInSelRange();

  71.     BOOL    EnableDrag()   
  72.                 {return (ms_nEnableFlags & DE_ENABLE_DRAG) ? TRUE : FALSE;}
  73.     BOOL    EnableDrop()   
  74.                 {return (ms_nEnableFlags & DE_ENABLE_DROP) ? TRUE : FALSE;}
  75.    

  76. private:
  77.     BOOL    _GetSelText(CString& str);
  78.     void    _CharToLinePos(int nChar, int* pnLine, int* pnPos)
  79.                 {
  80.                 if (nChar<0) nChar=0;
  81.                 *pnLine=LineFromChar(nChar);
  82.                 *pnPos=nChar-LineIndex(*pnLine);
  83.                 }
  84.     int     _LinePosToChar(int nLine, int nPos) {return LineIndex(nLine)+nPos;}
  85. // Overrides
  86.         // ClassWizard generated virtual function overrides
  87.         //{{AFX_VIRTUAL(CDragEdit)
  88.         //}}AFX_VIRTUAL

  89. // Implementation
  90. public:
  91.         virtual ~CDragEdit();

  92.         // Generated message map functions
  93. protected:
  94.         //{{AFX_MSG(CDragEdit)
  95.         afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  96.         afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  97.         //}}AFX_MSG

  98.         DECLARE_MESSAGE_MAP()
  99. };

  100. /////////////////////////////////////////////////////////////////////////////

  101. //{{AFX_INSERT_LOCATION}}
  102. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  103. #endif // !defined(AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_)
复制代码

  1. #if !defined(AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_)
  2. #define AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_

  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. // CDragEdit.h : header file
  7. //

  8. /////////////////////////////////////////////////////////////////////////////
  9. // CDragEdit window
  10. #include <afxole.h>

  11. class CDragEdit;

  12. class CDEDropTarget : public COleDropTarget
  13. {
  14. public:
  15.     CDEDropTarget()
  16.         {
  17.         ms_bBeginDrop=FALSE;
  18.         ms_pEditCtl=NULL;
  19.         }
  20.     BOOL        Register(CDragEdit* pEdit);
  21.     BOOL        OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
  22.     DROPEFFECT  OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  23.     void        OnDragLeave(CWnd* pWnd);
  24.     DROPEFFECT  OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  25.     DROPEFFECT  OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point);

  26. private:
  27.     BOOL        ms_bBeginDrop;
  28.     CDragEdit*  ms_pEditCtl;
  29. };

  30. class CDEDataSource : public COleDataSource
  31. {
  32. };

  33. #define CDragEditBase   CEdit

  34. class CDragEdit : public CDragEditBase
  35. {
  36. // Construction
  37. public:
  38.         CDragEdit();

  39. // Attributes
  40. public:
  41.     enum {  DE_ENABLE_DRAG=1,
  42.             DE_ENABLE_DROP=2
  43.     };

  44. private:
  45.     static  BOOL    ms_bOleInit;

  46.     BOOL            ms_bDragInit;

  47.     int             ms_nEnableFlags;

  48.     BOOL            ms_bInDragging;

  49.     BOOL            ms_bDropEqualDrag;
  50.     int             ms_nDropPtLine;
  51.     int             ms_nDropPtPos;

  52.         CDEDropTarget        ms_dropTarget;
  53.         CDEDataSource        ms_dropSource;

  54. // Operations
  55. public:
  56.     BOOL    Init(int nFlags=(DE_ENABLE_DRAG|DE_ENABLE_DROP));

  57.     BOOL    IsInDragging()                  {return ms_bInDragging;}
  58.     void    SetDropEqualDrag(BOOL bEqual)   {ms_bDropEqualDrag=bEqual;}
  59.     void    SetDropPos(int nLine, int nPos) {ms_nDropPtLine=nLine,
  60.                                              ms_nDropPtPos=nPos;}

  61.     BOOL    GetCurRange(int& nLine1, int& nPos1, int& nLine2, int& nPos2);
  62.     BOOL    GetLinePosByCursor(int& nLine, int& nPos);

  63.     BOOL    SetCaretByCursor();
  64.     BOOL    SetCaret(int nLine, int nPos);

  65.     BOOL    DrawCaretByCursor();

  66.     CPoint  GetPosFromLinePos(int nLine, int nPos)  
  67.                 {return PosFromChar(_LinePosToChar(nLine,nPos));}
  68.     //we reimpelmented this function for fixing SDK's bug
  69.     CPoint  PosFromChar(UINT uChar);

  70.     BOOL    IsInSelRange();

  71.     BOOL    EnableDrag()   
  72.                 {return (ms_nEnableFlags & DE_ENABLE_DRAG) ? TRUE : FALSE;}
  73.     BOOL    EnableDrop()   
  74.                 {return (ms_nEnableFlags & DE_ENABLE_DROP) ? TRUE : FALSE;}
  75.    

  76. private:
  77.     BOOL    _GetSelText(CString& str);
  78.     void    _CharToLinePos(int nChar, int* pnLine, int* pnPos)
  79.                 {
  80.                 if (nChar<0) nChar=0;
  81.                 *pnLine=LineFromChar(nChar);
  82.                 *pnPos=nChar-LineIndex(*pnLine);
  83.                 }
  84.     int     _LinePosToChar(int nLine, int nPos) {return LineIndex(nLine)+nPos;}
  85. // Overrides
  86.         // ClassWizard generated virtual function overrides
  87.         //{{AFX_VIRTUAL(CDragEdit)
  88.         //}}AFX_VIRTUAL

  89. // Implementation
  90. public:
  91.         virtual ~CDragEdit();

  92.         // Generated message map functions
  93. protected:
  94.         //{{AFX_MSG(CDragEdit)
  95.         afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  96.         afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  97.         //}}AFX_MSG

  98.         DECLARE_MESSAGE_MAP()
  99. };

  100. /////////////////////////////////////////////////////////////////////////////

  101. //{{AFX_INSERT_LOCATION}}
  102. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  103. #endif // !defined(AFX_CDRAGEDIT_H__871E3CD6_6359_11D1_8251_444553540000__INCLUDED_)
复制代码




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索