如何在不使用((CMainFrame *)AfxGetMainWnd()) - > ...的情况下访问Mainfrm成员变量状态?

时间:2013-08-05 11:48:09

标签: c++ oop mfc circular-reference

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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