搜索
您的当前位置:首页正文

用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 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

#include

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 加到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下通过。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top