QQ登录

只需一步,快速开始

控件间文本拖拽功能--上位机VC

[ 复制链接 ]

控件间文本拖拽功能--上位机VC

控件间文本拖拽功能--上位机VC

控件间文本拖拽功能--上位机VC
功能展示
控件之间文本的拖拽可以很方便在一些时候,进行参数选项的设置,当前例程实现按钮Cbutton列表框CListBox,复选框CCheckBox,组合框CComboBox之间的文本拖拽功能,效果如图,拖拽按钮到列表控件,可将按钮文本复制到列表控件中,其他控件也一样可实现这一效果,还可将控件文本拖拽到其他程序中显示
要点提示
例程主要通过从微软类IDropTarget派生一自定义类实现interface ECOleMemDropTarget : public IDropTarget;
集成类中有四个虚函数供我们实现完成拖拽功能GotDrop() GotDrag() GotLeave() GotEnter()

所以这个类的使用会销麻烦些, GotDrop()用于实现拖拽放开后,控件文本的处理;GotDrag()用于拖拽过程信息的回馈
实现功能
1.新建基于对话框的应用程序
2.将集成类ECOleMemDropTarget对应两文件ECOleMemDropTarget.h, ECOleMemDropTarget.cpp复制到自己工程根目录并加载到工程,再派生一新类class ECMaterialDropText : publicECOleMemDropTarget用于实现前面四个虚函数;记得头文件中包含#include "ECOleMemDropTarget.h“
3.实现想要有拖拽功能控件,当前例程实现3种控件的拖拽,按钮控件的拖拽实现:
从Cbutton派生新类class CButtonDragDrop : public Cbutton,包含头文件#include “ECMaterialDropText.h”,添加自定义变量及函数private: ECMaterialDropText   *m_TargetDrop;  CPoint  m_StartPoint; UINT  m_TimerID; void  InitDrag();及运行时识别宏DECLARE_DYNAMIC(CButtonDragDrop)声明

4.添加虚函数PreSubclassWindow()调用InitDrag();构造函数中初始化变量,析构函数中释放变量
  1. void CButtonDragDrop::PreSubclassWindow()
  2. {
  3.         InitDrag();
  4.         CButton::PreSubclassWindow();
  5. }
  6. CButtonDragDrop::CButtonDragDrop()
  7. {
  8.         m_TargetDrop =NULL;
  9.         m_TimerID    =0;
  10.         m_StartPoint = CPoint(-1, -1);
  11.         m_TargetDrop = new ECMaterialDropText();
  12. }
  13. CButtonDragDrop::~CButtonDragDrop()
  14. {
  15.         if(m_TargetDrop)
  16.         {        
  17.                 m_TargetDrop->Revoke();//        stop drag and drop
  18.                 delete m_TargetDrop;
  19.         }
  20.         m_TargetDrop = NULL;
  21. }
复制代码
5.添加运行时识别宏实现IMPLEMENT_DYNAMIC(CButtonDragDrop,CButton),再分别添加鼠标点击,放开,移动,定时器处理函数
  1. void CButtonDragDrop::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.         m_StartPoint =         point;
  4.         m_TimerID    = SetTimer(1, 100, NULL);
  5.         CButton::OnLButtonDown(nFlags, point);
  6. }

  7. void CButtonDragDrop::OnLButtonUp(UINT nFlags, CPoint point)
  8. {
  9.         m_StartPoint.x = -100;
  10.         m_StartPoint.y = -100;
  11.         if(m_TimerID)
  12.         {
  13.                 KillTimer(m_TimerID);
  14.                 m_TimerID = 0;
  15.         }
  16.         CButton::OnLButtonUp(nFlags, point);
  17. }

  18. void CButtonDragDrop::OnMouseMove(UINT nFlags, CPoint point)
  19. {
  20.         if(m_TimerID > 0)
  21.         {
  22.                 if(00==(GetKeyState(VK_LBUTTON)&0XFF00) )
  23.                 {
  24.                         OnLButtonUp(0,CPoint(0,0));
  25.                         return;
  26.                 }
  27.                 int iX = m_StartPoint.x - point.x;
  28.                 int iY = m_StartPoint.y - point.y;
  29.                 if((iX*iX + iY*iY) > 100)//        check if we really moved enough
  30.                 {
  31.                         COleDataSource*        pSource = new COleDataSource();
  32.                         if(pSource)
  33.                         {
复制代码
  1. CSharedFile        sf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
  2.                                 CString iText;
  3.                                 GetWindowText(iText);        
  4.                                 sf.Write(iText, iText.GetLength());//        write name to clipboard
  5.                                 HGLOBAL hMem = sf.Detach();
  6.                                 if (!hMem)   return;
  7.                                 pSource->CacheGlobalData(CF_TEXT, hMem);               
  8.                                 pSource->DoDragDrop();//        Do drag and drop!                        
  9.                                 delete pSource;
  10.                         }
  11.                 }
  12.         }
  13.         CButton::OnMouseMove(nFlags, point);
  14. }

  15. void CButtonDragDrop::OnTimer(UINT nIDEvent)
  16. {        
  17.         if(nIDEvent == 1)//        check if mouse is still in rect
  18.         {
  19.                 POINT pt;
  20.                 ::GetCursorPos(&pt);
  21.                 CRect iRect;
  22.                 GetWindowRect(iRect);
  23.                 if(!(iRect.PtInRect(pt)))
  24.                 {
  25.                         KillTimer(nIDEvent);
  26.                         m_TimerID = 0;
  27.                 }
  28.         }
  29.         CButton::OnTimer(nIDEvent);
  30. }
