• ListCtrl接受拖动文件


    【引言】

         拖放操作在电脑中很常用,例如我们经常复制文件就可以按住ctrl键不放,然后再拖到另外一个窗口中,或者,可以把一个WORD文档直接拖动到WORD窗口即可打开,以前我使用过VB,里面直接有OleDragDrop事件,进行相应处理即可。那么如何在VC++中通过编程实现该功能呢,这就是本文要介绍的。

         下面我来具体实现ListCtrl接受拖动文件的方法, 功能: “把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候,会把文件夹或者文档相对应的路径插入到ListCtrl中”

    【实现】

         具体做法如下:新建一个mfc对话框工程,取名为ListCtrlDrag; 用ClassWizard类向导新建一个类,取名为CMyListCtrl,基类为CListCtrl。

    1

          然后在类向导中切换到Message Maps选项卡,选择刚才建立的CMyListCtrl类,为WM_DROPFILES添加消息处理函数(实现拖放的关键也就在这里)

    2

          在OnDropFiles函数中实现ListCtrl对拖放操作的响应

    void CMyListCtrl::OnDropFiles(HDROP hDropInfo) 
    {
        // TODO: Add your message handler code here and/or call default
         char szFilePathName[_MAX_PATH+1]    =    {0};      
         
             //得到文件个数      
         UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);   
         
         for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex) 
         {   
             // 得到文件名   
             DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH);   
            
             //获取ListCtrl已经存在的项数
             int nCnt = this->GetItemCount();
            
             //插入文本
             LVITEM lvi = {0};
             lvi.mask =   LVIF_TEXT ;
             lvi.iItem = nCnt;
             lvi.iSubItem = 0;
             lvi.pszText = szFilePathName;
             this->InsertItem(&lvi);                        
         }      
         
         //完成拖放操作
         DragFinish(hDropInfo);     
    
        CListCtrl::OnDropFiles(hDropInfo);
    }

          在对话框中添加一个ListCtrl控件,然后勾选Accept files属性,如下图所示。

    3

          在CListCtrlDragDlg对话框类中给ListCtrl关联一个成员变量m_MyListCtrl, 类型就是派生自CListCtrl;

    class CListCtrlDragDlg : public CDialog
    {
    // Construction
    public:
        CListCtrlDragDlg(CWnd* pParent = NULL);    // standard constructor
    
    // Dialog Data
        //{{AFX_DATA(CListCtrlDragDlg)
        enum { IDD = IDD_LISTCTRLDRAG_DIALOG };
        CMyListCtrl    m_MyListCtrl;
        //}}AFX_DATA
    
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CListCtrlDragDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        //}}AFX_VIRTUAL

       

          在CListCtrlDragDlg对话框的初始化函数中初始化ListCtrl控件

    BOOL CListCtrlDragDlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
    
        // Add "About..." menu item to system menu.
    
        // IDM_ABOUTBOX must be in the system command range.
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);
    
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
            CString strAboutMenu;
            strAboutMenu.LoadString(IDS_ABOUTBOX);
            if (!strAboutMenu.IsEmpty())
            {
                pSysMenu->AppendMenu(MF_SEPARATOR);
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
        }
    
        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);            // Set big icon
        SetIcon(m_hIcon, FALSE);        // Set small icon
        
        // TODO: Add extra initialization here
        m_MyListCtrl.InsertColumn( 0, "文件名称", LVCFMT_LEFT, 100 );//插入列
    
        return TRUE;  // return TRUE  unless you set the focus to a control
    }

         运行程序,把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候, 会把文件夹或者文档相对应的路径插入到ListCtrl中,如下图所示:

    1

  • 相关阅读:
    Move Zeroes
    Intersection of Two Arrays II
    Intersection of Two Arrays
    Create Maximum Number
    Leetcode version 2
    JDBC学习笔记
    九章算法基础班
    九章算法强化班
    LeetCode
    Amazon High Frequent 9 problems
  • 原文地址:https://www.cnblogs.com/xydblog/p/3475586.html
Copyright © 2020-2023  润新知