鱼C论坛

 找回密码
 立即注册
查看: 160|回复: 13

[已解决]关于mfc中CeditVew主框中的类指针怎样弄到其它类中

[复制链接]
发表于 2024-10-7 16:50:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问大家一下我在mfc里面,定义我的视图类,继承自Cdeitview,
01.png
获取视图的文本

然而我再新建一个类
02.png
再这样
Editview的指针就不是this指针了
是空
请问一个怎么才能变成this指针呀
04.png

这个是前面定义的 ! 03.png
后面我再新建一个类
继承关系
05.png
最佳答案
2024-10-7 16:50:51
在 MFC 中,如果你需要在其他类中访问 `CEditView` 的指针,可以通过消息传递或获取视图的指针来实现。以下是一些常见的方法:

1. **通过文档类:**
   - 如果你的应用程序采用了文档/视图结构,可以通过文档来访问视图。首先,在文档类中保存视图的指针。
   - 在视图类中,通过 `GetDocument()` 函数从文档中获取视图指针。

2. **全局变量:**
   - 不推荐使用,但如果项目较小,可以将视图指针保存在全局变量中。这样在其他地方也能直接访问。

3. **单例模式:**
   - 设计一个单例类来存储和访问你的视图指针。这样确保全局只有一个访问入口。

4. **消息传递:**
   - 使用 Windows 消息传递机制将指针发送到其他类。例如,可以通过 `PostMessage` 或 `SendMessage` 向窗口发送消息,并在消息处理中接收指针。

5. **通过 Application 类:**
   - 在应用程序类中(通常是 `CWinApp` 的子类)添加一个成员变量来保存指向视图的指针,这样可以在其他类中通过应用程序对象来访问。

选择适合你应用结构的方法,确保设计合理且易于维护。例如,在文档/视图架构中,首选通过文档来获取视图指针,这样能保持代码的模块化和可维护性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-7 16:50:51 | 显示全部楼层    本楼为最佳答案   
在 MFC 中,如果你需要在其他类中访问 `CEditView` 的指针,可以通过消息传递或获取视图的指针来实现。以下是一些常见的方法:

1. **通过文档类:**
   - 如果你的应用程序采用了文档/视图结构,可以通过文档来访问视图。首先,在文档类中保存视图的指针。
   - 在视图类中,通过 `GetDocument()` 函数从文档中获取视图指针。

2. **全局变量:**
   - 不推荐使用,但如果项目较小,可以将视图指针保存在全局变量中。这样在其他地方也能直接访问。

3. **单例模式:**
   - 设计一个单例类来存储和访问你的视图指针。这样确保全局只有一个访问入口。

4. **消息传递:**
   - 使用 Windows 消息传递机制将指针发送到其他类。例如,可以通过 `PostMessage` 或 `SendMessage` 向窗口发送消息,并在消息处理中接收指针。

5. **通过 Application 类:**
   - 在应用程序类中(通常是 `CWinApp` 的子类)添加一个成员变量来保存指向视图的指针,这样可以在其他类中通过应用程序对象来访问。

选择适合你应用结构的方法,确保设计合理且易于维护。例如,在文档/视图架构中,首选通过文档来获取视图指针,这样能保持代码的模块化和可维护性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 11:47:57 | 显示全部楼层
这样写也不对呀,得到的只是窗口标题,后面我全部使用的CeditView
01.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-8 11:48:06 | 显示全部楼层
janeyjhon 发表于 2024-10-08 11:47
这样写也不对呀,得到的只是窗口标题,后面我全部使用 ...


看起来你遇到的问题可能是访问视图中的文本内容。`CEditView` 中封装了一个 `CEdit` 控件,你可以使用它来获取或设置文本。以下是如何获取 `CEditView` 文本的步骤:

1. **获取文本内容**:
CString text;
   // 假设 pEditView 是指向 CEditView 的指针
   CEdit& editCtrl = pEditView->GetEditCtrl();
   editCtrl.GetWindowText(text);

2. **确保指针有效**:
   - 确保 `pEditView` 指针在使用前已经正确初始化并指向正确的 `CEditView` 对象。

3. **视图之间的通信**:
   - 使用文档类在不同视图之间通信,这样可以通过文档类获取指向视图的指针。
   - 使用 `POSITION` 和 `GetFirstViewPosition` 等方法遍历视图。

以下是一个小示例,在文档类中获取视图的文本:
void CMyDoc::GetTextFromEditView()
{
    POSITION pos = GetFirstViewPosition();
    while (pos != NULL)
    {
        CMyEditView* pView = DYNAMIC_DOWNCAST(CMyEditView, GetNextView(pos));
        if (pView != NULL)
        {
            CString text;
            CEdit& editCtrl = pView->GetEditCtrl();
            editCtrl.GetWindowText(text);
            AfxMessageBox(text); // 示例中只是显示获取的文本
        }
    }
}

确保正确获取和遍历视图,使用合适的类型转换和验证,使指针的使用能切实指向 `CEditView` 实例。如果问题仍然存在,可以仔细检查指针传递和类的初始化过程。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 16:09:28 | 显示全部楼层
FishC 发表于 2024-10-8 11:48
看起来你遇到的问题可能是访问视图中的文本内容。`CEditView` 中封装了一个 `CEdit` 控件,你可以使用 ...

