MFC 编辑控件 - WM_DROPFILES 用于拖放的消息寄存器
MFC Edit control - WM_DROPFILES message register for drag and drop
根据 this article,要允许仅在目标上放置,我们必须
Use SubclassDlgItem() to re-route that one message to the dialog object so that all of the handling can be done there.
先生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
...
但是我不明白为什么Edit控件(CEdit)在属性window(Visual Studio资源视图)中有Accept Files,但是不能为自己注册消息 WM_DROPFILES 而不必创建一个继承的 class (或者它可以,但我还不知道)。
我看到我们可以通过以下代码注册按钮的点击消息
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?
答案是:没有。
ON_BN_CLICKED 宏映射一个成员函数来处理通过 WM_COMMAND 发送的 BN_CLICKED 通知 消息。通知被发送到控件的父级(尽管 MFC 也有一个 "reflection" 机制将通知转发到控件)。
WM_DROPFILES 是一般的 Windows 消息,而不是通知,仅此而已:如果你想处理它,那么你必须从 CEdit 派生.
另请参阅:
根据 this article,要允许仅在目标上放置,我们必须
Use SubclassDlgItem() to re-route that one message to the dialog object so that all of the handling can be done there.
先生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
...
但是我不明白为什么Edit控件(CEdit)在属性window(Visual Studio资源视图)中有Accept Files,但是不能为自己注册消息 WM_DROPFILES 而不必创建一个继承的 class (或者它可以,但我还不知道)。
我看到我们可以通过以下代码注册按钮的点击消息
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?
答案是:没有。 ON_BN_CLICKED 宏映射一个成员函数来处理通过 WM_COMMAND 发送的 BN_CLICKED 通知 消息。通知被发送到控件的父级(尽管 MFC 也有一个 "reflection" 机制将通知转发到控件)。 WM_DROPFILES 是一般的 Windows 消息,而不是通知,仅此而已:如果你想处理它,那么你必须从 CEdit 派生.
另请参阅: