首页 > MFC > MFC实现文件拖拽功能

MFC实现文件拖拽功能

2012年8月2日 发表评论 阅读评论

最近玩空轨3rd,经过内心无数次激烈的斗争,我毅然决然的打开了修改器,然后看到那个修改器的时候,我第一个注意到的不是这个修改器的功能,而是里面有个group控件,要把游戏的save文件拖到这里面来,再对save文件读取后修改。然后。。我一直在想的就是。。这个功能要怎么实现,想象QQ发文件也是拖拽功能,以前有个ASS字幕文件改SRT的也是拖拽一下就可以了。最近老板让我写的一个自动光栅仪的上位机程序里面要读取目标文件,我用的还是DoModel一个CFileDialog变量,如果实现拖拽的话,交互性感觉会好很多。

然后今早来实验室就上网查找资料,研究拖拽功能。

话说这个东西一点也不难,因为MFC本身就设置了这个功能。

最简单的你在MFC里面建立一个基于Dialog的工程,然后在对话框编辑器里面把Accept File改成TRUE,然后再给对话框添加一个WM_DROPFILES的消息响应,在OnDropFiles函数里面写拖拽到对话框里面后要响应的是什么代码就行了。

不过捏,我想要的不是这样的功能,我需要某一个控件具有拖拽功能,比如说一个Group Box,或者一个Edit Control,再或者一个Picture Control,这些控件的属性里面可以把Accept File改成TRUE,但是却找不到响应函数。。。

这个问题的解决方法其实很简单,就是你从你要的控件里面继承一个新的类,再在类里面实现这个相应就行了。

举个例子,假设我们要用一个Edit Control实现一个拖拽,把文件拖拽到这里后就显示文件的全路径。我们建立一个新的类,比如说叫CDropEdit,然后头文件如下:

其实就是加了一个OnDropFiles的函数声明而已。。

#pragma once
// CDropEdit
class CDropEdit : public CEdit
{
    DECLARE_DYNAMIC(CDropEdit)
public:
    CDropEdit();
    virtual ~CDropEdit();
    afx_msg void OnDropFiles(HDROP hDropInfo);//添加此函数
protected:
    DECLARE_MESSAGE_MAP()
};

然后下面是DropEdit的CPP文件:

// DropEdit.cpp : 实现文件

#include "stdafx.h"
#include "drag.h"
#include "DropEdit.h"

// CDropEdit

IMPLEMENT_DYNAMIC(CDropEdit, CEdit)

CDropEdit::CDropEdit()
{
}

CDropEdit::~CDropEdit()
{
}

BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

// CDropEdit 消息处理程序

void CDropEdit::OnDropFiles(HDROP hDropInfo)
{
    char FileName[MAX_PATH + 1];
    int FileNumber = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, MAX_PATH);
    if(FileNumber == 1)
    {
        DragQueryFile(hDropInfo, 0, FileName, MAX_PATH);//获取被拖拽的文件名
        SetWindowText(FileName);
    }
    else
    {
        ::AfxMessageBox("只能拖拽一个文件",MB_OK,0);
    }
    ::DragFinish(hDropInfo);       //释放内存
    CEdit::OnDropFiles(hDropInfo);
}

就是做两件事情,一件在消息映射那里添加ON_WM_DROPFILES();另一件事就是写好OnDropFiles函数,这个函数就是用DragQueryFile取得文件的信息的。第一个参数不解释,第二个如果是0XFFFFFFFF的话,就是返回拖拽的文件的数目,否则就是返回文件名,第一个的Index是0,第三个参数是文件名缓冲首地址,第四个缓冲区长度。

接下来就是要调用这个类了,include头文件自不用多说。然后你要添加这个空间的话,比如在对话框的OnCreate里面或者原本就有的OnInitDialog里面添加就可以了。代码示例如下:

CRect rect(0, 0, 180, 210);//控件位置和大小
CDropEdit* edit = new CDropEdit;//一定要用new
edit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | WS_BORDER, rect, this, 123);
edit->DragAcceptFiles(TRUE);//允许拖拽

【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: MFC 标签: ,