求助关于MFC的拖拽消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助关于MFC的拖拽消息相关的知识,希望对你有一定的参考价值。

先是建立了个单文档程序,当点击某个菜单时,会响应一个对话框,此对话框上面有一个编辑框,我想实现让这个编辑框响应拖拽消息怎么办?

现在:我先建立个对话框程序,在对话框上加一个编辑框,可以实现编辑框实现拖拽消息
是的,是想把文件或文件夹拖放到EDIT里面,两位帮忙

把对话框设置了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=0; i<nFiles; i++)

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
参考技术A 有一个消息的名字叫WM_ONMOUSEMOVE 就是针对你的这个问题的,看你的要求 你可以选择在这个函数里面调用重绘窗口函数来重绘窗口以便达到你的 要求 你也可以选择用disable函数来调用窗口重绘函数(前一个隔一段时间久会重绘一次,后面的只有在你结束时才重绘窗口 都可以达到你的要求) 参考技术B 是想把文件拖放到Edit里面吗? 参考技术C 是想拖动编辑框控件移动到其他位置吗?

MFC——使窗口支持拖拽文件

步骤:

  1. 使用快捷组合键ALT+SHIFT+X调出类向导
  2. 选中号类名,消息搜索WM_DROPFILES并双击添加处理程序,如图技术图片

     

     

  3. 在添加的处理程序中使用DragQueryFile函数获取被拖拽文件的路径
    void CAddShellToolDlg::OnDropFiles(HDROP hDropInfo)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        //获取文件路径
        TCHAR szPath[MAX_PATH] = { 0 };
        DragQueryFile(hDropInfo, 0, szPath, MAX_PATH);
        //显示到控件上
        m_Edit_FilePath.SetWindowText(szPath);
    
        CDialogEx::OnDropFiles(hDropInfo);
    }

     

 

以上是关于求助关于MFC的拖拽消息的主要内容,如果未能解决你的问题,请参考以下文章

MFC——使窗口支持拖拽文件

Android自定义控件:类QQ未读消息拖拽效果

关于弹出层的拖拽,封装

通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽

MFC编程 -- 实现拖拽文件获取路径

关于消息传递时 this指针的问题 MFC高手进