【问题标题】:Using derived Class from CEdit in my DIalog在我的对话框中使用来自 CEdit 的派生类
【发布时间】:2014-08-04 15:56:53
【问题描述】:

我正在使用 MFC 做一个应用程序。我刚刚创建了一个从 CEdit 派生的类,因此我可以拦截 OnChar() 并进行数据验证。如何将应用程序中的编辑控件替换为我制作的派生控件?

【问题讨论】:

    标签: c++ mfc cedit


    【解决方案1】:

    不要使用GetDlgItem!!

    GetDlgItem() 返回一个CWnd-指针,仅此而已。这意味着您有一个切片的 CMyCustomEdit 指针。当然,它适用于您的方法向底层HWND 发送消息 的所有情况。但这只是纯粹的运气!你可以阅读更多关于这个问题here

    正确的解决方案是使用DDX_Control 子类化您的编辑控件。

    【讨论】:

    • 我实际上结束了子分类,就像你说的那样。当我问这个问题时,我实际上认为编辑控件绑定到 CEDit。然后我意识到情况并非如此,所以我提到了这一点以及如何实际使用其他类来引用它。我添加了演示如何子类的部分并澄清了一切。谢谢
    • 将 CMyCustomEdit* 转换为 CWnd* 不会对指针进行切片。您链接到的文章也不暗示,它只是声称它是丑陋和不必要的。
    【解决方案2】:

    我找到了解决方案。我之所以这么难,是因为我没有使用类向导来创建新类,使事情变得非常复杂。如果您只是使用类向导,您可以选择将控制变量添加到派生类,就像它们是常规类一样,只要基类是您元素的正确类。不过,这不是必需的。您所要做的就是创建一个派生类类型的指针并转换您想要获取的项目,就像您通常对非派生类所做的那样。

    使用派生自 CEdit 的类访问编辑控件的示例

    CMyCustomEdit * editPtr = (CMyCustomEdit*)GetDlgItem(IDC_EDIT1);
    

    正如另一位成员在下面提到的(谢谢),使用 GetDlgItem 不是一个好主意。实际上,在我的代码中,我最终对它进行了子类化,因此我可以将我的新类与我已经存在的编辑控件一起使用。如前所述,我不明白编辑控件不一定附加到 CEdit,因此上面的示例应该清楚地表明您的 IDC_EDIT 可以用作 CMyCustomEdit 以及 CWnd 等等;只要您使用正确的类引用它,它就会自然地运行。

    现在进行子分类。如果你真的想让你的编辑控件总是在你的基类之前调用​​你的派生类,你必须使它成为一个子类。不要将其视为面向对象的概念,这只是消息(如 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 的编辑控件中执行任何操作时,消息将通过 CMyCustomEdit,然后再转到 CEdit。当您需要覆盖来自基类的消息时,这通常是必要的。

    希望对有类似问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 2015-09-23
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多