2010-02-11 20 views
0

我正在從CRichEditCtrl派生類。我想讓我的一個實例知道:如何爲自己的消息/事件創建MFC控制寄存器?

更新:現在解決它。

  1. 當它已經創建(即HWND不爲null)
  2. 在它獲得/失去焦點
  3. 當文本改變
  4. 選擇何時更改
  5. 當發生右擊時(我通過EN_MSGFILTER猜測)

對於1,我發現覆蓋PreSubclassWindow的作品 - HWND已經與CWnd關聯了。

2,3,4我想出了一部分。我可以使用ON_CONTROL_REFLECT(EN_CHANGE/EN_SETFOCUS/EN_KILLFOCUS) & ON_NOTIFY_REFLECT(EN_SELCHANGE)但是這些只有在我打電話SetEventMask(GetEventMask() |ENM_CHANGE | ENM_SELCHANGE | ENM_MOUSEEVENTS)時纔有效,並且直到課堂上有一個HWND關聯時才能調用它 - 在班級construstor中做這件事會導致問題。我看不出如何得到1.來努力解決這個問題。

我可以看到 CRichEditCtrlCreate兩個版本:

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); 
BOOL CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect,CWnd* pParentWnd, UINT nID); 

所以我添加的這些虛擬版本上我的課,把斷點上。也不曾被稱爲。這可能是由於錯過了MFC的「子類化」/註冊嗎?

回答

0

CWnd :: Create是一個虛函數。如果您重寫它並首先調用基類的(CRichEditCtrl's)Create,則可以假定Window句柄可用。

事情是這樣的:

BOOL MyEditControl::Create(
    LPCTSTR lpszClassName, 
    LPCTSTR lpszWindowName, 
    DWORD dwStyle, 
    Const RECT& rect, 
    CWnd* pParentWnd, 
    UINT nID, 
    CCreateContext* pContext) 
    { 
    CRichEditControl::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); 
    // call functions that use the window handle 

    } 
+0

試過了,看我的編輯。不起作用。但在我的.rc文件中,我有一個標準** CRichEditCtrl **,使用DDX綁定到** MyEditCtrl **。我想這隻適用於在** CRichEditCtrl **中聲明爲虛擬的方法。我還需要添加什麼? – 2010-02-11 15:43:41

+0

我有點困惑。如果Create/CreateEx從未被調用,那麼MyEditCtrl怎麼會有一個窗口句柄? – 2010-02-11 16:04:48

0

從你的迴應早先的答案,這聽起來很像你已經有了一個對話框中的CRichEditCtrl。在MFC中,對話框案例與手動創建控件不同:對話框控件(即Windows控件,而不是MFC對象)由對話框管理器創建,然後通過MFC基礎結構的各個位耦合到MFC對象。

正如你所發現的,在這種情況下MFC Create()或CreateEx()函數永遠不會被調用。相反,對話框管理器創建控件,並通過調用SubclassDlgItem()將其附加到MFC對象。如果您覆蓋該功能,則會發現在創建對話框時調用了該功能。

但是,處理所需內容的更簡單方法是將對SetEventMask()的調用置於對話框的OnInitDialog()處理函數中。此處理程序在響應WM_INITDIALOG消息時運行,該消息在所有Windows控件創建並綁定到MFC對象後立即發送。

+0

這實際上也沒有工作。我用我使用的解決方案更新了我的問題。 – 2010-02-15 10:10:32

+0

OnInitDialog是執行此操作的標準方式 - 這是每個人都可以做的。不知道爲什麼它不適合你,但它是值得試圖找出爲什麼它沒有。 – DavidK 2010-02-15 17:42:00

相關問題