MFC:我们可以扩展CEditView中存在的CEdit控件类行为吗

时间:2018-08-21 10:58:42

标签: c++ mfc

我阅读了一些有关MFC的基础知识,我正在尝试使用CEditView实现简单的编辑器。如果我当前的理解有误,请更正。

CEditView只是一个视图,实际上不会在其中放置任何控件。

  1. CEditView只是用户可以查看和输入文字的区域。
  2. 明确不需要在视图上放置任何CEdit控件(例如 我们将CEdit控件放在CDialogView上)。
  3. CEdit控件只是CEditView.(GetEditCtrl())的成员。

当前CEdit提供了许多与编辑相关的功能。如果我想扩展该CEdit成员类,可以这样做吗?就像这样:

Class CMyEdit : public CEdit

从MSDN:

  

分两步构造一个CEdit对象。首先,呼叫CEdit   构造函数,然后调用Create,这将创建Windows编辑   控制并将其附加到CEdit对象。

我创建了虚拟构造函数:

CMyEdit::CMyEdit
{

}

此后,我打电话给Create

virtual BOOL Create(
    DWORD dwStyle,  
    const RECT& rect,  
    CWnd* pParentWnd,  
    UINT nID);

   //Here I have given dummy CRect and dummy Control ID that is 1;
   myEdit->Create(ES_MULTILINE | WS_CHILD | 
                  WS_VISIBLE | WS_TABSTOP | 
                  WS_BORDER,CRect(10, 10, 100, 100), this, 1);

如果创建并运行程序,则CEdit控件将进入CEditView。但是我不希望将物理控制应用于CEditView

我们需要在这里创建方法吗?不知道如何在不创建控件的情况下扩展此CEdit类行为。

2 个答案:

答案 0 :(得分:1)

  1. CEditViewCEdit的视图,实际上,在CEditCEditView中有一个普通的Windows API Edit控件。 MFC正在使用这是一个小技巧。它创建了一个简单的Edit控件(因此有一个窗口句柄),但是您可以通过CView指针和CEdit指针来处理该句柄。查看代码时,您会发现GetEditCtrl只是强制转换了this指针。
  2. 创建带有CEditView的视图时,内部始终有一个CEdit / Edit control……您无法更改它。
  3. 如果您在CEditView内创建了其他控件,请确保获得新的编辑控件。
  4. 如果无法创建从CMyEditView派生而来的CView,并且其中包含CMyEdit(使用完整视图)。

最简单的方法就是将CEditView扩展到CMyEditView ...

答案 1 :(得分:-1)

尚不清楚您要修改什么行为,但是您似乎知道在MFC中可以创建自己的自定义控件。您可以在自定义控件类CMyEdit中覆盖CEdit的方法,例如OnPaint()等,并实现相同的效果。您应该阅读本教程,其中详细介绍了自定义控件,然后您将了解需要在自定义控件中覆盖哪些所有方法。