У меня есть приложение MDI в MFC для изменения. Я хочу проверить значение флага, который является переменной-членом MainFrm из класса более низкого уровня. Но я не хочу получать к нему доступ, используя
Функция ‘((CMainFrame *) AfxGetMainWnd ()) -> IsFlagOn ()’, потому что для этого я должен дать mainfrm.h в классе более низкого уровня. Я как-то чувствую, что это создаст некую циркулярную ссылку позже, после прочтения этого Почему циркулярные ссылки считаются вредными?
Какие другие способы получить значение флага из класса mainfrm. Пожалуйста, руководство!
примечание: здесь иерархия классов: mainfrm-> CTestExplorerFrame-> CTestExplorerView-> CTestExplorerTreeCtrl
Я хочу проверить с самого низкого уровня флаг, к которому имеет доступ только mainfrm
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;
}
Я бы объявил (чисто виртуальный) интерфейсный класс, где у вас есть чисто виртуальный вызов, чтобы получить значение интересующего вас флага в CTestExplorerTreeCtrl. Затем MainFrame реализует этот интерфейсный класс и передает указатель на CTestExplorerTreeCtrl. Таким образом, вы можете избежать любых ссылок на класс MainFrame.