对CEdit进行继承,支持DropFile得到文件名
0.新建类对CEdit类进行继承
新类CEditWithDrag支持文件的拖拽得到文件名。
使用的时候添加头文件到具体程序中,再使用类向导与资源文件关联起来就可以使用。
1.修改EditWithDrag.h
#if!defined(AFX_EDITWITHDRAG_H__974E2549_B273_435C_884B_C69106266AF5__INCLUDED_)
#defineAFX_EDITWITHDRAG_H__974E2549_B273_435C_884B_C69106266AF5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// EditWithDrag.h : header file
//
/
// CEditWithDrag window
class CEditWithDrag : public CEdit
{
// Construction
public:
CEditWithDrag();
// Attributes
public:
// Operations
public:
// Overrides
//ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CEditWithDrag)
//}}AFX_VIRTUAL
// Implementation
public:
virtual~CEditWithDrag();
//Generated message map functions
protected:
//{{AFX_MSG(CEditWithDrag)
//NOTE - the ClassWizard will add and remove member functions here.
afx_msgvoid OnDropFiles(HDROP hDropInfo); //添加消息处理
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insertadditional declarations immediately before the previous
line.
#endif //!defined(AFX_EDITWITHDRAG_H__974E2549_B273_435C_884B_C69106266AF5__INCLUDED_)
2.修改EditWithDrag.cpp
// EditWithDrag.cpp : implementation file
//
#include "stdafx.h"
#include "Drag.h"
#include "EditWithDrag.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CEditWithDrag
CEditWithDrag::CEditWithDrag()
{
}
CEditWithDrag::~CEditWithDrag()
{
}
BEGIN_MESSAGE_MAP(CEditWithDrag, CEdit)
//{{AFX_MSG_MAP(CEditWithDrag)
//NOTE - the ClassWizard will add and remove mapping macros here.
ON_WM_DROPFILES() //消息处理
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CEditWithDrag message handlers
//处理函数
void CEditWithDrag::OnDropFiles(HDROPhDropInfo)
{
//取得被拖动文件的数目
intDropCount=DragQueryFile(hDropInfo, //HDROP结构体,保存序号加完整文件名
-1, //作为文件名索引。但此项为-1或者0xFFFFFFFF时返回文件数量
NULL,
0); //此项为最大长度
for(inti=0;i<DropCount;i++)
{
//取得第i个拖动文件名所占字节数
intNameSize=DragQueryFile(hDropInfo,
i,
NULL,//此项为NULL时,表示返回当前文件名的长度(未加'\0'长度)
0);
//char*pName=new char[++NameSize];
//memset(pName,0,NameSize);
//用new动态创建的数组不能被初始化
//char *pName=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,++NameSize);
//在堆内存上申请了一个不可移动的空间
HANDLE hHeap=GetProcessHeap();
char*pName=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,++NameSize);
//++NameSize为空间大小
if(pName==NULL)
{
MessageBox("给文件名分配暂存空间时出错!","错误信息",MB_ICONERROR);
return;
}
//把文件名拷贝到缓冲区pName
DragQueryFile(hDropInfo,
i,
pName, //此项保存第i个文件的文件名
NameSize);
this->SetSel(0,-1,FALSE); //全选
this->SetSel(-1,0,FALSE); //取消选择联合目的 定位到最后位置
this->ReplaceSel(pName,FALSE);
this->ReplaceSel("\r\n",FALSE);
HeapFree(hHeap,HEAP_ZERO_MEMORY,pName);
//delete[] pName;
//释放缓冲区
}
CEdit::OnDropFiles(hDropInfo);
}
3.初始化过程中加入或者手动设置控件AcceptFiles属性
CEditDrag::DragAcceptFiles(); //设置对话框属性支持拖放文件
4.最后要在 XXXDlg.h 处包含此继承类的.h头文件
#include "EditWithDrag.h"