Plugin-ы для Document/View
От: megabit Россия  
Дата: 07.04.03 16:56
Оценка:
Люди добрые подскажите, как сделать следующий номер. Необходимо построить приложение используя Document/View, но чтобы все доки подключались как плагины первого уровня а их вьевы как плагины второго уровня.
megabit
Re: Plugin-ы для Document/View
От: WoldemaR Россия  
Дата: 08.04.03 14:09
Оценка:
Здравствуйте, 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);

//...
}


Надеюсь идея Вам ясна.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.