簡體   English   中英

MFC:派生的CEdit中沒有得到EN_CHANGE消息

[英]MFC: Didn't get EN_CHANGE message within derived CEdit

我看到CEdit的行為很奇怪。 在我從CEdit控件派生的類中,我需要捕獲文本更改事件。 我通過ON_CONTROL_REFLECT_EX

class CSomeDerivedEdit : public CEdit
{
    DECLARE_DYNAMIC(CSomeDerivedEdit )
public:
    CSearchEditCtrl();

protected:
    DECLARE_MESSAGE_MAP()
    afx_msg BOOL OnEnChange();
...
};

在cpp中

IMPLEMENT_DYNAMIC(CSomeDerivedEdit , CEdit)

BEGIN_MESSAGE_MAP(CSomeDerivedEdit , CEdit)
    ON_CONTROL_REFLECT_EX(EN_CHANGE, &CSomeDerivedEdit::OnEnChange) 
END_MESSAGE_MAP()

我在某個列表控件中創建此控件作為子窗口,當我創建它並作為父窗口指針傳遞給列表控件時,一切正常,我得到了EN_CHANGE事件,但是當我作為列表控件事件的父窗口頭控件傳遞時。

m_someEdit.Create( WS_CHILDWINDOW|WS_VISIBLE, rcRect, this, IDC_EDIT); 這里一切都很好

m_someEdit.Create( WS_CHILDWINDOW|WS_VISIBLE, rcRect, GetHeaderCtrl(), IDC_EDIT); 在這里,控件創建也不錯,我看到了,但是當我輸入編輯控件時沒有調用on_control_reflect。

如果WM_COMMAND消息的接收方也在MFC中被子類化,則ON_CONTROL_REFLECT_EX只能工作。 如果它是純Windows控件而不是MFC的子類,則WM_COMMAND消息永遠不會反映到任何子級。

切記:反射有效,因為MFC首先處理父級中子級的WM_COMMAND消息,然后將其提供回子級控件。 如果未處理,則WM_COMMAND消息將在父級內部處理。 標准窗口控件不知道反射,並且總是自己處理WM_COMMAND消息。

因此,如果標頭控件不是MFC的子類,則反射將不起作用。

我認為您應該閱讀MSDN。 派生類CEdit ,應將ON_EN_CHANGE消息處理程序放在BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()宏之間。 另一方面, OnEnChange函數的聲明為:

afx_msg void OnEnChange();

不返回BOOL值。 ON_EN_CHANGE消息處理程序應該是這樣的(來自MSDN):

BEGIN_MESSAGE_MAP()
ON_EN_CHANGE(ID_OF_THIS_CONTROL,OnEnChange)
END_MESSAGE_MAP()

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM