在标准对话框,选择打开要文件时,拖动文件图表到指定edit的位置,在edit上面显示文件的path和name!2007-12-08 上午 00:30

 
一、用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 class
CDragDoc *pDoc=GetDocument();
SetDlgItemText(IDC_EDIT1,pDoc->GetPathName());
}
2、实现拖放功能
BOOL CDrag1App::InitInstance()
{
……
// Enable drag/drop open
m_pMainWnd->DragAcceptFiles();
return TRUE;
}
好了,就这么简单,你几乎没做什么代码输入工作程序就完成了。
可如果我们现在建立一个基于对话框的应用程序,由于没有了主框架
结构,这时要实现同样的功能,上述方法是行不通的,只好自己来做了。

二、基于对话框的应用
(一)建立基于对话框的应用程序Drag2
从File菜单选择New对话,键入Drag2作为项目名并单击OK。在第一步中
选中Dialog Based单选按钮,其它接受所有默认选项。
(二)利用对话框编辑器来修改IDD_DRAG2_GIALOG对话框,如图2示
样式。注意,property中选"Accept Files"。
(三)利用ClassWizard创建CDropEdit新类,然后再添加OnCreate、
OnDropFiles函数,并编辑如下:
1、DropEdit.h文件
BOOL m_bUseDir;
……
2、DropEdit.cpp文件
……
#include <sys/types.h>
#include <sys/stat.h>
CDropEdit::CDropEdit()
{
m_bUseDir=FALSE;
}
……
int CDropEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
DragAcceptFiles(TRUE);
return 0;
}
void CDropEdit::OnDropFiles(HDROP dropInfo)
{
WORD wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0);
CString firstFile="";
for (WORD x = 0 ; x < wNumFilesDropped; x++) {
WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0);
char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);
if (npszFile == NULL) continue;
DragQueryFile(dropInfo, x, npszFile, wPathnameSize);
if (firstFile=="")
firstFile=npszFile;
LocalFree(npszFile);
}
DragFinish(dropInfo);
CString expandedFile = ExpandShortcut(firstFile);
if (expandedFile!="")
firstFile=expandedFile;
struct _stat buf;
int result = _stat( firstFile, &buf );
if( result == 0 ) {
if ((buf.st_mode & _S_IFDIR) == _S_IFDIR) {
if (m_bUseDir)
SetWindowText(firstFile);
} else if ((buf.st_mode & _S_IFREG) == _S_IFREG) {
if (!m_bUseDir)
SetWindowText(firstFile);
}
}
}
CString CDropEdit::ExpandShortcut(CString &inFile)
{
CString outFile = "";
ASSERT(inFile != _T(""));
IShellLink* psl;
HRESULT hres;
LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
if (SUCCEEDED(hres))
{
WORD wsz[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
WIN32_FIND_DATA wfd;
// find the path from that
HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH),
MAX_PATH,
&wfd,
SLGP_UNCPRIORITY);
outFile.ReleaseBuffer();
}
ppf->Release();
}
psl->Release();
}
inFile.ReleaseBuffer();
return outFile;
}
(四)将#include <afxole.h>加到stdafx.h文件中
(五)在CDrag2App的InitInstance中加入
::CoInitialize(NULL);
(六)在CDrag2App的ExitInstance中加入
::CoUninitialize();
(七)将#include "DropEdit.h"加入Drag2Dlg.h中
(八)在CDrag2Dlg构造函数中加入
CdropEdit m_dropEdit;
在OnInitDialog中加入m_dropEdit.SubclassDlgItem(IDC__EDIT1, this);
现在大功告成,可以运行程序了,本程序拖动文件时必须将文件
拖到对话框的编辑框中,这一点不同于Drag1应用只要将文件拖到对话
框中即行,有读者能对此改进的请赐教。
本文程序均在VC6.0下通过。

在Python中,要实现图形界面中的文件拖放功能并将文件保存到特定文件夹,可以使用`tkinter`库来创建图形界面,并结合操作系统提供的拖放API或使用第三方库如`PyQt`或`wxPython`来实现高级的图形界面功能。下面给出一个简单的实现思路: 1. 使用`tkinter`或`PyQt`、`wxPython`创建图形用户界面(GUI),在其中放置一个标签或者窗口作为拖放目标区域。 2. 为该目标区域绑定事件处理器,以便在文件被拖到该区域触发相应的事件。 3. 在事件处理函数中,使用操作系统的API或者第三方库提供的接口来获取被拖拽文件的信息。 4. 将获取到的文件保存到指定文件夹中。 这里是一个使用`tkinter`和Python内置的`shutil`库实现该功能的简单示例: ```python import tkinter as tk from tkinter import filedialog import os import shutil def drop(event): # 获取拖放文件的路径 filenames = event.data # 获取目标文件夹路径 target_folder = 'text' # 检查目标文件夹是否存在,不存在则创建 if not os.path.exists(target_folder): os.makedirs(target_folder) # 移动文件到目标文件夹 for filename in filenames.split(): shutil.move(filename, target_folder) # 更新显示区域以显示文件名 listbox.delete(0, tk.END) for filename in filenames.split(): listbox.insert(tk.END, os.path.basename(filename)) root = tk.Tk() root.title("文件拖放示例") # 创建一个标签作为拖放目标区域 target_label = tk.Label(root, text="拖放文件到这里", width=30, height=10) target_label.pack() # 创建一个Listbox来显示已拖放的文件 listbox = tk.Listbox(root, width=50, height=10) listbox.pack() # 为标签绑定拖放事件处理 target_label.dnd_bind('<<Drop>>', drop) root.mainloop() ``` 在这个例子中,我们创建了一个标签,并为它绑定了一个`drop`事件处理函数。当文件被拖到这个标签上,会触发`drop`函数,该函数将获取文件的路径并将其移动到名为"text"的文件夹中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值