要让控件能够接受文件拖拽,还需要设置属性。在控件上点击右键,选择Properties->Extended Styles,点选Accept files选项
另外看下控件变量是control类型的,还是value类型的。(我想你既然是从基类继承过来的应该是control)control类型的才对.
重载:
DragAcceptFiles()
添加消息:
ON_WM_DROPFILES()
将你的dialog属性accept file 设置为true
填写重载函数:
void CdragfileDlg::OnDropFiles( HDROP hDropInfo )
{
//MessageBox(_T("ok"))
TCHAR szFileName[255]
::ZeroMemory(szFileName,255)
::DragQueryFile(hDropInfo,0,szFileName,254)
if(lstrlen(szFileName)!=0)
{
SetDlgItemText(IDC_EDIT1,szFileName)
m_strFilePath=szFileName
}
::DragFinish(hDropInfo)
}
如果是针对某一控件的话 有两种方法
重写控件函数 稍微有点麻烦
直接在函数中判断添加即可
把对话框设置了Accept Files属性,创天中文VC 汉化后是 接受文件 属性,就可以添加WM_DROPFILES消息的响应函数OnDropFiles了。
ClassWizard默认不支持该消息函数,所以需要手动添加此函数,然后在该函数中调用上述的三个API函数
要想让ClassWizard能支持WM_DROPFILES消息,方法如下:
在VC中按 Ctrl+W 呼出 MFC ClassWizard,然后到 Class info 页面的最下方
Message filter 的下拉列表中选择 Window,默认是 Dialog,然后回到 Message Maps 里 选择 你的 对话框类 ,右边就能找到WM_DROPFILES消息了,双击添加就好了。
其代码如下:
void DragDemo::OnDropFiles(HDROP hDrop)
{
// 定义一个缓冲区来存放读取的文件名信息
char szFileName[MAX_PATH + 1] = {0}
// 通过设置iFiles参数为0xFFFFFFFF,可以取得当前拖动的文件数量,
// 当设置为0xFFFFFFFF,函数间忽略后面连个参数。
UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0)
// 通过循环依次取得拖动文件的File Name信息,并把它添加到ListBox中
for(UINT i=0i<nFilesi++)
{
DragQueryFile(hDrop, i, szFileName, MAX_PATH)
m_list.AddString(szFileName)//文本控件变量
}
// 结束此次拖拽 *** 作,并释放分配的资源
DragFinish(hDrop)
}
你可以参考上面的方法
其实 edit 控件也处理 拖拽 消息 ,但是你必须 对 Cedit 类 扩展,让其支持WM_DROPFILES消息,因为 Cedit类 也是继承CWnd类
详细看
CWnd::DragAcceptFiles
void DragAcceptFiles( BOOL bAccept = TRUE )
参数: bAccept 指明是否接收拖放文件的标志。
说明:
使用CWnd指针,在应用程序的CWinApp::InitInstance函数中,在一个窗口的内部调用这个成员函数,以指明你的主窗口和所有的子窗口是否接收从Windows的文件管理器拖放的文件。
只有将bAccept参数设为TRUE并调用了DragAcceptFiles函数的窗口才将它标识为能够处理Windows的WM_DROPFILES消息。例如,在MDI应用程序中,如果在调用DragAcceptFiles函数的时候使用了CMDIFrameWnd窗口指针,则只有CMDIFrameWnd窗口得到WM_DROPFILES消息。这个消息将不会被发送到所有打开的CMDIChildWnd窗口。要使CMDIChildWnd窗口能够接收这个消息,你必须用CMDIChildWnd指针调用DragAcceptFiles函数。
要终止接收拖放文件,则调用这个成员函数并令bAccept等于FALSE。
请参阅:::DragAcceptFiles, WM_DROPFILES
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)