使用拖放的简单方法 (转)

本文详细介绍了如何在窗口中实现Drag&Drop功能,包括在OnCreate(...)中启用、消息映射、消息处理及短切路径扩展等关键步骤。
使用拖放的简单方法 (转)[@more@]

使用拖放的简单方法

如果要为窗口增加接受Drag&Drop的功能,请按照以下步骤:

1、在OnCreate(...)中调用AcceptDrag(TRUE)。

2、增加消息映射

BEGIN_MESSAGE_MAP(……)
  //{{AFX_MSG_MAP(CDropEdit)
  ON_WM_CREATE()
  ON_WM_DROPFILES() // 关于Drag&Drop的消息
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()

3、处理消息

void CXXXXX::OnDropFiles(HDROP dropInfo)
{
  // 得到Drag&Drop的文件个数
  word wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0);

  CString firstFile="";

  //
  for (WORD x = 0 ; x < wNumFilesDropped; x++) {

  // 得到PathName的长度,由于第三个参数为NULL,所以调用会失败并返回所需长度
  WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0);

  // 分配memory
  char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);

  // 分配错
  if (npszFile == NULL) continue;

  // 再次得到文件名
  DragQueryFile(dropInfo, x, npszFile, wPathnameSize);

  firstFile=npszFile;


  // 如果是shortCut则进行转换得到正确的文件名,expandedFile为最后的文件名
  CString expandedFile = ExpandShortcut(firstFile);

  // 释放memory
  LocalFree(npszFile);
  }

  //完成
  DragFinish(dropInfo);

}

4、关于ExpandShortcut(...)

CString CXXXXX::ExpandShortcut(CString &inFile)
{
  CString outFile = "";

// Make sure we have a path
ASSERT(inFile != _T(""));

IshellLink* psl;
HRESULT hres;
LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);

// Create instance for shell link
hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
// Get a pointer to the persist file interface
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
if (SUCCEEDED(hres))
{
// Make sure it's ANSI
WORD wsz[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);

// Load shortcut
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();

  // if this fails, outFile == ""
return outFile;
}


摘自玉海园 http://www.mfc2000.yeah.NET


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988013/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-988013/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值