CEDIT與CLIST控件拖拽功能

文章原文地址是:http://blog.csdn.net/starlee/archive/2007/01/03/1472710.aspx

我只是摘抄。

 

 現在有很多軟件都支持拖拽功能,就是用鼠標拖着文件放到軟件窗口中某個位置,軟件就可以做出相應的反應。比如,Windows自帶的播放軟件Windows Media Player,你可以拖着一個媒體文件放到它的主窗口中,它就會開始播放這個文件。
    怎麼讓自己的軟件也有這個功能呢?
    其實,並不是很難,只要讓你需要有拖拽功能的控件響應WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件爲例子來說明。
    首先,從CEdit繼承,自定義一個Edit控件。在頭文件添加如下的消息響應函數:

afx_msg void OnDropFiles(HDROP hDropInfo);     然後,在cpp文件中的消息映射中添加:

ON_WM_DROPFILES()    最後,在cpp文件中添加OnDropFiles函數的實現,對拖拽的文件進行處理。下面是完整的代碼:

// lxEdit.h

class ClxEdit : public CEdit
{
    DECLARE_DYNAMIC(ClxEdit)

public:
    ClxEdit();
    virtual ~ClxEdit();

    afx_msg void OnDropFiles(HDROP hDropInfo);

protected:
    DECLARE_MESSAGE_MAP()
};

// lxEdit.cpp

#include "stdafx.h"
#include "lxEdit.h"

IMPLEMENT_DYNAMIC(ClxEdit, CEdit)
ClxEdit::ClxEdit()
{ }

ClxEdit::~ClxEdit()
{ }

BEGIN_MESSAGE_MAP(ClxEdit, CEdit)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

void ClxEdit::OnDropFiles(HDROP hDropInfo)
{
    // 被拖拽的文件的文件名
    char szFileName[MAX_PATH + 1];
    // 得到被拖拽的文件名
    DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH);
    // 把文件名顯示出來
    SetWindowText(szFileName);

    CEdit::OnDropFiles(hDropInfo);
}    可以看到,在上面的代碼中,得到拖拽文件名的是函數DragQueryFile。這是Windows提供的一個API函數,用來得到一次成功的拖拽操作中的文件名。下面是該函數的原型:

// 參數說明:
// hDrop 句柄,由消息傳入。
// iFile 文件索引。
//         如果該參數值爲0xFFFFFFFF,函數返回拖拽操作中的文件數量。
//         如果該參數值爲0到拖拽文件數量之間的數值,函數將對應索引的文件名拷貝到參數lpszFile所指的字符串內。
// lpszFile 存放文件名的字符串。如果該參數爲NULL,函數返回需要的字符串長度。
// cch 存放文件名的字符串的長度。

UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);    從上面對函數參數的說明可以看出,該函數支持一次多選多個文件。就像Windows Media Player一樣,一次多選好幾個文件拖拽到它的窗口中,它就會按順序播放文件。下面我就用一個有拖拽功能的ListBox爲例,說明怎麼處理一次拖拽多個文件。

// lxListBox.h

class ClxListBox : public CListBox
{
    DECLARE_DYNAMIC(ClxListBox)

public:
    ClxListBox();
    virtual ~ClxListBox();

    afx_msg void OnDropFiles(HDROP hDropInfo);

protected:
    DECLARE_MESSAGE_MAP()   
};

// lxListBox.cpp

#include "stdafx.h"
#include "lxListBox.h"

IMPLEMENT_DYNAMIC(ClxListBox, CListBox)
ClxListBox::ClxListBox()
{ }

ClxListBox::~ClxListBox()
{ }

BEGIN_MESSAGE_MAP(ClxListBox, CListBox)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

void ClxListBox::OnDropFiles(HDROP hDropInfo)
{
    char szFileName[MAX_PATH];
    int iFileNumber;

    // 得到拖拽操作中的文件個數
    iFileNumber = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
    for (int i = 0; i < iFileNumber; i++)
    {
        // 得到每個文件名
        DragQueryFile(hDropInfo, i, szFileName, MAX_PATH);

        if (FindString(0, szFileName) != LB_ERR)
            continue;

        // 把文件名添加到list中
        AddString(szFileName);
    }

    CListBox::OnDropFiles(hDropInfo);
}   

 

注意:函數DragQueryFile得到的文件名,是帶完整路徑的文件名。
提醒:要想你的控件具有拖拽功能,一定要把它的Accept Files屬性設置爲True!

否則,上面寫的那些代碼是不起作用的!

 

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/starlee/archive/2007/01/03/1472710.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章