Люди добрые подскажите, как сделать следующий номер. Необходимо построить приложение используя Document/View, но чтобы все доки подключались как плагины первого уровня а их вьевы как плагины второго уровня.
Здравствуйте, megabit, Вы писали:
M>Люди добрые подскажите, как сделать следующий номер. Необходимо построить приложение используя Document/View, но чтобы все доки подключались как плагины первого уровня а их вьевы как плагины второго уровня.
Когда-то я работал с таким решением. Классы ChildFrame, Document и View грузились из dll через абстрактный класс-загрузчик, виртуальные методы которого возвращали CRuntimeClass для соответствующего типа класса. Ещё для чего-то были виртуальные методы создания экземпляров.
Примерно так:
class MY_IMPORT_CLASS CDocViewLoader
{
public:
CDocViewLoader();
virtual ~CDocViewLoader();
virtual CRuntimeClass* GetView()=0;
virtual CRuntimeClass* GetDoc()=0;
virtual CRuntimeClass* GetFrame()=0;
virtual CView* CreateView()=0;
virtual CDocument* CreateDoc()=0;
virtual CFrameWnd* CreateFrame()=0;
};
В плагине, потомок класса загрузчика перекрывал все чистые методы:
class MY1_IMPORT_CLASS CDocViewLoader1
{
public:
CDocViewLoader1();
virtual ~CDocViewLoader1();
virtual CRuntimeClass* GetView()
{
return RUNTIME_CLASS(CMyView);
};
virtual CRuntimeClass* GetDoc()
{
return RUNTIME_CLASS(CMyDocument);
};
virtual CRuntimeClass* GetFrame()
{
return RUNTIME_CLASS(CMyChildFrame);
};
// А вот про методы-создатели я непомню. :(
};
Всё это вызывалось так:
BOOL CMyApp::InitInstance()
{
//...
CDocViewLoader *pDVLoader = // Опять непомню. :(
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYTYPE,
pDVLoader->GetDoc(),
pDVLoader->GetFrame(),
pDVLoader->GetView());
AddDocTemplate(pDocTemplate);
//...
}
Надеюсь идея Вам ясна.