我正在使用MFC进行应用程序。我刚刚创建了一个派生自CEdit的类,因此我可以拦截OnChar()并进行数据验证。如何用我创建的派生控件替换我的应用程序中的编辑控件?
答案 0 :(得分:1)
不使用GetDlgItem
!!
GetDlgItem()
返回CWnd
- 指针,没有别的。这意味着您有一个切片CMyCustomEdit
指针。当然,它适用于您的方法向基础HWND
发送消息的所有情况。但那只是纯粹的运气!您可以详细了解问题here。
正确的解决方案是使用DDX_Control对您的编辑控件进行子类化。
答案 1 :(得分:1)
我找到了解决方案。我之所以遇到这么困难的原因是因为我没有使用类向导创建新类,使事情变得非常复杂。如果只是使用类向导,则可以选择将控制变量添加到派生类中,就像它们是常规类一样,只要基类是元素的正确类。但这不是必需的。您所要做的就是创建一个指向派生类类型的指针并投射您想要获得的项目,就像您通常使用非派生类一样。
使用从CEdit派生的类
访问编辑控件的示例CMyCustomEdit * editPtr = (CMyCustomEdit*)GetDlgItem(IDC_EDIT1);
如下面另一位成员所述(感谢您),使用GetDlgItem并不是一个好主意。实际上,在我的代码中,我最终对它进行了子类化,因此我可以将我的新类与我已经存在的编辑控件一起使用。如前所述,我不明白编辑控件不一定附加到CEdit,所以上面的例子应该清楚地说明你的IDC_EDIT可以用作CMyCustomEdit以及CWnd等等;只要你用正确的类引用它,它就会自然地表现出来。
现在进行子类化。如果您真的想让Edit Control始终在基类之前调用派生类,则必须使其成为子类。不要将它视为面向对象的概念,这只是消息(如WN_CHAR)将首先通过派生类,然后调用基类。
在编辑控件上对CMyCustomEdit进行子类化的示例:
首先,您需要在对话框的.cpp和.h中包含新类的.h文件。那些通常与您的项目同名的那些。这将是MyMainDialog。
#include "CMyCustomEdit.h"
在派生的对话框类中包含新派生类类型的变量:
class MyMainDialog : public CDialogEx
{
protected:
CMyCustomEdit m_cmCEdit;
}
然后在派生对话框类(MyMainDialog)的OnInitDialog()子类中编辑控件。为安全起见,请在函数中的常规代码之后和返回之前添加(通常):
m_cmCEdit.SubclassDlgItem(IDC_EDIT1, this);
完成此操作后,当您使用ID IDC_EDIT1在Edit Control中执行任何操作时,消息将在转到CEdit之前通过CMyCustomEdit。当您需要覆盖基类中的消息时,这通常是必需的。
希望它可以帮助任何有类似问题的人。