• Windows界面编程第七篇 文件拖拽(文件拖放)


    本篇Windows界面编程第七篇文件拖拽(文件拖放)》来介绍如何为程序添加文件拖拽(文件拖放)操作,文件拖拽(文件拖放)操作可以归类到Windows程序的界面操作,因此也将这篇文章放到Windows界面编程系列中。

        文件拖拽(文件拖放)功能能有效提高用户体验,在VC++中要让程序支持文件拖拽功能,主要使用三个函数——DragAcceptFilesDragQueryFileDragFinish。下面先来介绍这三个函数(为了更加好学习英语,函数介绍尽可能会使用英语)。

    一.DragAcceptFiles

    函数功能:Registers whether a window accepts dropped files. An application that calls DragAcceptFiles with the fAccept parameter set to TRUE has identified itself as able to process the WM_DROPFILES message from File Manager.

    函数原型:

    //By MoreWindows-(http://blog.csdn.net/MoreWindows)

    VOIDDragAcceptFiles(

    HWNDhWnd,

    BOOL fAccept

    );

    参数说明:

    第一个参数hWnd:

    The identifier of the window that is registering whether it will accept dropped files.

    第二个参数fAccept:

    A value that indicates if the window identified by the hWnd parameter accepts dropped files. This value is TRUE to accept dropped files or FALSE to discontinue accepting dropped files.

    对于对话框程序,还可以通过选择其Properties->Extended Styles,点选Accept files选项即可。

    一.DragQueryFile

    函数功能:Retrieves the names of dropped files that result from a successful drag-and-drop operation.

    函数原型:

    //By MoreWindows-(http://blog.csdn.net/MoreWindows)

    UINTDragQueryFile(

    HDROPhDrop,

    UINT iFile,

    LPTSTRlpszFile,

    UINTcch

    );

    参数说明:
    第一个参数hDrop:

    HDROP标识符,即响应函数中的wParam参数
    第二个参数iFile::

    待查询的文件索引号,从0开始。可以同时拖拽多个文件,因此就需要一个索引号来进行区分。如果该参数为0xFFFFFFFF,则该函数返回拖拽的文件的个数
    第三个参数lpszFile:

    用于存放文件名的缓冲区首地址
    第四个参数cch:

    缓冲区长度
    函数返回值:若iFile为0xFFFFFFFF返回拖拽的文件个数,否则返回相应索引号的文件名长度。

    第三个DragFinish

    函数功能:Releases memory that the system allocated for use in transferring file names to the application.

    函数原型:

    //By MoreWindows-(http://blog.csdn.net/MoreWindows)

    VOIDDragFinish(HDROPhDrop);

    下面是示例程序代码,代码中有详细注释。(下载地址:http://download.csdn.net/detail/morewindows/5128654

    1. // 文件拖拽<a href="http://blog.csdn.net/morewindows/article/details/8634451">http://blog.csdn.net/morewindows/article/details/8634451</a> 
    2. //By MoreWindows-(http://blog.csdn.net/MoreWindows) 
    3. // 第一步 #include <shellapi.h> #pragma comment(lib, "shell32.lib") 
    4. // 第二步 DragAcceptFiles(hwnd, TRUE); 
    5. // 第三步 UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);拖曳文件个数 
    6. // 第四步 DragQueryFile(hDrop, i, strFileName, MAX_PATH);获得拖曳的文件名 
    7. #include "stdafx.h" 
    8. #include <vector> 
    9. #include <cstring> 
    10. usingnamespace std; 
    11.  
    12. // 文件拖拽第一步  
    13. #include <shellapi.h> 
    14. #pragma comment(lib, "shell32.lib") 
    15.  
    16. constchar szAppName[] = "文件拖拽_MoreWindows(http://blog.csdn.net/MoreWindows)"
    17.  
    18. BOOL InitApplication(HINSTANCE hinstance,int nCmdShow); 
    19. LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam); 
    20.  
    21.  
    22. int APIENTRY WinMain(HINSTANCE hInstance, 
    23.                     HINSTANCE hPrevInstance, 
    24.                      LPSTR     lpCmdLine, 
    25.                     int       nCmdShow) 
    26.     // TODO: Place code here. 
    27.     MSG     msg; 
    28.      
    29.     if (!InitApplication(hInstance, nCmdShow)) 
    30.     { 
    31.         return 0; 
    32.     } 
    33.      
    34.     while (GetMessage(&msg, NULL, 0, 0)) 
    35.     { 
    36.         TranslateMessage(&msg); 
    37.         DispatchMessage(&msg); 
    38.     } 
    39.     return msg.wParam; 
    40.     return 0; 
    41.  
    42.  
    43. BOOL InitApplication(HINSTANCE hinstance,int nCmdShow) 
    44.     HWND      hwnd; 
    45.     WNDCLASS  wndclass; 
    46.      
    47.      
    48.     wndclass.style       = CS_HREDRAW | CS_VREDRAW; 
    49.     wndclass.lpfnWndProc = WndProc; 
    50.     wndclass.cbClsExtra  = 0; 
    51.     wndclass.cbWndExtra  = 0; 
    52.     wndclass.hInstance   = 0; 
    53.     wndclass.hIcon       = LoadIcon(NULL, IDI_APPLICATION); 
    54.     wndclass.hCursor     = LoadCursor(NULL, IDC_ARROW); 
    55.     wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    56.     wndclass.lpszMenuName  = NULL; 
    57.     wndclass.lpszClassName = szAppName; 
    58.      
    59.     if (!RegisterClass(&wndclass)) 
    60.     { 
    61.         MessageBox(NULL, "Program Need Windows NT!", szAppName, MB_ICONERROR); 
    62.         return FALSE; 
    63.     } 
    64.      
    65.     hwnd = CreateWindow(szAppName,  
    66.         szAppName, 
    67.         WS_OVERLAPPEDWINDOW, 
    68.         CW_USEDEFAULT, 
    69.         CW_USEDEFAULT, 
    70.         CW_USEDEFAULT, 
    71.         CW_USEDEFAULT, 
    72.         NULL,  
    73.         NULL, 
    74.         hinstance, 
    75.         NULL); 
    76.      
    77.     if (hwnd == NULL) 
    78.         return FALSE; 
    79.      
    80.     ShowWindow(hwnd, nCmdShow); 
    81.     UpdateWindow(hwnd); 
    82.      
    83.     return TRUE; 
    84.  
    85.  
    86. LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam) 
    87.     static vector<string> s_vetFileNames; 
    88.  
    89.  
    90.     switch (message) 
    91.     { 
    92.     case WM_CREATE: 
    93.         // 文件拖拽第二步   DragAcceptFiles 
    94.         DragAcceptFiles(hwnd, TRUE); 
    95.         return 0; 
    96.  
    97.  
    98.         // 文件拖拽第三步 DragQueryFile and DragQueryFile 
    99.     case WM_DROPFILES: 
    100.         { 
    101.             HDROP hDrop = (HDROP)wParam; 
    102.             UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); // 拖拽文件个数 
    103.             char strFileName[MAX_PATH]; 
    104.             for (int i = 0; i < nFileNum; i++)   
    105.             { 
    106.                 DragQueryFile(hDrop, i, strFileName, MAX_PATH);//获得拖曳的文件名 
    107.                 s_vetFileNames.push_back(strFileName); 
    108.                  
    109.             } 
    110.             DragFinish(hDrop);     //释放hDrop 
    111.      
    112.             InvalidateRect(hwnd, NULL, TRUE); 
    113.         } 
    114.         return 0; 
    115.  
    116.  
    117.     case WM_PAINT: 
    118.         { 
    119.             HDC             hdc; 
    120.             PAINTSTRUCT     ps; 
    121.             vector<string>::iterator pos; 
    122.             int i, y; 
    123.             hdc = BeginPaint(hwnd, &ps); 
    124.          
    125.             // 显示拖拽的文件名 
    126.             y = 0; 
    127.             for (pos = s_vetFileNames.begin(); pos != s_vetFileNames.end(); pos++) 
    128.             { 
    129.                 TextOut(hdc, 20, y, pos->c_str(), strlen(pos->c_str())); 
    130.                 y += 30; 
    131.             } 
    132.             EndPaint(hwnd, &ps); 
    133.         } 
    134.         return 0; 
    135.  
    136.     case WM_DESTROY: 
    137.         PostQuitMessage(0); 
    138.         return 0; 
    139.     } 
    140.     return DefWindowProc(hwnd, message, wParam, lParam); 


    运行结果截图如下,在桌面上选取了几个快捷方式然后拖到程序窗口中:

    通过本文,可以看出要为程序添加文件拖拽(文件拖放)功能,只要四步即可。

    第一步 

    #include <shellapi.h> #pragma comment(lib, "shell32.lib")

    第二步

    DragAcceptFiles(hwnd, TRUE);

    第三步

    UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);拖曳文件个数

    第四步

    DragQueryFile(hDrop, i, strFileName, MAX_PATH);获得拖曳的文件名

    欢迎继续参考《Windows界面编程第八篇 listbox彩色显示隔行变色

  • 相关阅读:
    云小课|MRS基础原理之Oozie任务调度
    Java:既然有了synchronized,为什么还要提供Lock?
    云小课|MRS基础原理之CarbonData入门
    Workflow,要不要了解一下
    软件要想做的好,测试必定少不了
    什么是ForkJoin?看这一篇就能掌握!
    手把手教你从安装CentOS7.4镜像开始,搭建IoT视频监控系统
    案例解读华为隐私计算产品TICS如何实现城市跨部门数据隐私计算
    13个QA带你了解线上压测的知识点
    云小课|MRS基础原理之Hudi介绍
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589192.html
Copyright © 2020-2023  润新知