吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7352|回复: 7
收起左侧

[其他转载] 让程序支持拖拽功能(VC)

[复制链接]
iawen 发表于 2009-1-28 23:31
这里主要是三个函数一个消息。三个函数分别是:
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![separator]

由于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;
}
编译运行如图:
2009-01-25_212334.gif

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

AppDragFile.rar

49.93 KB, 下载次数: 23, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

creantan 发表于 2009-1-28 23:52
学习下。。。呵呵[s:47]
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
点击下载.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 10:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表