VC实现文件拖放

---- DragQueryFile 原 型 为: 

  UINT DragQueryFile( HDROP    hDrop, 
                      UINT      iFile, 
                      LPTSTR   lpszFile, 
                      UINT      cch )

----其 中hDrop 是 指 向 拖 动 文 件 结 构 的 句 柄; 

---- iFile 是 以0 开 始 的 被 拖 动 文 件 的 序 号, 因 为 一 次 可 能 拖 
动 多 个 文 件。 当 此 参 数 设 为0xFFFFFFFF, 则 函 数 返 回 拖 动 文 件 
的 数 量; 

---- lpszFile 是 指 向 文 件 名 的 缓 冲 区; 

---- cch 是 文 件 名 缓 冲 区 的 大 小, 即 文 件 名 的 字 符 数。 

----以 下 给 出 一 个 完 整 的 实 例, 程 序 运 行 后 弹 出 一 个 对 话 
框, 可 以 拖 动 任 意 数 量 的 文 件 或 目 录 到 上 面, 松 开 鼠 标 后, 
程 序 先 显 示 拖 放 文 件 的 数 量, 然 后 将 拖 放 的 文 件 名 全 部 显 
示 在 一 个List Box 控 件 中。 具 体 步 骤 如 下: 

建 立 一 个 基 于 对 话 框 的 工 程drop, 然 后 其 他 选 项 全 部 用 缺 省 
值。 
选 中IDD_DROP_DIALOG 对 话 框 中Extended Styles 的Accept files 属 性。 
给IDD_DROP_DIALOG 对 话 框 添 加 一 个List Box 控 件IDC_LIST1。 
在ClassWizard 中 给CdropDlg 类 添 加 成 员 变 量m_list, 类 型 为 ClistBox。 
给CdropDlg 类 中 增 加 处 理Windows 消 息WM_DROPFILES 的 函 数, 接 受 系 
统 给 出 的 默 认 名 字OnDropFiles, 然 后 输 入 以 下 代 码:
void CDropDlg::OnDropFiles(HDROP hDropInfo) 
{
char *lpszFileName=new char[512],cFileCount[10];
int nFileCount,i;
nFileCount=::DragQueryFile
    (hDropInfo,0xFFFFFFFF,NULL,512);
::AfxMessageBox(itoa(nFileCount,cFileCount,10));
for (i=0;i< nFileCount;i + +)
{
UINT nChars=::DragQueryFile (hDropInfo,i, 
    &lpszFileName[0],512);
CString str( &lpszFileName[0],nChars);
m_List.AddString(str);
}
::DragFinish (hDropInfo);   // 释 放 内 存
      i=0;
      delete []lpszFileName;
//    CDialog::OnDropFiles(hDropInfo); 
    此 语 句 注 释 掉
}

----注 意 程 序 中 的::DragFinish (hDropInfo); 语 句 是 必 不 可 少 的, 它 
用 于 释 放Windows 为 处 理 文 件 拖 放 而 分 配 的 内 存。 

----运 行 此 程 序 可 以 看 到, 拖 动 的 文 件 只 要 一 进 入 对 话 框 的 
边 界, 鼠 标 上 立 刻 会 现 一 个" +", 在 对 话 框 上 的 任 意 位 置 释 
放 鼠 标, 拖 放 的 文 件 都 会 被 接 受, 完 全 解 决 了《 用 MFC 实 现 文 
件 拖 放 到 编 辑 框》 必 须 将 文 件 拖 到 编 辑 框 的 不 足; 而 且 拖 放 
是 通 过 调 用Windows API 函 数 实 现 的, 因 此 程 序 非 常 健 壮, 几 乎 
没 有 什 么 维 护 量。 

你可能感兴趣的:(VC实现文件拖放)