iawen 发表于 2009-1-28 23:31

让程序支持拖拽功能(VC)

这里主要是三个函数一个消息。三个函数分别是:
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 = {0};
DragQueryFile((HDROP)wParam,0,szFilePath,MAX_PATH-1);
DragFinish((HDROP)wParam);         //事后清理
一个简单的处理代码如下:
case WM_DROPFILES:
      {
      TCHAR szFilePath = {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 = {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;
}
编译运行如图:


附件为测试的小程序完整的VS2008工程:

creantan 发表于 2009-1-28 23:52

学习下。。。呵呵

zapline 发表于 2009-1-29 15:06

学习了

foreverhack 发表于 2010-12-2 21:42

嘿嘿,就喜欢分享源代码!!!

nsso 发表于 2010-12-3 03:20

VC的东西比较少呢

zywinqq 发表于 2010-12-3 03:35

就是源码 吼吼 好东西

brightsm 发表于 2013-4-21 18:02

这个学一下。

redmzcom 发表于 2013-4-23 20:09

点击下载.{:1_929:}
页: [1]
查看完整版本: 让程序支持拖拽功能(VC)