檔案拖拽功能視窗實現
阿新 • • 發佈:2019-01-05
今天在使用迅雷軟體播放影片時,覺得這個拖拽播放的功能還不錯,想著自己能否實現一個具備檔案拖拽功能的視窗呢,查看了下MSDN,原來視窗接受檔案需要處理WM_DROPFILES訊息。
- WM_DROPFILES訊息
MSDN中訊息的語法:
PostMessage( (HWND) hWndControl, // handle to destination control (UINT) WM_DROPFILES, // message ID (WPARAM) wParam, // = (WPARAM) (HDROP) hDrop; (LPARAM) lParam // = 0; not used, must be zero );
引數介紹如下所示
hDrop
A handle to an internal structure describing the dropped files. Pass this handle DragFinish, DragQueryFile, or DragQueryPoint to retrieve information about the dropped files.
lParam
Must be zero.
- CEdit接收檔案
首先定義一個CAcceptFileEdit
繼承於CEdilt,處理WM_DROPFILES訊息,設定CAcceptFileEdit 控制元件 Accept Files屬性設定為TRUE,這點特別重要,否則,以下程式碼無效 - AcceptFileEdit.h
//
#pragma once
// CAcceptFileEdit
class CAcceptFileEdit : public CEdit
{
DECLARE_DYNAMIC(CAcceptFileEdit)
public:
CAcceptFileEdit();
virtual ~CAcceptFileEdit();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDropFiles(HDROP hDropInfo);
};
- AcceptFileEdit.cpp
#include "AcceptFileEdit.h"
// CAcceptFileEdit
IMPLEMENT_DYNAMIC(CAcceptFileEdit, CEdit)
CAcceptFileEdit::CAcceptFileEdit()
{
}
CAcceptFileEdit::~CAcceptFileEdit()
{
}
BEGIN_MESSAGE_MAP(CAcceptFileEdit, CEdit)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
// CAcceptFileEdit message handlers
void CAcceptFileEdit::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
// 被拖拽的檔案的檔名
wchar_t szFileName[MAX_PATH + 1];
// 得到被拖拽的檔名
DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH);
// 把檔名顯示出來
SetWindowText(szFileName);
CEdit::OnDropFiles(hDropInfo);
}
具備接收拖拽檔案的編輯框類就定義好了,這樣就可以順利的拖拽一個檔案到編輯框了。具體就不展示效果了。
- CListBox接收檔案
- DragFileListBox .h
#pragma once
// CDragFileListBox
class CDragFileListBox : public CListBox
{
DECLARE_DYNAMIC(CDragFileListBox)
public:
CDragFileListBox();
virtual ~CDragFileListBox();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDropFiles(HDROP hDropInfo);
};
- DragFileListBox .cpp
#include "DragFileListBox.h"
// CDragFileListBox
IMPLEMENT_DYNAMIC(CDragFileListBox, CListBox)
CDragFileListBox::CDragFileListBox()
{
}
CDragFileListBox::~CDragFileListBox()
{
}
BEGIN_MESSAGE_MAP(CDragFileListBox, CListBox)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
// CDragFileListBox message handlers
void CDragFileListBox::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
//獲取檔案的個數
int nFileNum = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
for (int i = 0; i < nFileNum; i++)
{
wchar_t strFileName[MAX_PATH] = { 0 };
int nres = DragQueryFile(hDropInfo, i, strFileName, MAX_PATH);
if (!this->FindString(0, strFileName))
{
continue;
}
this->AddString(strFileName);
}
CListBox::OnDropFiles(hDropInfo);
}
- 總結
以上為藉助CEdit和CListBox類實現兩個可接受檔案拖拽的類,實現檔案拖拽功能控制元件,必須實現WM_DROPFILES 訊息,同時控制元件必須設定Accept Files 屬性為TRUE。