现在的位置: 首页 > 综合 > 正文

窗口支持文件拖入功能

2013年12月08日 ⁄ 综合 ⁄ 共 1969字 ⁄ 字号 评论关闭

我们经常看到很多应用程序支持文件拖入功能,个人感觉很酷,碰巧本人毕设做的是一个多媒体播放器,刚好可以用到这个技术。所以查了下相关的资料。

首先,我们要先熟悉下三个相关API函数的使用。

1.VOID DragAcceptFiles(      

    HWND hWnd,
    BOOL fAccept
);

这个函数的调用,表示你要让某个窗体能够接受文件的拖入。第一个参数指定是哪个窗口,第二个参数指定为true表示接受,否则表示不接受。


2.UINT DragQueryFile(      

    HDROP hDrop,

    UINT iFile,

    LPTSTR lpszFile,

    UINT cch

);

这个函数是获得拖入的文件信息的函数

在介绍这个函数之前,我们要先看个 消息。WM_DROPFILES  我们必须处理这个消息,因为这个消息告诉我们
有文件拖入操作发生。
最重要的是,
它传递给我们一个HDROP 的结构体,这个结构体正是你要在函数DragQueryFile里面要用到的第一个参数。

第二个参数,是个数字,如果你指定它为0xFFFFFFFF,那么函数的返回值就是文件的个数。否则,这个参数表示你要获取的是第几个文件的路径名称。

第三个参数,是一个字符串缓存,用来存放函数返回给你的文件路径。如果这个参数被你指定为NULL,那么函数返回所需要的字符串缓存的大小

第四个参数,也就是你指定的字符串缓存的大小了


3.VOID DragFinish(      
    HDROP hDrop

);

这个函数表示你对拖放操作已经处理完毕,系统可以释放文件信息结构了。


下面来看看例子:

1.首先在view视图类的OnCreate函数里面 调用DragAcceptFile,这里调用的是视图类的自己的DragAcceptFile函数

所以没有要求指定窗口。

  1. int CVideoPlayerView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2.   
  3. {  
  4.   
  5.  //让view类支持文件拖入  
  6.  DragAcceptFiles(TRUE);  
  7.   
  8. }  

2.在CVideoPlayerView类中响应WM_DROPFILES 这个消息

  1. void CVideoPlayerView::OnDropFiles(HDROP hDropInfo)  
  2. {  
  3.  // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.   
  5.  //保存结构体  
  6.     m_hdrop=hDropInfo;  
  7.   
  8.  //查询拖入文件个数  
  9.  int number=0;  
  10.  number=DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);  
  11.  TRACE("number of files is:%d/n",number);  
  12.   
  13.  //查询每个文件的名称  
  14.  TCHAR szpathName[MAX_PATH];  
  15.  CString  pathName;  
  16.  CString  fileName;  
  17.   
  18.  DWORD    dwSize;  
  19.  for (int i=0;i<number;i++)  
  20.  {  
  21.   dwSize=DragQueryFile(hDropInfo,i,NULL,0);  
  22.   DragQueryFile(hDropInfo,i,szpathName,dwSize+1);  
  23.   
  24.   pathName=szpathName;  
  25.   
  26.   //获得文件名  
  27.   fileName=GetFileName(pathName);  
  28.   //加入播放文件列表  
  29.   m_listbox.AddString(fileName);  
  30.   
  31.   //加入map  
  32.   m_filelist.insert(make_pair(fileName,pathName));  
  33.   
  34.   //播放第一个影片  
  35.   if (i==0)  
  36.   {  
  37.    DWORD  dwIndex=0;  
  38.    dwIndex=m_listbox.GetCount();  
  39.    m_listbox.SetCurSel(dwIndex-1);  
  40.   
  41.    m_player.OpenAction(m_hWnd,pathName,m_rect_display);  
  42.   }  
  43.  }  
  44.   
  45.   
  46.  //完成拖入文件操作,让系统释放缓冲区  
  47.  DragFinish(hDropInfo);  
  48.   
  49.  CView::OnDropFiles(hDropInfo);  
  50. }  

上面实现的功能是,将文件拖入播放窗口,播放器就开始播放第一个拖入的文件,可以一次拖入多个文件。

抱歉!评论已关闭.