【问题标题】:Drag file on dialog with MFC使用 MFC 在对话框中拖动文件
【发布时间】:2017-03-13 02:54:38
【问题描述】:

我想在对话框中拖动文件并获取文件的路径。 所以我搜索了网页并尝试了。

MyDlg.cpp

KmCdmMakeMultiProjectDlg::KmCdmMakeMultiProjectDlg(CWnd* pParent)
: CDialog (KmCdmMakeMultiProjectDlg::IDD, pParent)
{
}

void KmCdmMakeMultiProjectDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_MULTIPART, lst_AddList);
    DDX_Control(pDX, IDC_BTN_ADD_PROJECT, btn_AddList);
    DDX_Control(pDX, IDC_BTN_ADDLIST_CSV, btn_AddList_CSV);
    DDX_Control(pDX, IDC_BTN_DEL_PROJECT, btn_DelList);
    DDX_Control(pDX, IDC_BTN_TARGET_SELECT, btn_ReferFolder);
    DDX_Control(pDX, IDC_BTN_FILE_SELECT, btn_ReferCSV);
    DDX_Control(pDX, IDC_BTN_EXECUTE, btn_Execute);
    DDX_Control(pDX, IDC_BTN_EDIT_NAME, btn_EditName);
    DDX_Control(pDX, IDC_BTN_EDIT_DESCRIPTION, btn_EditDescription);
    DDX_Control(pDX, ID_CLOSE, btn_Close);
}

BEGIN_MESSAGE_MAP(KmCdmMakeMultiProjectDlg, CDialog)
    ON_BN_CLICKED(IDC_BTN_ADD_PROJECT, &KmCdmMakeMultiProjectDlg::AddList)
    ON_BN_CLICKED(IDC_BTN_ADDLIST_CSV, &KmCdmMakeMultiProjectDlg::AddListCSV)
    ON_BN_CLICKED(IDC_BTN_DEL_PROJECT, &KmCdmMakeMultiProjectDlg::DelList)
    ON_BN_CLICKED(IDC_BTN_TARGET_SELECT, &KmCdmMakeMultiProjectDlg::SelectPath)
    ON_BN_CLICKED(IDC_BTN_FILE_SELECT, &KmCdmMakeMultiProjectDlg::SelectCSV)
    ON_BN_CLICKED(IDC_BTN_EXECUTE, &KmCdmMakeMultiProjectDlg::MakeExecute)
    ON_BN_CLICKED(IDC_BTN_EDIT_NAME, &KmCdmMakeMultiProjectDlg::EditName)
    ON_BN_CLICKED(IDC_BTN_EDIT_DESCRIPTION, &KmCdmMakeMultiProjectDlg::EditDescription)
    ON_BN_CLICKED(ID_CLOSE, &KmCdmMakeMultiProjectDlg::CloseDialog)
    ON_WM_DROPFILES()
END_MESSAGE_MAP()

BOOL KmCdmMakeMultiProjectDlg::OnInitDialog() 
{   
    CDialog::OnInitDialog();
    CDialog::DragAcceptFiles();
}

void KmCdmMakeMultiProjectDlg::OnDropFiles(HDROP hDropInfo)
{
    CString csfile = "Why don't come this break point!";
    CDialog::OnDropFiles(hDropInfo);
}

我认为这并不难。 只需在对话框中设置消息“ON_WM_DROPFILES()”, 并设置“CDialog::DragAcceptFiles();”在对话框的 OnInitDialog() 方法中。

如果我在对话框上拖动文件,我预计 OnDropFiles(HDROP hDropInfo) 是道路。 我已经使用调试模式进行了测试,并在 OnDropFiles 方法中检查了断点。 但是即使我删除了一个文件也没有发生任何事情。

你有什么想法吗,等待你的教导。 谢谢。

【问题讨论】:

  • 你在拖什么
  • Mark Ransom // C:\中的csv文件

标签: c++ mfc


【解决方案1】:

如果应用程序以管理员身份运行,必须在 DragAcceptFiles() 之前包含这 2 行;

例如。

BOOL KmCdmMakeMultiProjectDlg::OnInitDialog() 
{   
    CDialog::OnInitDialog();
    ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
    CDialog::DragAcceptFiles();
}

点是 ChangeWindowMessageFilter。

谢谢。

【讨论】:

  • 有一个原因 Microsoft 不会让管理员程序接受来自非管理员来源的输入。绕过它会招来麻烦。最好的办法是让您的应用不需要管理员权限。
【解决方案2】:

在 C++ 一个 C 的名称中,不要使用 ChangeWindowMessageFilter。 这涉及特权隔离 (UIPI) 消息过滤器,与拖放支持无关。

您必须为任何将通过处理 WM_DROPFILES 消息来接受拖放的 windows 对象调用 DragAcceptFiles。 必须在对象附加到窗口时调用它(有效的 m_hWnd)

【讨论】:

  • 如果您查看OnInitDialog,您会发现对DragAcceptFiles 的调用。
  • DragAcceptFiles 不包含在 Visual Studio 生成的代码中。这只是 SDI/MDI 生成代码的应用程序类中的注释建议。
  • 如果您的意思是user5949771显示的代码,很抱歉,由于某种原因我错过了。
  • 我的意思是问题中的代码!该代码经过高度编辑,但也是原始版本。
  • 不知道为什么错过了,谢谢指点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多