复制代码
6.一样的方法实现其他想要有拖拽功能的控件,当前例程还实现有class CComboxDragDrop, CListBoxDragDrop,一样的实现过程,下面就是类ECMaterialDropText的四个虚函数的实现。

在类的源文件顶部包含头文件#include “gkbc8Dlg.h”#include “ButtonDragDrop.h”#include“ListBoxDragDrop.h”#include “ComboxDragDrop.h“ 分别实现四个函数体部分
  1. DWORD ECMaterialDropText::GotDrag(void)
  2. {
  3.         if(m_DropTargetWnd)
  4.         {
  5.                 CPoint iPoint      = m_DropPoint;
  6.                 CWnd *iPossibleWnd = CWnd::WindowFromPoint(iPoint);
  7.                 if(NULL == iPossibleWnd)
  8.                         return DROPEFFECT_NONE;         

  9.                 if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CButtonDragDrop)))
  10.                 {
  11.                         if(AfxGetMainWnd())
  12.                         {
  13.                                 CString iRSString("Dropping on button");
  14.                                 ((CGkbc8Dlg *)AfxGetMainWnd())->UpdateNotation(iRSString);
  15.                         }
  16.                         return DROPEFFECT_COPY;   
  17.                 }
  18.                 else if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CListBoxDragDrop)))
  19.                 {
  20.                         if(AfxGetMainWnd())
  21.                         {
  22.                                 CString iRSString("Dropping on ListBox");
  23.                                 ((CGkbc8Dlg *)AfxGetMainWnd())->UpdateNotation(iRSString);
  24.                         }
  25.                         return DROPEFFECT_LINK;                //        something else again
  26.                 }
  27.                 else if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CComboxDragDrop)))
  28.                 {
  29.                         if(AfxGetMainWnd())
  30.                         {
  31.                                 CString iRSString("Dropping on Combox");
  32.                                 ((CGkbc8Dlg *)AfxGetMainWnd())->UpdateNotation(iRSString);
  33.                         }
  34.                         return DROPEFFECT_LINK;        
  35.                 }
  36.         }
  37.         return DROPEFFECT_NONE;   
  38. }
复制代码
  1. void ECMaterialDropText::GotDrop(void)
  2. {
  3.         if(m_Data)
  4.         {        
  5.                 char *iText = (char *)m_Data;//        get the text
  6.                 if((iText) && (m_DropTargetWnd))
  7.                 {
  8.                         TRACE("Found text %s.\n", iText);
  9.                         CPoint iPoint = m_DropPoint;
  10.                         //        lets check if this one wants use
  11.                         CWnd *iPossibleWnd = CWnd::WindowFromPoint(iPoint);
  12.                         if(NULL == iPossibleWnd)
  13.                                 return;        
  14.                         //        check if this is one of us...
  15.                         if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CButtonDragDrop)))
  16.                         {
  17.                                 ((CButtonDragDrop *)iPossibleWnd)->SetWindowText(iText);
  18.                         }
  19.                         else if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CListBoxDragDrop)))
  20.                         {
  21.                                 ((CListBoxDragDrop *)iPossibleWnd)->AddString(iText);
  22.                         }
  23.                         else if(iPossibleWnd->IsKindOf(RUNTIME_CLASS(CComboxDragDrop)))
  24.                         {
  25.                                 ((CComboxDragDrop *)iPossibleWnd)->AddString(iText);
  26.                                 ((CComboxDragDrop *)iPossibleWnd)->SetCurSel(0);
  27.                         }
  28.                 }
  29.         }
  30. }
  31. void ECMaterialDropText::GotLeave(void)
  32. {
  33. }
  34. DWORD ECMaterialDropText::GotEnter(void)
  35. {
  36.         return DROPEFFECT_LINK;   
  37. }
复制代码
7.在主对话框中分别添加按钮,组合框,复选框,列表框分别关联前面创建的控件类,再添加一静态控件ID改为IDC_NOTATION用于显示拖拽过程的信息,添加函数UpdateNotation()实现信息显示



我们来演示功能实现过程

请点击此处下载

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

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

文件名称:控件间文本拖拽功能--上位机VC.rar 
文件大小:215.17 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  


回复

使用道具 举报

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