MFC编辑控件 - 用于拖放的WM_DROPFILES消息寄存器

时间:2017-07-28 05:49:49

标签: mfc textbox drag-and-drop editcontrol

根据this article,要允许只在目标上投放,我们必须

  

使用SubclassDlgItem()将一条消息重新路由到对话框对象,以便可以在那里完成所有处理。

先生。 DanRollins(文章的作者)也提供了一个例子

n1.isdisjoint(n2)
n1.issubset(n2)
n2.issubset(n1)
n2.issuperset(n1)

但我不明白为什么编辑控件(CEdit)在属性窗口(Visual Studio资源视图)中有接受文件,但无法为自己注册消息WM_DROPFILES而不必创建一个继承的类(或者它可以,但我还不知道)。

我看到我们可以通过以下代码注册点击消息按钮

class CEditDropNotif : public CEdit
{
    virtual BOOL PreTranslateMessage(MSG* pMsg) {
        if ( pMsg->message == WM_DROPFILES ) {
            GetParent()->SendMessage(WM_DROPFILES, pMsg->wParam, pMsg->lParam);
            return TRUE; // eat it
        }
        return FALSE; // allow default processing
    }
};
BOOL CMyDlg::OnInitDialog()
{
 ...
    static CEditDropNotif cEd;  // must persist (usually a dlg member)
    cEd.SubclassDlgItem( IDC_EDIT1, this );
    ::DragAcceptFiles( cEd.m_hWnd, true );  // the editbox, not the dialog
 ...

有没有办法可以为拖放事件做类似的事情,比如

BEGIN_MESSAGE_MAP(CSimpleDlg, CDialogEx)
...
ON_BN_CLICKED(IDC_BTN_01, &CSimpleDlg::OnBnClickedBtn01)
END_MESSAGE_MAP()

1 个答案:

答案 0 :(得分:0)

答案是:不。 ON_BN_CLICKED 宏映射了一个成员函数,该函数处理通过 WM_COMMAND 消息发送的 BN_CLICKED 通知。通知将发送到控件的父级(尽管MFC还有一个“反射”机制,可以将通知转发给控件)。 WM_DROPFILES 是一般的Windows消息,而不是通知,所以就是这样:如果你想处理它,那么你必须从 CEdit 派生。

另见: