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