让程序支持拖拽功能 - IaWeN's Blog - 我喜欢这样自由的随手涂鸦,因为我喜欢风……
Jan 25

让程序支持拖拽功能

Posted by iawen at 21:49 | 程序设计 | 评论(0) | 阅读(708) | |
这里主要是三个函数一个消息。三个函数分别是:
VOID DragAcceptFiles(HWND hWnd,BOOL fAccept);
UINT DragQueryFile(HDROP hDrop,UINT iFile,LPTSTR lpszFile,UINT cch);
VOID DragFinish(HDROP hDrop);


一个消息是:
WM_DROPFILES
SendMessage( hWndControl, WM_DROPFILES, wParam,  lParam );

其中:
wParam的值为(HDROP),而lParam的值则必须为0!

由于DragAcceptFiles函数的第一个参数是一个窗口的句柄,所以在创建对话框时,不能用DialogBox、DialogBoxIndirect 、DialogBoxIndirectParam、DialogBoxParam等函数了,可以选择是对应的几个Create系列函数:CreateDialog、CreateDialogIndirect、CreateDialogIndirectParam、CreateDialogParam,因为这几个函数返回的值就是窗口句柄!

主函数的代码如下:

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nShowCmd)
{
  g_hInst=hInstance;
  g_hWnd=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,MyMainProc);
  ShowWindow(g_hWnd,nShowCmd);
  DragAcceptFiles(g_hWnd,TRUE);

  MSG uMsg;
  while(GetMessage(&uMsg,NULL,0,0)){
    TranslateMessage(&uMsg);
    DispatchMessage(&uMsg);
  }

  return 0;
}
 


接下来就是接收WM_DROPFILES消息并给予处理了:
case WM_DROPFILES:
接收到消息后,将wParam参数传递给DragQueryFile函数进行处理就可以得到我们需要的了:

TCHAR szFilePath[MAX_PATH] = {0};
DragQueryFile((HDROP)wParam,0,szFilePath,MAX_PATH-1);
DragFinish((HDROP)wParam);         //事后清理
 


一个简单的处理代码如下:

case WM_DROPFILES:
      {
      TCHAR szFilePath[MAX_PATH] = {0};
      memset(szFilePath,0,MAX_PATH);
      DragQueryFile((HDROP)wParam,0,szFilePath,MAX_PATH-1);
      DragFinish((HDROP)wParam);
      SetDlgItemText(hDlg,IDC_DISP,szFilePath);
      return FALSE;
      }
 


完整的代码如下:

#include<windows.h>
#include<shellapi.h>
#include"resource.h"

HINSTANCE g_hInst;
HWND g_hWnd;
INT_PTR CALLBACK MyMainProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nShowCmd)
{
  g_hInst=hInstance;
  g_hWnd=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,MyMainProc);
  ShowWindow(g_hWnd,nShowCmd);
  DragAcceptFiles(g_hWnd,TRUE);

  MSG uMsg;
  while(GetMessage(&uMsg,NULL,0,0)){
    TranslateMessage(&uMsg);
    DispatchMessage(&uMsg);
  }

  return 0;
}

INT_PTR CALLBACK MyMainProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
  switch(uMsg){
    case WM_INITDIALOG:
      SetDlgItemText(hDlg,IDC_DISP,TEXT("直接拖拽文件到这里"));
      return TRUE;
    case WM_SYSCOMMAND:
      switch(wParam)
      {
        case SC_CLOSE:
          DestroyWindow(hDlg);
          PostQuitMessage(0);
          return TRUE;
      }
      return FALSE;

    case WM_DROPFILES:
      {
      TCHAR szFilePath[MAX_PATH] = {0};
      memset(szFilePath,0,MAX_PATH);
      DragQueryFile((HDROP)wParam,0,szFilePath,MAX_PATH-1);
      DragFinish((HDROP)wParam);
      SetDlgItemText(hDlg,IDC_DISP,szFilePath);
      return FALSE;
      }
  }
  return FALSE;
}
 


编译运行如图:
Highslide JS

附件为测试的小程序完整的VS2008工程:
下载文件 (已下载 79 次)



版权所有。转载时必须以链接形式注明作者和原始出处及本声明!如果 对文章有意见,请发邮件到iawen#126.com,或者直接在博客留言。
Tags:
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]