如何从 CDateTimeCtrl 控件的 up/down 按钮捕获 windows 消息?
How to capture windows message from the up/down button of a CDateTimeCtrl control?
我在我的对话应用程序中使用 CDateTimeCtrl
和回调字段。一切都按预期工作,但我想在单击 CDateTimeCtrl
的上下按钮(看起来很像旋转控件)但没有成功时捕获 windows 消息。 Spy++ 报告上下按钮的 class 为 msctls_updown32。 Spy++ 消息日志也没有提供任何线索。如何从这个 up-down 控件(对我来说看起来像一个 OLE 控件)捕获鼠标点击消息?
Edited: : 我试过像这样处理 UDN_DELTAPOS
消息,但仍然无法捕获来自 CMyTimeCtrl
.[=17= 的消息]
class CMyTimeCtrl : public CDateTimeCtrl
{
DECLARE_DYNAMIC(CMyTimeCtrl)
public:
CMyTimeCtrl();
virtual ~CMyTimeCtrl();
protected:
int m_msec;
DECLARE_MESSAGE_MAP()
public:
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnDtnFormat(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDtnFormatquery(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDtnWmkeydown(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult);
};
BEGIN_MESSAGE_MAP(CMyTimeCtrl, CDateTimeCtrl)
ON_NOTIFY(WM_NOTIFY, UDN_DELTAPOS, &CMyTimeCtrl::OnDeltaposSpin)
ON_NOTIFY_REFLECT(DTN_FORMAT, &CMyTimeCtrl::OnDtnFormat)
ON_NOTIFY_REFLECT(DTN_FORMATQUERY, &CMyTimeCtrl::OnDtnFormatquery)
ON_NOTIFY_REFLECT(DTN_WMKEYDOWN, &CMyTimeCtrl::OnDtnWmkeydown)
END_MESSAGE_MAP()
谢谢,在评论区的指导下我设法解决了我的问题。在消息映射中我犯了一个错误,更正如下所示。现在它工作正常。在我的资源部分,IDC_STATIC
值为 1000
:
BEGIN_MESSAGE_MAP(CMyTimeCtrl, CDateTimeCtrl)
ON_NOTIFY(UDN_DELTAPOS, IDC_STATIC, &CMyTimeCtrl::OnDeltaposSpin)
ON_NOTIFY_REFLECT(DTN_FORMAT, &CMyTimeCtrl::OnDtnFormat)
ON_NOTIFY_REFLECT(DTN_FORMATQUERY, &CMyTimeCtrl::OnDtnFormatquery)
ON_NOTIFY_REFLECT(DTN_WMKEYDOWN, &CMyTimeCtrl::OnDtnWmkeydown)
END_MESSAGE_MAP()
我在我的对话应用程序中使用 CDateTimeCtrl
和回调字段。一切都按预期工作,但我想在单击 CDateTimeCtrl
的上下按钮(看起来很像旋转控件)但没有成功时捕获 windows 消息。 Spy++ 报告上下按钮的 class 为 msctls_updown32。 Spy++ 消息日志也没有提供任何线索。如何从这个 up-down 控件(对我来说看起来像一个 OLE 控件)捕获鼠标点击消息?
Edited: : 我试过像这样处理 UDN_DELTAPOS
消息,但仍然无法捕获来自 CMyTimeCtrl
.[=17= 的消息]
class CMyTimeCtrl : public CDateTimeCtrl
{
DECLARE_DYNAMIC(CMyTimeCtrl)
public:
CMyTimeCtrl();
virtual ~CMyTimeCtrl();
protected:
int m_msec;
DECLARE_MESSAGE_MAP()
public:
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnDtnFormat(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDtnFormatquery(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDtnWmkeydown(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult);
};
BEGIN_MESSAGE_MAP(CMyTimeCtrl, CDateTimeCtrl)
ON_NOTIFY(WM_NOTIFY, UDN_DELTAPOS, &CMyTimeCtrl::OnDeltaposSpin)
ON_NOTIFY_REFLECT(DTN_FORMAT, &CMyTimeCtrl::OnDtnFormat)
ON_NOTIFY_REFLECT(DTN_FORMATQUERY, &CMyTimeCtrl::OnDtnFormatquery)
ON_NOTIFY_REFLECT(DTN_WMKEYDOWN, &CMyTimeCtrl::OnDtnWmkeydown)
END_MESSAGE_MAP()
谢谢,在评论区的指导下我设法解决了我的问题。在消息映射中我犯了一个错误,更正如下所示。现在它工作正常。在我的资源部分,IDC_STATIC
值为 1000
:
BEGIN_MESSAGE_MAP(CMyTimeCtrl, CDateTimeCtrl)
ON_NOTIFY(UDN_DELTAPOS, IDC_STATIC, &CMyTimeCtrl::OnDeltaposSpin)
ON_NOTIFY_REFLECT(DTN_FORMAT, &CMyTimeCtrl::OnDtnFormat)
ON_NOTIFY_REFLECT(DTN_FORMATQUERY, &CMyTimeCtrl::OnDtnFormatquery)
ON_NOTIFY_REFLECT(DTN_WMKEYDOWN, &CMyTimeCtrl::OnDtnWmkeydown)
END_MESSAGE_MAP()