我正在开发一个源自 CRichEditCtrl 的类。我希望我班上的一个实例知道:
更新:现在解决了。
对于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.努力解决这个问题。
我可以看到 CRichEditCtrl
有Create
的两个版本:
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 :(得分: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对象后立即发送。