Столкнулся с такой проблемой, что нужно из Mainframe получить ссылку на объект класса наследуемого от CMDIChildWindow. Есть метод MDIGetActive, который возвращает HWND. Так вот, как по HWND или каким либо другим способом получить ссылку на сам оконный класс(естественно, это наследник от CMDIChildWindow)? Пока у меня это работает так (не судите строго, главное, что это работает): используя HWND, полученный с помощью MDIGetActive посылаю WM_COMMAND со специальным COMMAND ID, в ответ получаю ссылку на объект(return (long) this; ). Просто и работает, но, наверное, можно сделать куда более элегантнее и правильнее, с точки зрения MDI архитектуры. Подскажите, пожалуйста, как это сделать?
... << RSDN@Home 1.1.2 stable >>
Re: Как получить ссылку на объект класса view в MDI?
От:
Аноним
Дата:
28.01.04 13:16
Оценка:
Здравствуйте, johneeee, Вы писали:
J>Добрый времени суток!
J>Столкнулся с такой проблемой, что нужно из Mainframe получить ссылку на объект класса наследуемого от CMDIChildWindow. Есть метод MDIGetActive, который возвращает HWND. Так вот, как по HWND или каким либо другим способом получить ссылку на сам оконный класс(естественно, это наследник от CMDIChildWindow)? Пока у меня это работает так (не судите строго, главное, что это работает): используя HWND, полученный с помощью MDIGetActive посылаю WM_COMMAND со специальным COMMAND ID, в ответ получаю ссылку на объект(return (long) this; ). Просто и работает, но, наверное, можно сделать куда более элегантнее и правильнее, с точки зрения MDI архитектуры. Подскажите, пожалуйста, как это сделать?
Вот как делал это я. Тоже работает, но не лучше я думаю)
CMDIChildWnd *pChild = MDIGetActive();
if (pChild != NULL)
{
CDocument *pDoc = pChild->GetActiveDocument();
if (pDoc != NULL)
for (POSITION pos=pDoc->GetFirstViewPosition(); pos; )
{
CView *pView = pDoc->GetNextView(pos);
if (pView != NULL && pView->IsKindOf(RUNTIME_CLASS(CMyView)))
{
return (CMyView*)pView;
}
}
}
Re[2]: Как получить ссылку на объект класса view в MDI?
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, johneeee, Вы писали:
J>>Добрый времени суток!
J>>Столкнулся с такой проблемой, что нужно из Mainframe получить ссылку на объект класса наследуемого от CMDIChildWindow. Есть метод MDIGetActive, который возвращает HWND. Так вот, как по HWND или каким либо другим способом получить ссылку на сам оконный класс(естественно, это наследник от CMDIChildWindow)? Пока у меня это работает так (не судите строго, главное, что это работает): используя HWND, полученный с помощью MDIGetActive посылаю WM_COMMAND со специальным COMMAND ID, в ответ получаю ссылку на объект(return (long) this; ). Просто и работает, но, наверное, можно сделать куда более элегантнее и правильнее, с точки зрения MDI архитектуры. Подскажите, пожалуйста, как это сделать?
А>Вот как делал это я. Тоже работает, но не лучше я думаю)
А> CMDIChildWnd *pChild = MDIGetActive();
Вот MDIGetActive() возвращает HWND. Может это действительно MFC?
... << RSDN@Home 1.1.2 stable >>
Re: Как получить ссылку на объект класса view в MDI?
Здравствуйте, johneeee, Вы писали:
J>Добрый времени суток!
J>Столкнулся с такой проблемой, что нужно из Mainframe получить ссылку на объект класса наследуемого от CMDIChildWindow. Есть метод MDIGetActive, который возвращает HWND. Так вот, как по HWND или каким либо другим способом получить ссылку на сам оконный класс(естественно, это наследник от CMDIChildWindow)? Пока у меня это работает так (не судите строго, главное, что это работает): используя HWND, полученный с помощью MDIGetActive посылаю WM_COMMAND со специальным COMMAND ID, в ответ получаю ссылку на объект(return (long) this; ). Просто и работает, но, наверное, можно сделать куда более элегантнее и правильнее, с точки зрения MDI архитектуры. Подскажите, пожалуйста, как это сделать?
Решение
1 : Послать сообщение окну и получить экземпляр , т.е. что написано выше , только лучше не WM_COMMAND посылать , а зарегистрировать свое сообщение.
2 : Создать карту и в нее записывать дескриптор окна и экземнляр класса , в данном случае можно создать класс для автоматизации.
Что-то типа :
template<typename T>
class MapHWNDCWindow
{
public:
CAtlMap<HWND,CMDIChildWindow*> m_map; // или как нибудь по другому
BEGIN_MSG_MAP(MapHWNDCWindow)
MESSAGE_HANDLER(WM_NCCREATE,OnNCCreate)
END_MSG_MAP()
LRESULT OnNCCreate(...)
{
MapHWND_Init();
bHandled=FALSE;
return 0;
}
void MapHWND_Init() // если не хотим связываться с таблицей сообщений
{
m_map[static_cast<T*>(this)->hWnd]=static_cast<CMDIChildWindow*>(this); // что-то типа того
};
//...class MyClass : public//..public MapHWNDCWindow<MyClass>
{
BEGIN_MSG_MAP(MyClass)
CHAIN_MSG_MAP(MapHWNDCWindow<MyClass>)
//...
END_MSG_MAP()
};