【问题标题】:How to access Mainfrm member variable status without using ((CMainFrame*) AfxGetMainWnd ())->...?如何在不使用 ((CMainFrame*) AfxGetMainWnd ())->... 的情况下访问 Mainfrm 成员变量状态?
【发布时间】:2013-08-06 02:45:22
【问题描述】:

我在 MFC 中有一个要修改的 MDI 应用程序。我想从较低级别的类中检查一个标志的值,该标志是 MainFrm 的成员变量。但我不想使用它访问它 '((CMainFrame*) AfxGetMainWnd ())->IsFlagOn()' 类型的函数,因为为此我必须在较低级别的类中提供 mainfrm.h。在阅读此Why are circular references considered harmful? 之后,我不知何故觉得这会在以后创建一些循环引用 从 mainfrm 类中获取标志值的其他方法是什么。请指导!

注意:这里的类层次结构是 mainfrm->CTestExplorerFrame->CTestExplorerView->CTestExplorerTreeCtrl 我想从最低级别检查仅由 mainfrm 访问的标志

【问题讨论】:

  • 将主窗口存储在某个变量中?

标签: c++ oop mfc circular-reference


【解决方案1】:

我将声明一个(纯虚拟)接口类,您可以在其中进行纯虚拟调用以获取您在 CTestExplorerTreeCtrl 感兴趣的标志的值。然后MainFrame实现这个接口类,并传递一个指向CTestExplorerTreeCtrl的指针。这样您就可以避免对 MainFrame 类的任何引用。

【讨论】:

    【解决方案2】:

    AfxGetMainWnd() 返回一个 CWnd*,您可以使用它通过 Windows 消息系统与大型机进行通信。定义一条自定义消息并将这条消息发送到 CWnd*

    #define UWM_MYREQUEST (WM_APP + 2)
    
    int datatoget;
    CWnd* pMainframe = AfxGetMainWnd();
    pMainframe->SendMessage(UWM_MYREQUEST, (WPARAM)&datatoget, 0);
    

    大型机需要这样的代码来接收和处理自定义消息:

    ON_MESSAGE(UWM_MYREQUEST, OnMyRequest)

    LRESULT CMainFrame::OnMyRequest(WPARAM wparam, LPARAM lparam)
    {
     int* ptoget = (int*)wparam;
     *ptoget = m_datarequested;
      return 0;
    }
    

    【讨论】:

    • 这正是我想要的。我想过发送自定义消息,但我完全忘记了我们也可以通过它获得价值。谢谢 ScottMcP-MVP
    • 这取决于您采用什么解决方案,但使用 Windows 消息的方法并不是非常有效,与直接调用相比相当慢,您需要为每个解决方案定义自己的消息和消息处理程序要读取的数据成员。此外,它不是类型安全的,您使用的是 Windows 特定代码:)
    • 是的,这完全是真的@Clemens。我显然会考虑这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多