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