0

根据这篇文章,要允许仅在目标上放置,我们必须

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

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

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
 ...

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

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

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

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

ON_DRAW_DROP(IDC_TXT_01, &CSimpleDlg::OnDragDrop01)//Is exist?
4

1 回答 1

0

答案是:不。 ON_BN_CLICKED宏映射一个成员函数来处理通过WM_COMMAND消息发送的BN_CLICKED通知。通知被发送到控件的父级(尽管 MFC 也有一个“反射”机制将通知转发给控件)。 WM_DROPFILES是一般的 Windows 消息,而不是通知,仅此而已:如果要处理它,则必须从CEdit派生。

也可以看看:

于 2017-08-08T13:12:14.787 回答