日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转-让你的控件也具有拖拽(drag-and-drop)功能

發(fā)布時間:2024/3/24 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转-让你的控件也具有拖拽(drag-and-drop)功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://blog.csdn.net/starlee/article/details/1472710

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

afx_msg?voidOnDropFiles(HDROP?hDropInfo);

???? 然后,在cpp文件中的消息映射中添加:

ON_WM_DROPFILES()

??? 最后,在cpp文件中添加OnDropFiles函數(shù)的實現(xiàn),對拖拽的文件進(jìn)行處理。下面是完整的代碼:

//lxEdit.h

classClxEdit?:?publicCEdit
{
????DECLARE_DYNAMIC(ClxEdit)

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

????afx_msg?voidOnDropFiles(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()

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

????CEdit::OnDropFiles(hDropInfo);
}

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

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

UINT?DragQueryFile(HDROP?hDrop,?UINT?iFile,?LPTSTR?lpszFile,?UINT?cch);

??? 從上面對函數(shù)參數(shù)的說明可以看出,該函數(shù)支持一次多選多個文件。就像Windows Media Player一樣,一次多選好幾個文件拖拽到它的窗口中,它就會按順序播放文件。下面我就用一個有拖拽功能的ListBox為例,說明怎么處理一次拖拽多個文件。

//lxListBox.h

classClxListBox?:?publicCListBox
{
????DECLARE_DYNAMIC(ClxListBox)

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

????afx_msg?voidOnDropFiles(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()

voidClxListBox::OnDropFiles(HDROP?hDropInfo)
{
????charszFileName[MAX_PATH];
????intiFileNumber;

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

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

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

????CListBox::OnDropFiles(hDropInfo);
}

??? 補充一下,函數(shù)DragQueryFile得到的文件名,是帶完整路徑的文件名。
??? 最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files屬性設(shè)置為True!要不,上面寫的那些代碼是不起作用的!

總結(jié)

以上是生活随笔為你收集整理的转-让你的控件也具有拖拽(drag-and-drop)功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。