1. 程式人生 > >檔案拖拽功能視窗實現

檔案拖拽功能視窗實現

今天在使用迅雷軟體播放影片時,覺得這個拖拽播放的功能還不錯,想著自己能否實現一個具備檔案拖拽功能的視窗呢,查看了下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。