MFC文件拖拽功能实现
vc实现拖放控件
基于对话框的文件拖拽载入2011年4月7日梁昭发表评论阅读评论不知道你是否对QQ文件传输比较好奇?将文件拖入对话窗口,就可以实现文件的传输...其实在MFC中实现起来比较简单,在Windows中已经将消息封装好了。
这一节我们主要来学习一下基于对话框的文件拖拽功能!(1)最容易出错且较易遗忘的一步:选中对话框的属性"Accept files",细心一点容易发现,基本上所有的控件都有这个属性,注意只要将对话框的这个属性设置就行了,其余控件的属性不要进行设置。
否则主窗口的Accept files可能不起作用。
(2)将对话框的WM_DropFiles消息映射添加进来,(3)使用Win32 API可以轻易地在自己的GUI程序中加入拖放支持。
你需要了解这样几个函数DragAcceptFiles函数原型:VOID DragAcceptFiles(HWND hWnd, BOOL fAccept);此函数告诉Windows窗口hWnd是否接受从shell拖放过来的文件,fAccept=TRUE表示接受拖放。
这意味着窗口hWnd必须能够处理WM_DROPFILES消息。
DragFinish函数原型:VOID DragFinish(HDROP hDrop);在Drag-and-Drop过程完成时调用,从而允许shell释放为传递文件名而开辟的内存空间。
hDrop是WM_DROPFILES消息的WParam参数。
DragQueryFile函数原型:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);此函数用来获取拖放的文件名。
hDrop是WM_DROPFILES消息的WParam参数,lpszFile是用于容纳文件名的缓冲区,cch是该缓冲区的大小。
设置iFile=0xFFFFFFFF的话,此函数返回拖放的文件总数,记为count。
CTreeCtrl的拖拽功能
[MFC编程]一个具有拖拽功能的TreeCtrl2011-05-07 22:37:20| 分类:MFC编程|举报|字号订阅#if !defined(AFX_DRAGTREE_H__3015F03F_045E_4531_A436_E2A890F2 3540__INCLUDED_)#defineAFX_DRAGTREE_H__3015F03F_045E_4531_A436_E2A890F23540__INCL UDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// DragTree.h : header file///////////////////////////////////////////////////////////////////////////////// CDragTree windowclass CDragTree : public CTreeCtrl{// Constructionpublic:CDragTree();CImageList* m_pDragImages; //拖动的图像列表BOOL m_bDrag; //是否进行拖动HTREEITEM m_hBeginDrag; //拖动的起点// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CDragTree)//}}AFX_VIRTUAL// Implementationpublic:void CopyNodes(HTREEITEM hDesItem, HTREEITEM hSrcItem);virtual ~CDragTree();// Generated message map functionsprotected://{{AFX_MSG(CDragTree)afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_DRAGTREE_H__3015F03F_045E_4531_A436_E2A890F23 540__INCLUDED_)// DragTree.cpp : implementation file//#include "stdafx.h"#include "DragTreeItem.h"#include "DragTree.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CDragTreeCDragTree::CDragTree(){m_pDragImages = NULL;m_bDrag = FALSE;m_hBeginDrag = NULL;}CDragTree::~CDragTree(){}BEGIN_MESSAGE_MAP(CDragTree, CTreeCtrl)//{{AFX_MSG_MAP(CDragTree)ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CDragTree message handlersvoid CDragTree::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) {NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;HTREEITEM hItem = pNMTreeView->itemNew.hItem; //获取开始拖动的节点 if (hItem==GetRootItem()) //不允许拖动根节点{*pResult = 0;return;}m_hBeginDrag = hItem; //记录开始拖动的项目m_pDragImages = CreateDragImage(hItem); //创建拖动的图像列表CPoint dragPT; //记录起始点dragPT.x = pNMTreeView->ptDrag.x;dragPT.y = pNMTreeView->ptDrag.y;if (m_pDragImages != NULL){m_pDragImages->BeginDrag(0, CPoint(8, 8)); //开始拖动图像ClientToScreen(&dragPT); //转换客户坐标到屏幕坐标m_pDragImages->DragEnter(this, dragPT); //锁定窗口更新,在拖动的过程中显示拖动的图像SetCapture(); //开始鼠标捕捉m_bDrag = TRUE;}*pResult = 0;}void CDragTree::OnMouseMove(UINT nFlags, CPoint point){if (m_bDrag) //处于拖动状态{HTREEITEM hItem;UINT nHitFlags;CRect clientRC;GetClientRect(&clientRC); //获取客户区域m_pDragImages->DragMove(point); //设置拖动的图像位置//鼠标经过时高亮显示if( (hItem = HitTest(point, &nHitFlags)) != NULL ){CImageList::DragShowNolock(FALSE); //隐藏拖动的图像SelectDropTarget(hItem); //设置选中的项目CImageList::DragShowNolock(TRUE); //显示拖动的图像}}elseCTreeCtrl::OnMouseMove(nFlags, point);}void CDragTree::OnLButtonUp(UINT nFlags, CPoint point){if (m_bDrag) //处于拖动状态{m_bDrag = FALSE;CImageList::DragLeave(this); //CImageList::EndDrag(); //结束图像拖动ReleaseCapture(); //释放鼠标捕捉delete m_pDragImages; //释放图像列表m_pDragImages = NULL;CRect winRC;GetWindowRect(&winRC); //获取窗口区域HTREEITEM hItem;if((hItem = HitTest(point, &nFlags)) != NULL){//进行拖动处理//如果目标项目与开始拖动的项目相同或者目标项目仍是开始项目的父节点,不进行处理if (m_hBeginDrag != hItem && hItem != GetParentItem(m_hBeginDrag)){CopyNodes(hItem, m_hBeginDrag); //进行节点的复制DeleteItem(m_hBeginDrag); //删除源节点}Invalidate();SelectDropTarget(NULL);m_hBeginDrag = NULL;}}}//复制节点,将hSrcItem及其子项目复制到下hDesItem节点下void CDragTree::CopyNodes(HTREEITEM hDesItem, HTREEITEM hSrcItem) {if (hDesItem==NULL || hSrcItem==NULL) //验证参数{return;}TVITEM tvItem; //定义项目信息tvItem.mask = TVIF_TEXT|TVIF_IMAGE; //设置返回标记tvItem.hItem = hSrcItem;char chText[MAX_PATH] = {0};tvItem.pszText = chText;hTextMax = MAX_PATH;GetItem(&tvItem); //获取项目信息TVINSERTSTRUCT tvInsert; //定义插入操作的数据结构tvInsert.hParent = hDesItem;tvInsert.item = tvItem;HTREEITEM hInsert = InsertItem(&tvInsert); //插入项目HTREEITEM hChild = GetChildItem(hSrcItem); //获取子节点while (hChild != NULL) //遍历子节点{tvItem.mask = TVIF_TEXT|TVIF_IMAGE;tvItem.hItem = hChild;tvItem.pszText = chText;hTextMax = MAX_PATH;GetItem(&tvItem);tvInsert.hParent = hInsert;tvInsert.item = tvItem;CopyNodes(hInsert, hChild); //递归调用hChild = GetNextSiblingItem(hChild); //查找下一个兄弟节点 }}。
用MFC实现文件拖放到编辑框
用MFC实现文件拖放到编辑框一、用CFormView实现的对话框如图1是用CFormView实现的对话框,这是一个文档-视图结构的应用程序,它有一个主框架。
(一)运行AppWizard产生名为Drag1的项目单击Visual C++File菜单中的New命令,选择Project选项中的MFC AppWizard(exe)图标,键入Drag1作为项目名字。
步骤1中选择Single Document按钮,步骤4中取消工具栏、打印等设置,步骤6中将基类CView改成CFormView,这一步是必须的,否则就做不到支持文件拖放功能。
其余均采用默认设置项。
(二)我们不需要显示菜单,因此,利用菜单编辑器将全部菜单去掉。
(三)利用对话框编辑器来修改IDD_DRAG1_FROM对话框,如图1示样式。
(四)利用ClassWizard为CDrag1View类加入消息控制单击View菜单中的ClassWizard命令,在MFC ClassWizard的Message框中选择OnUpDate,并单击Add Function按钮。
(五)类似第4步,利用ClassWizard为CMainFrame类加入OnDropFile函数。
这一步就使程序具有了文件拖放功能。
(六)编辑工程1、显示文件名void CDrag1View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint){// TODO: Add your specialized code here and/or call the base classCDragDoc *pDoc=GetDocument();SetDlgItemText(IDC_EDIT1,pDoc->GetPathName());}2、实现拖放功能BOOL CDrag1App::InitInstance(){……// Enable drag/drop openm_pMainWnd->DragAcceptFiles();return TRUE;}好了,就这么简单,你几乎没做什么代码输入工作程序就完成了。
MFC一些调用的步骤
MFC一些调用的步骤MFC(Microsoft Foundation Class)是微软提供的用于开发Windows桌面应用程序的一套C++库。
它提供了许多方便的类和函数,使开发者可以更快速地创建Windows应用程序。
在使用MFC进行开发时,一般会按照以下步骤进行调用:1.创建一个MFC应用程序项目在Visual Studio中新建项目,选择MFC应用程序向导,设置项目的名称和位置,然后选择要使用的MFC库版本。
选择完毕后,点击“确定”按钮,系统就会自动生成一个MFC应用程序项目的骨架。
2.修改窗口类MFC应用程序的主窗口类通常继承自CFrameWnd或CMDIFrameWnd。
通过修改窗口类可以自定义应用程序的主窗口的外观和行为。
可以修改类的消息映射,添加自定义的消息处理函数。
3.设计主窗口的布局在上一步中,可以使用Visual Studio提供的设计器来设计主窗口的布局。
在设计器中,可以拖拽各种控件,设置它们的属性,使其显示在主窗口中。
4.响应控件的事件在MFC中,控件(如按钮、菜单等)可以触发事件,例如点击按钮,选择菜单项等。
开发者需要响应这些事件,并编写相应的处理函数。
通过消息映射表,将特定的消息与处理函数关联起来。
5.添加自定义对话框可以使用MFC提供的对话框设计器来创建自定义对话框。
在对话框中,可以添加各种控件,并定义响应事件的处理函数。
在需要显示自定义对话框时,使用对话框类的Create或DoModal方法来创建对话框的实例。
6.进行数据处理在MFC应用程序中,一般需要对数据进行处理。
可以使用MFC提供的数据库类(如CDatabase、CRecordset等)来连接数据库、执行SQL语句、获取查询结果等。
也可以使用MFC提供的文件操作类(如CFile、CFileFind等)进行文件的读写操作。
通过这些类,可以方便地进行数据处理。
7.添加多线程支持MFC提供了一套多线程支持的类和函数,可以帮助开发者实现多线程的应用程序。
mfc文件拖拽
COleDataSource::OnRenderFileData(lpFormatEtc,pFile);
return FALSE;
}
有了以上数据源之后,就可以在消息WM_LBUTTON的响应函数OnLButtonDown()中,按如下方式,指定使用的数据格式:
myDataSource* pItemDragDrop=new myDataSource;
pItemDragDrop->str="This string will dragdrop to another place";
pItemDragDrop->DelayRenderFileData(CF_TEXT,NULL);
下例只允许移动对象,而不允许复制对象:
DROPEFFECT myView::OnDragEnter(......)
{
return DROPEFFECT_MOVE;
}
DROPEFFECT myView::OnDragOver(......)
DROPEFFECT_MOVE---表明可以把对象复制到现在的窗口、现在的位置;
DROPEFFECT_COPY---表明可以把对象从原来的窗口、原来的位置移到现在的窗口、现在的位置;
DROPEFFECT_NONE---表明不能在该窗口的该位置放下。
要实现一次对象拖放,需要做三方面的工作:对象所在的窗口准备拖放对象并启拖动操作,接受对象的窗口响应有关拖放消息并接受落下的对象,以及拖放完成时的后期处理。
1. 拖动操作的启动。拖放操作一般是从单击鼠标左键开始。在消息WM_LBUTTONDOWN的响应函数OnLButtonDown(...)中,首先要判定是否选定了某一对象,如果未选定或选定多个,则不能进行拖放操作;如果选定了一个对象,则可以进行拖放操作。要启动一次拖放操作,需要先准备一个COleDataSource对象。注意到类COleClientIten和类COleServerItem都是从类COleDataSource上派生的,如果选定的是COleClientItem对象或者是COleServerItem对象,则可以直接使用;否则,需要生成一个COleDataSource对象,值得注意的是:需要象上文中所说的,应该指定使用的数据格式,并按指定格式提供对象的有关数据。
c#实现文件拖入和拖出(拖拽)
c#实现⽂件拖⼊和拖出(拖拽)C# WinForm下⼀步⼀步实现⽂件的拖⼊和拖出作者:Eaglet在WinForm实现⼀个类似资源浏览器的功能,需要实现将WinForm中列出的⽂件拖出到其他应⽤程序中或者从其他应⽤程序中将⽂件拖⼊到Winform应⽤中。
⽹上有⼀些⽂章介绍这种功能,但都⽐较零散,缺少⼀个完整的例⼦。
为此我编写了⼀个较完整的实现⽂件拖⼊和拖出的例⼦,并撰写此⽂⼀步步讲解如果实现类似功能。
步骤1 放置⼀个 ListView 到 Winform窗体中并初始化如下属性:listView.View = View.Details;listView.AllowDrop = true; 步骤2 撰写⼀个⽬录⽂件列表显⽰的函数/**//// <summary>/// List files in the folder/// </summary>/// <param name="directory">the directory of the folder</param>private void ListFolder(string directory){labelCurFolder.Text = directory;String[] fileList = System.IO.Directory.GetFiles(directory);listViewFolder.Items.Clear();listViewFolder.Columns.Clear();listViewFolder.Columns.Add("Name", 300);listViewFolder.Columns.Add("Size", 100);listViewFolder.Columns.Add("Time", 200);foreach (string fileName in fileList){//Show file nameListViewItem itemName = new ListViewItem(System.IO.Path.GetFileName(fileName));itemName.Tag = fileName;//Show file iconIconImageProvider iconImageProvider = new IconImageProvider(listViewFolder.SmallImageList,rgeImageList);itemName.ImageIndex = iconImageProvider.GetIconImageIndex(fileName);//Show file sizeSystem.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);long size = fileInfo.Length;String strSize;if (size < 1024){strSize = size.ToString();}else if (size < 1024 * 1024){strSize = String.Format("{0:###.##}KB", (float)size / 1024);}else if (size < 1024 * 1024 * 1024){strSize = String.Format("{0:###.##}MB", (float)size / (1024 * 1024));}else{strSize = String.Format("{0:###.##}GB", (float)size / (1024 * 1024 * 1024));}ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();subItem.Text = strSize;subItem.Tag = size;itemName.SubItems.Add(subItem);//Show file timesubItem = new ListViewItem.ListViewSubItem();DateTime fileTime = System.IO.File.GetLastWriteTime(fileName);subItem.Text = (string)fileTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); ;subItem.Tag = fileTime;itemName.SubItems.Add(subItem);listViewFolder.Items.Add(itemName);}}上⾯代码中有⼀段显⽰图标的代码由于和拖动⽆关,我就不贴出来了,感兴趣可以下载完整的代码去看。
用MFC实现文件拖放(获得文件路径)
DragAcceptFiles();//向file manager注册自己,使自己能接受droped file(s) CRect rect(0,0,100,80); m_View_List.Create(WS_VISIBLE|WS_VSCROLL,rect,this,IDC_VIEW_LIST);//创建listbox
void CMyDragView::OnDropFiles(HDROP hDropInfo) { // TODO: Add your message handler code here and/or call default int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);//取得被拖动文件的数目 for(int i=0;i< DropCount;i++) { //取得第i个拖动文件名所占字节数 int NameSize=DragQueryFile(hDropInfo,i,NULL,0); HANDLE hHeap=GetProcessHeap(); //根据字节数分配缓冲区 //char *pName=new char[++NameSize]; char *pName=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,NameSize++);
1、用MFC Appwizard创建一个基于SDI的新工程,命名为Drag,除第一步选择第一项以外,其余全用默认设置。
2、DragView.h文件
Hale Waihona Puke CListBox m_View_List;
3、DragView.cpp文件
---- 用classwizard添加WM_CREATE消息响应,然后在OnCreate函数中添加如下代码:
基于mfc的实验报告
基于mfc的实验报告摘要本实验旨在通过使用MFC(Microsoft Foundation Classes)开发框架,实现一个简单的图形化界面程序。
通过这次实验,我深入理解了MFC框架的基本原理和开发流程,并成功完成了一个简单的图形化界面程序。
1. 引言MFC是微软公司开发的一套C++类库,用于创建Windows平台上的应用程序。
它建立在Windows API之上,简化了Windows操作系统的编程方式。
MFC 提供了一系列的类和函数,包括窗口(Window)、对话框(Dialog)、消息映射(Message Map)等,极大地简化了Windows应用程序的开发过程。
2. 实验目的本实验主要目的是熟悉MFC框架的基本原理和开发流程,实现一个简单的图形化界面程序。
通过本实验,能够掌握MFC框架中的窗口创建、消息处理、界面设计等基本概念和操作。
3. 实验过程3.1 环境配置首先,需要在计算机上安装Visual Studio和MFC组件。
打开Visual Studio,创建一个新的MFC应用程序项目,并选择对话框类型作为项目的基础结构。
3.2 窗口创建在MFC应用程序中,窗口是最基本的界面单位。
通过菜单选择“添加类”的方式,创建一个新的对话框类,并继承自CDialog类。
在新建的对话框类中,可以定义与界面相关的成员变量和控件。
3.3 控件添加在对话框设计界面中,可以通过拖拽和调整控件的方式,向对话框中添加各种控件,如按钮、文本框、列表框等。
每个控件都有自己的属性和事件响应函数。
3.4 消息映射消息映射是MFC框架的核心概念之一。
通过消息映射,可以将用户的操作(如点击按钮)与特定的函数关联起来。
在对话框类中,可以通过DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP宏定义来实现消息映射关系的建立。
3.5 编译和运行完成界面设计和消息映射后,即可对程序进行编译和运行。
在编译过程中,MFC 会自动将资源文件编译成可执行的文件。
mfc 示列框的事件用法
mfc 示列框的事件用法MFC (Microsoft Foundation Classes) 是 Microsoft 提供的一套 C++ 类库,用于简化 Windows 应用程序的开发。
MFC 提供了一套丰富的类和函数,用于处理 Windows 消息、控件、文档和视图等。
下面是一个简单的 MFC 示例,展示了一个基于对话框的应用程序中如何使用控件事件。
1. 创建一个新的 MFC 对话框应用程序:在 Visual Studio 中,选择 "File" -> "New" -> "Project"。
在模板列表中,选择 "MFC Application"。
输入项目名称和位置,然后点击 "OK"。
2. 添加一个编辑框控件:在对话框编辑器中,从工具箱拖动一个"Edit Box" 控件到对话框上。
3. 处理编辑框的 "Text Changed" 事件:打开对话框类的头文件 (通常是 ``)。
在类声明中添加一个函数声明,例如:`afx_msg void OnEnChangeEdit1();`。
在类声明中添加一个消息映射宏,例如:`BEGIN_MESSAGE_MAP(CYourDialogName, CDialogEx) ...ON_EN_CHANGE(IDC_EDIT1, &CYourDialogName::OnEnChangeEdit1) END_MESSAGE_MAP()`。
4. 实现 "Text Changed" 事件处理函数:打开对话框类的源文件 (通常是 ``)。
在类的实现部分,添加函数的实现,例如:`void CYourDialogName::OnEnChangeEdit1() { ... }`。
在此函数中,你可以添加代码来处理编辑框内容变化时需要执行的操作。
mfc 对象拖拽 编程
mfc 对象拖拽编程摘要:1.MFC 对象拖拽编程概述2.MFC 对象的拖拽实现方法3.拖拽过程中需要注意的问题4.总结与展望正文:MFC(Microsoft Foundation Class)是微软提供的一套C++类库,用于简化Windows 应用程序的开发。
在MFC 中,我们可以通过拖拽操作来移动或复制对象。
本文将详细介绍MFC 对象拖拽编程的相关知识和技巧。
1.MFC 对象拖拽编程概述MFC 对象拖拽编程是指在MFC 框架下,利用拖拽操作实现对窗口中对象(如按钮、文本框等)的移动或复制。
要实现这一功能,我们需要对MFC 的的消息处理机制有一定了解。
在拖拽操作中,最为关键的消息是WM_LBUTTONDOWN、WM_LBUTTONUP 和WM_MOVE。
2.MFC 对象的拖拽实现方法要实现MFC 对象的拖拽操作,我们需要分以下几个步骤进行:(1)重载鼠标按下(WM_LBUTTONDOWN)消息处理函数,在此消息处理函数中,我们需要记录当前鼠标位置和被拖拽对象的当前位置。
(2)重载鼠标抬起(WM_LBUTTONUP)消息处理函数,在此消息处理函数中,我们需要清除拖拽状态,并设置被拖拽对象的新的当前位置。
(3)重载窗口移动(WM_MOVE)消息处理函数,在此消息处理函数中,我们需要根据鼠标位置和被拖拽对象的当前位置计算出新的窗口位置,并更新窗口的客户区域。
(4)处理拖拽过程中的键盘消息,例如当用户按下键盘上的ESC 键时,需要取消拖拽操作。
3.拖拽过程中需要注意的问题在实现拖拽操作的过程中,需要注意以下几个问题:(1)在拖拽过程中,被拖拽对象需要始终保持在鼠标光标的正下方,以实现平滑的拖拽效果。
(2)在拖拽过程中,如果鼠标点击了其他非拖拽对象的区域,需要立即停止拖拽操作。
(3)在拖拽过程中,如果用户按下了键盘上的ESC 键,需要立即取消拖拽操作。
4.总结与展望MFC 对象拖拽编程是MFC 编程中一个常见的功能,通过本文的介绍,相信你已经掌握了实现该功能的方法。
MFC实现对话框编辑控件上拖拽文件
MFC实现对话框编辑控件上拖拽⽂件本⽂实例为⼤家分享了MFC实现对话框编辑控件上拖拽⽂件的具体代码,供⼤家参考,具体内容如下步骤1、重载CEdit类2、添加编辑框控件⾸先,重载CEdit类,定义⼀个派⽣类CDragEdit类,并重载它的WM_CREATE⽅法,在其中添加DragAcceptFile(TRUE); ⽅法。
// CDragEdit.h#pragma onceclass CDragEdit : public CEdit{DECLARE_DYNAMIC(CDragEdit)public:CDragEdit();virtual ~CDragEdit();protected:DECLARE_MESSAGE_MAP()public:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnDropFiles(HDROP hDropInfo);};然后,利⽤类向导为CDragEdit类添加WM_DROPFILE消息相应函数;//CDragEdit.cppint CDragEdit::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CEdit::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专⽤的创建代码DragAcceptFiles(TRUE);return 0;}void CDragEdit::OnDropFiles(HDROP hDropInfo){UINT count;TCHAR filePath[MAX_PATH] = { 0 };count = DragQueryFile(hDropInfo, -1, NULL, 0);if (1 == count){DragQueryFile(hDropInfo, 0, filePath, sizeof(filePath));this->SetWindowTextW(filePath);UpdateData(FALSE);DragFinish(hDropInfo); //拖放成功后,释放内存}else{CString szFilePath;for (UINT i = 0; i < count; i++){int pahtLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));szFilePath = szFilePath + filePath + _T("\r\n");}this->SetWindowTextW(szFilePath);UpdateData(FALSE);DragFinish(hDropInfo);}//MFCDlg.h#program once#include "CDragEdit.h"class CMFDlg : public CDialogEx{……………………public:CDragEdit m_DragEdit;}最后,设置⽂本框控件属性[Accept Files]、[multiline]值为True.以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Window下拖放操作DragDrop全解析(转)
Window下拖放操作DragDrop全解析(转)一、基本概念拖放,是指用鼠标拖动的方法,在不同程序的窗口之间、同一个程序的不同窗口之间或同一程序同一窗口的不同控件之间,进行移动、复制和粘贴等操作的技术。
拖放操作是在操作系统的帮助下完成的。
被拖动的对象首先向操作系统注册它使用的数据格式,并按指定的数据格式提供数据,拖放操作结束时,接收拖放的窗口按指定的数据格式提取有关数据,并根据提取的数据生成相应的对象。
二、两种拖放方式拖放有两种类型:OLE拖放和文件管理器拖放。
这两种方式是完全不同的机制。
文件管理器拖放只能处理文件名,通过映射目的窗口的WM_DROPFILES消息,窗口就可以收到拖放进来的文件名。
OLE 拖放则更加通用一些,它允许你拖放可同时被保存在剪贴板上的任何数据。
本文首先介绍文件管理器拖放,然后再介绍OLE拖放,最后给出一个用OLE实现的,支持文件拖放操作的增强列表控件CListCtrlEx。
三、文件管理器拖放原理及实例这种方式的实质就是产生一个消息WM_DROPFILES。
技术上没有什么难点,主要用到下面几个API函数:DragQueryFile、DragQueryPoint、DragFinish。
它们的原型和注解分别如下:UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch)本函数用来取得拖放的文件名。
其中,hDrop是一个指向含有被拖放的文件名的结构体的句柄;iFiles是要查询的文件序号,因为一次可能同时拖动很多个文件;lpszFiles是出口缓冲区指针,保存iFiles指定序号的文件的路径名,cch指定该缓冲区的大小。
有两点值得注意,第一,如果我们在调用该函数的时候,指定iFile为0xFFFFFFFF,则DragQueryFile将忽略lpszFile和cch参数,返回本次拖放操作的文件数目;第二,如果指定lpszFile为NULL,则函数将返回实际所需的缓冲区长度。
mfc static text使用
MFC静态文本(Static Text)是MFC框架中非常常用的一个控件,它用于显示静态文本信息,不支持用户输入。
在MFC编程中,静态文本通常用于显示一些提示信息、标签、标题等,它的内容一般是固定的,不会随用户输入或操作而改变。
本文将介绍MFC静态文本的基本用法和常见操作。
一、MFC静态文本的创建和属性设置在MFC应用程序中,可以通过对话框编辑器(Dialog Editor)来方便地创建静态文本控件,并设置其属性。
打开对话框编辑器,在工具箱中选择“静态文本”控件,然后在对话框中拖拽鼠标来创建一个静态文本控件。
创建完成后,双击静态文本控件,可以弹出属性框,可以设置静态文本的文本内容、字体、颜色、对齐方式等属性。
在MFC代码中,可以通过控件ID来获取静态文本控件的指针,并对其属性进行设置。
可以使用如下代码来改变静态文本的文本内容:```C++GetDlgItem(IDC_STATIC)->SetWindowText(_T("Hello, MFC Static Text!"));```二、MFC静态文本的事件处理MFC静态文本控件不支持用户输入,因此也不会触发鼠标键盘事件。
但是,如果需要对静态文本进行一些特殊处理,可以通过子类化(Subclassing)的方式来添加事件处理函数。
可以通过如下代码来为静态文本控件添加鼠标悬停事件处理函数:```C++void CMyDialog::OnInitDialog(){CDialog::OnInitDialog();CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC);pStatic->ModifyStyle(0, SS_NOTIFY);pStatic->SubclassDlgItem(IDC_STATIC, this);}LRESULT CMyDialog::OnCtlColorStatic(WPARAM wParam, LPARAM lParam){CDC* pDC = CDC::FromHandle((HDC)wParam);CWnd* pWnd = CWnd::FromHandle((HWND)lParam);if (pWnd->GetDlgCtrlID() == IDC_STATIC){pDC->SetTextColor(RGB(255, 0, 0));}return (LRESULT)GetStockObject(NULL_BRUSH);}```以上代码中,通过SubclassDlgItem函数将静态文本控件进行子类化,然后重载OnCtlColorStatic函数来设置静态文本的显示颜色。
element-plus的upload拖拽上传原理
element-plus的upload拖拽上传原理
element-plus upload 组件的拖拽上传原理如下:
1. 当用户将文件拖拽到 upload 组件上方时,会触发 dragenter
事件。
在该事件处理程序中,会阻止浏览器的默认行为,以禁止浏览器对拖拽文件的默认处理操作。
2. 紧接着,会触发 dragover 事件。
在该事件处理程序中,同
样会阻止浏览器的默认行为,并且添加一些样式以提醒用户可以释放文件。
3. 当用户释放文件时,会触发 drop 事件。
在该事件处理程序中,会阻止浏览器的默认行为,并且获取拖拽的文件列表。
4. 获取到文件列表后,upload 组件会将文件列表进行处理,根据配置的参数进行验证。
验证通过后,会根据配置的上传方式,将文件发送给服务器。
5. 在上传文件的过程中,upload 组件会显示上传的进度,并在上传完成后,根据服务器返回的响应进行处理,如显示上传成功或者上传失败的信息。
需要注意的是,上传文件的具体实现是在浏览器的底层进行的,而不是由 upload 组件自身实现的。
upload 组件主要是提供了
拖拽文件的交互和对文件进行验证的功能。
具体的上传实现可能会使用 XMLHttpRequest 对象或者 Fetch API 进行文件的发
送和接收。
用MFC实现文件拖放(获得文件路径)
⽤MFC实现⽂件拖放(获得⽂件路径)1、⽤MFC Appwizard创建⼀个基于SDI的新⼯程,命名为Drag,除第⼀步选择第⼀项以外,其余全⽤默认设置。
2、DragView.h⽂件CListBox m_View_List;3、DragView.cpp⽂件---- ⽤classwizard添加WM_CREATE消息响应,然后在OnCreate函数中添加如下代码:DragAcceptFiles();//向file manager注册⾃⼰,使⾃⼰能接受droped file(s) CRect rect(0,0,100,80);m_View_List.Create(WS_VISIBLE|WS_VSCROLL,rect,this,IDC_VIEW_LIST);//创建listbox4、Resource.h---- 修改Resource.h⽂件,为listbox的ID(IDC_VIEW_LIST)分配⼀个值---- 例如:#define IDC_VIEW_LIST 10005、DragView.cpp⽂件---- ⽤classwizard添加WM_SIZE消息响应,然后在OnSize函数中添加如下代码:---- m_View_List.MoveWindow(0,0,cx,cy);//使listbox所占区域始终保持与客户区⼀样⼤6、DragView.cpp⽂件---- ⽤classwizard添加WM_DROPFILES消息响应,然后在OnDropFiles函数中添加如下代码:void CMyDragView::OnDropFiles(HDROP hDropInfo) { // TODO: Add your message handler code here and/or call default int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);//取得被拖动⽂件的数⽬ for(int i=0;i< DropCount;i++) { //取得第i个拖动⽂件名所占字节数 int NameSize=DragQueryFile(hDropInfo,i,NULL,0); HANDLE hHeap=GetProcessHeap(); //根据字节数分配缓冲区 //char *pName=new char[++NameSize]; char *pName=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,NameSize++);if (pName==NULL) { MessageBox("给⽂件名分配暂存空间时出错!","错误信息",MB_ICONERROR); return; } DragQueryFile(hDropInfo,i,pName,NameSize);//把⽂件名拷贝到缓冲区 m_View_List.AddString(pName);//⽂件名加⼊listbox 中显⽰ //delete [] pName;//释放缓冲区 HeapFree(hHeap,HEAP_ZERO_MEMORY,pName); }DragFinish(hDropInfo); //拖放结束后,释放内存CView::OnDropFiles(hDropInfo);}---- 到此就完成了⽂件拖放到view中的listbox,你可以编译、运⾏了。
JAVA拖拽功能实现代码
JAVA拖拽JscrollPanesun在java2中引入了一些新的方法来帮助实现拖拽功能,这些新的类在java.awt.dnd包中实现一个D&D操作一般包括三个步骤:首先实现一个拖拽源,这个拖拽源和相应的组件是关联起来的第二步实现一个拖拽目标,这个目标用来实现拖拽物的接收第三步实现一个数据传输对象,该对象封装拖动的数据_____________________ _____________________| | | || DragSource Component| |DropTarget Component||_____________________| |____________________| | ||____________Transferable Data_________________|Transferable 接口实现出的对象能够保证DropTarget Component读懂拖拽过来的对象中包含的信息如果是在同一个虚拟机中实现拖拽的话,DragSource Component会传递一个引用给DropTarget Component但是如果在不同的JVM中或者是在JVM和本地系统之间传递数据的话我们就必须实现一个Transferable对象来传递数据Transferable中封装的内容存放到DataFlavors,用户可以通过访问DataFlavors来获取数据1。
创建可拖拽对象一个对象那个如果想作为拖拽源的话,必须和五个对象建立联系,这五个对象分别是:* java.awt.dnd.DragSource获取DragSource的方法很简单,直接调用DragSource.getDefaultDragSource();就可以得到DragSource对象* java.awt.dnd.DragGestureRecognizerDragGestureRecognizer类中实现了一些与平台无关的方法,我们如果想在自己的组件上实现拖拽的话只要调用createDefaultDragGestureRecognizer()方法就可以了该方法接收三个参数,建立组件和拖拽动作之间的关系* java.awt.dnd.DragGestureListener当建立了组件和拖拽动作之间的联系后,如果用户执行了拖拽操作,组件将发送一个消息给DragGestureListener监听器DragGestureListener监听器接下来会发送一个startDrag()消息给拖拽源对象,告诉组件应该执行拖拽的初始化操作了拖拽源会产生一个DragSourceContext对象来监听动作的状态,这个监听过程是通过监听本地方法DragSourceContextPeer来实现的* java.awt.datatransfer.Transferable* java.awt.dnd.DragSourceListenerDragSourceListener接口负责当鼠标拖拽对象经过组件时的可视化处理,DragSourceListener接口的显示结果只是暂时改变组件的外观同时他提供一个feedback,当用户的拖拽操作完成之后会收到一个dragDropEnd的消息,我们可以在这个函数中执行相应的操作再来回顾一下拖拽源的建立过程首先、DragGestureRecognizer 确认一个拖拽操作,同时告知DragGestureListener.其次、Assuming the actions and/or flavors are OK, DragGestureListener asks DragSource to startDrag().第三、DragSource creates a DragSourceContext and a DragSourceContextPeer. The DragSourceContext adds itself as a DragSourceListener to the DragSourceContextPeer.第四、DragSourceContextPeer receives state notifications (component entered/exited/is over) from the native system and delegates them to the DragSourceContext.第五、The DragSourceContext notifies the DragSourceListener, which provides drag over feedback (if the DropTargetListener accepts the action). Typical feedback includes asking the DragSourceContext to change the cursor.最后、When the drop is complete, the DragSourceListener receives a dragDropEnd notification message2。
mfc 对象拖拽 编程
mfc 对象拖拽编程(最新版)目录1.MFC 简介2.MFC 对象拖拽原理3.MFC 对象拖拽编程实例4.总结正文一、MFC 简介MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的类库。
它包含了大量的预定义类和函数,可以帮助程序员快速、方便地完成各种常用功能,如窗口、对话框、文件操作等。
MFC 基于 C++编写,因此可以使用 C++语言进行编程。
二、MFC 对象拖拽原理在 MFC 中,对象拖拽是指将一个对象(如按钮、文本框等)从一个位置移动到另一个位置。
这一过程可以通过鼠标点击和释放来完成。
对象拖拽的核心原理是鼠标消息处理,主要包括以下步骤:1.捕获鼠标消息:程序需要捕获鼠标点击和释放消息,以便判断拖拽的开始和结束。
2.判断拖拽对象:在鼠标点击消息处理函数中,需要判断哪个对象被点击,以便进行后续的拖拽操作。
3.计算拖拽方向和距离:在鼠标释放消息处理函数中,需要计算鼠标释放位置与对象当前位置之间的距离和方向,以便更新对象的位置。
4.更新对象位置:根据计算得到的拖拽方向和距离,将对象的位置进行更新。
三、MFC 对象拖拽编程实例以下是一个简单的 MFC 对象拖拽编程实例:1.创建一个 MFC 应用程序,添加一个 CButton 控件和一个 CEdit 控件。
2.为 CButton 控件添加鼠标点击消息处理函数,判断点击的按钮是否为拖拽源对象。
3.为 CEdit 控件添加鼠标点击和释放消息处理函数,判断点击的编辑框是否为拖拽目标对象。
4.在鼠标释放消息处理函数中,计算拖拽方向和距离,并更新编辑框的位置。
四、总结MFC 对象拖拽是 Windows 应用程序中常见的交互功能之一。
通过捕获鼠标消息、判断拖拽对象、计算拖拽方向和距离以及更新对象位置等步骤,可以实现对象的拖拽功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现文件拖放的一种简洁方法
本文要介绍的这种方法只须调用一个WINDOWS API函数DragQueryFile即可实现文件的拖放操作,而且完全克服了上述3点不足。
下面先介绍一下这个函数。
---- DragQueryFile原型为:
UINT DragQueryFile (HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINTcch)
---- 其中hDrop是指向拖动文件结构的句柄;
---- iFile 是以0开始的被托动文件的序号,因为一次可能拖动多个文件。
当此参数
---- 设为0xFFFFFFFF,则函数返回拖动文件的数量;
---- lpszFile 是指向文件名的缓冲区;
---- cch 是文件名缓冲区的大小,即文件名的字符数。
---- 明确了该函数的参数后,编程就是一件很简单的事情了。
以下给出一个完整的实例,
程序运行后弹出一个对话框,可以拖动任意数量的文件或目录到上面,
松开鼠标后,程序先显示拖放文件的数量,然后将拖放的文件名全部显示在一个List Box控件中。
具体步骤如下:
建立一个基于对话框的工程drop,然后其它选项全部用缺省值。
选中IDD_DROP_DIALOG对话框中Extended Styles的Accept files属性。
给IDD_DROP_DIALOG对话框添加一个List Box 控件IDC_LIST1。
在ClassWizard中给CdropDlg类添加成员变量m_list,类型为ClistBox。
给CdropDlg类中增加处理WINDOWS消息WM_DROPFILES的函数,
接受系统给出的默认名字OnDropFiles,然后输入以下代码:
void CDropDlg::OnDropFiles(HDROP hDropInfo)
{char *lpszFileName=new char[512],cFileCount[10];
int nFileCount,i;
nFileCount=::DragQueryFile
(hDropInfo,0xFFFFFFFF,NULL,512);
::AfxMessageBox(itoa(nFileCount,cFileCount,10));
for (i=0;i< nFileCount;i++)
{
UINT nChars=::DragQueryFile
(hDropInfo,i,&lpszFileName[0],512);
CString str(&lpszFileName[0],nChars);
m_List.AddString(str); // 若对于CEdit,用m_edit1.SetWindowText(str);
}
::DragFinish (hDropInfo); //释放内存
i=0;
delete []lpszFileName;
// CDialog::OnDropFiles(hDropInfo); 此语句注释掉
}
---- 注意程序中的::DragFinish (hDropInfo);语句是必不可少的,它用于释放WINDOWS为处理文件拖放而分配的内存。