我现在的问题是这个类是主框架中的类
991.png
class CMFCApplication1View
后面用的都是EditView获取内容,无法在其它自己建的类中得到在class CMFCApplication1View类中EditView指针,也就是无法实例化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 16:10:07 | 显示全部楼层
因为这个类是主框中的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 16:10:43 | 显示全部楼层
不知道您明白我说的意思没
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 16:11:26 | 显示全部楼层
能写上代码怎么得到这个在class CMFCApplication1View类中EditView指针的指向吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 16:12:53 | 显示全部楼层
在其它类中,CEditView指向为空,但是在class CMFCApplication1View类中EditView指针他的指针有hwd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-8 16:20:54 | 显示全部楼层
janeyjhon 发表于 2024-10-08 16:09
我现在的问题是这个类是主框架中的类

class CMFCAp ...


如果你无法在其他类中直接获取 `CMFCApplication1View` 中的 `CEditView` 指针,可以尝试以下方法:

1. **通过单例模式共享指针**:

   - 可以在 `CMFCApplication1View` 类中定义一个静态成员,用于存储指向 `CEditView` 的指针,然后通过静态方法访问这个指针。

// CMFCApplication1View.h
   class CMFCApplication1View : public CEditView
   {
   public:
       static CMFCApplication1View* GetInstance();
       static void SetInstance(CMFCApplication1View* instance);

   private:
       static CMFCApplication1View* m_instance;
   };

   // CMFCApplication1View.cpp
   CMFCApplication1View* CMFCApplication1View::m_instance = nullptr;

   CMFCApplication1View* CMFCApplication1View::GetInstance()
   {
       return m_instance;
   }

   void CMFCApplication1View::SetInstance(CMFCApplication1View* instance)
   {
       m_instance = instance;
   }

   // 在视图类初始化时设置实例
   BOOL CMFCApplication1View::OnInitialUpdate()
   {
       CEditView::OnInitialUpdate();
       SetInstance(this);
       // 其他初始化代码
   }

   - 在其他类中可以通过 `CMFCApplication1View::GetInstance()` 获取到视图指针。

2. **使用文档类获取视图指针**:

   - 在文档/视图结构中,可以通过文档类遍历视图来获取需要的指针。
// 假设在文档类中
   CMFCApplication1View* GetEditView()
   {
      POSITION pos = GetFirstViewPosition();
      while (pos != NULL)
      {
         CView* pView = GetNextView(pos);
         if (pView->IsKindOf(RUNTIME_CLASS(CMFCApplication1View)))
         {
             return dynamic_cast<CMFCApplication1View*>(pView);
         }
      }
      return nullptr;
   }

3. **通知和事件**:

    - 可以在视图内提供一些公共接口方法,以便其他类调用这些方法来操作视图。

无论采用哪种方法,关键在于确保指针在初始化过程中被正确存储,并提供一个访问入口以便其他类能够获取此信息。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-9 09:06:22 | 显示全部楼层
FishC 发表于 2024-10-8 16:20
如果你无法在其他类中直接获取 `CMFCApplication1View` 中的 `CEditView` 指针,可以尝试以下方法:

...

你弄的这些都行不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-9 09:06:32 | 显示全部楼层
janeyjhon 发表于 2024-10-09 09:06
你弄的这些都行不通


要在其他类中获取 `CMFCApplication1View` 类中的 `CEditView` 指针,通常的做法是确保视图实例的可访问性。以下是一种通过消息处理和查看结构获取指针的方法:

1. **在视图类中提供访问接口**:
   首先在你的视图类中提供一个公共的接口函数,用于返回 `CEditView` 的指针。

class CMFCApplication1View : public CEditView {
   public:
       CEdit* GetEditCtrl() {
           return &GetEditCtrl();
       }
   };

2. **从框架窗口获取视图指针**:
   你可以在程序的框架或应用程序类中获取当前活动视图的指针:

CFrameWnd* pFrame = (CFrameWnd*)AfxGetMainWnd();
   CMFCApplication1View* pView = (CMFCApplication1View*)pFrame->GetActiveView();

   // Now you can use pView to access the edit control:
   if (pView != nullptr) {
       CEdit* pEdit = pView->GetEditCtrl();
       // Do something with pEdit
   }

3. **在你的新类中使用这个方法**:
   在其他类中调用上面代码段,通过框架窗口获取视图的指针后,使用它来操作 `CEditView`。

这种方法确保你通过当前活动的框架窗口获取到视图,这样可以避免指针为空。不过,你需要确保框架窗口确实已经创建,并且视图有效。

如果框架窗口或视图还没有初始化,此时调用可能仍会导致空指针,所以要确保代码在适当时机(如应用已初始化后)调用上述操作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-9 09:21:25 | 显示全部楼层
谢谢已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-9 09:27:37 | 显示全部楼层


不客气!很高兴听到你解决了问题。如果你还有其他问题或者需要进一步的帮助,随时可以问我。祝你继续顺利编程!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 15:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表