【引言】
拖放操作在电脑中很常用,例如我们经常复制文件就可以按住ctrl键不放,然后再拖到另外一个窗口中,或者,可以把一个WORD文档直接拖动到WORD窗口即可打开,以前我使用过VB,里面直接有OleDragDrop事件,进行相应处理即可。那么如何在VC++中通过编程实现该功能呢,这就是本文要介绍的。
下面我来具体实现ListCtrl接受拖动文件的方法, 功能: “把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候,会把文件夹或者文档相对应的路径插入到ListCtrl中”
【实现】
具体做法如下:新建一个mfc对话框工程,取名为ListCtrlDrag; 用ClassWizard类向导新建一个类,取名为CMyListCtrl,基类为CListCtrl。
然后在类向导中切换到Message Maps选项卡,选择刚才建立的CMyListCtrl类,为WM_DROPFILES添加消息处理函数(实现拖放的关键也就在这里)
在OnDropFiles函数中实现ListCtrl对拖放操作的响应
void CMyListCtrl::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
char szFilePathName[_MAX_PATH+] = {}; //得到文件个数
UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, ); for (UINT nIndex= ; nIndex< nNumOfFiles; ++nIndex)
{
// 得到文件名
DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH); //获取ListCtrl已经存在的项数
int nCnt = this->GetItemCount(); //插入文本
LVITEM lvi = {};
lvi.mask = LVIF_TEXT ;
lvi.iItem = nCnt;
lvi.iSubItem = ;
lvi.pszText = szFilePathName;
this->InsertItem(&lvi);
} //完成拖放操作
DragFinish(hDropInfo); CListCtrl::OnDropFiles(hDropInfo);
}
在对话框中添加一个ListCtrl控件,然后勾选Accept files属性,如下图所示。
在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( , "文件名称", LVCFMT_LEFT, );//插入列 return TRUE; // return TRUE unless you set the focus to a control
}
运行程序,把磁盘目录下的文档或者文件夹拖动到ListCtrl中的时候, 会把文件夹或者文档相对应的路径插入到ListCtrl中,如下图所示: