如何为自己的消息/事件创建MFC控制寄存器?

时间:2010-02-11 14:09:05

标签: c++ mfc

我正在开发一个源自 CRichEditCtrl 的类。我希望我班上的一个实例知道:

更新:现在解决了。

  1. 当它被创建时(即HWND非空)
  2. 获得/失去焦点时
  3. 文本更改时
  4. 选择更改时
  5. 右键单击发生时
  6. (我猜通过EN_MSGFILTER)
  7. 对于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'子类'/注册?

2 个答案:

答案 0 :(得分: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

   }

答案 1 :(得分:0)

从你对早期答案的回答中,听起来很像你在对话框中有一个CRichEditCtrl。在MFC中,对话框的情况与手动创建控件不同:对话框控件(即Windows控件,而不是MFC对象)由对话框管理器创建,然后通过MFC基础结构的位耦合到MFC对象。

如您所见,在这种情况下,永远不会调用MFC Create()或CreateEx()函数。相反,对话框管理器创建控件,并通过调用SubclassDlgItem()将其附加到MFC对象。如果覆盖该功能,您会发现在对话框创建过程中调用它。

但是,处理所需内容的更简单方法是在对话框的OnInitDialog()处理程序中调用SetEventMask()。此处理程序运行以响应WM_INITDIALOG消息,该消息在创建所有Windows控件并绑定到MFC对象后立即发送。