Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > А что делать, если MDI каркас MFC не подходит?


Автор: Rapalex 20.3.2006, 14:19
У меня такое дело нужно написать программу, которая не совсем вписывает-ся в каркас предлагаемый FMC.

1. Мне нужно чтоб внешний вид был, как у MDI, а по факту всегда работало только с одним документом, и было запущено только один раз в системе.

Проблему решил так: при открытии нового документа пребывал закрыть от-крытый документ. Остальные проблемы решать и не пришлось.

2. Есть несколько типов представлений и все они показывают определённые части документа.

С этим проблем не было, я и рассказывать не буду.

Проблема в том, что один вид документа должен причаливаться как ToolBar к MainFrame.

И САМАЯ большая проблема в том, что при открытии документа не должно быть (или может не быть) открытых представлений документа. Это как в студии, есть выход написать “свою MFC” но мне это не нравиться.

И какие есть идеи по поводу последних двух проблем?

Рад буду услышать любые мысли.

Автор: Бугемот 20.3.2006, 15:43
Цитата(Rapalex @ 20.3.2006, 14:19 Найти цитируемый пост)
И САМАЯ большая проблема в том, что при открытии документа не должно быть (или может не быть) открытых представлений документа. Это как в студии, есть выход написать “свою MFC” но мне это не нравиться.

В классе Вашего приложения (CYourApp) найдите строку:
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) и замените на
ON_COMMAND(ID_FILE_NEW, OnFileNew)
Естественно, метод OnFileNew должен быть перегружен
void CYourApp::OnFileNew()
{

}


Цитата(Rapalex @ 20.3.2006, 14:19 Найти цитируемый пост)
Проблема в том, что один вид документа должен причаливаться как ToolBar к MainFrame.

в сети куча бесплатных подобных штук. Если этот вид нужен для контролов, посмотрите в сторону CDialogBar.

Автор: Rapalex 21.3.2006, 15:08
Так я сделал, но проблемма что документ должен существовать а представление нет.

Автор: Earnest 21.3.2006, 15:23
1) Документ может запросто существовать без вью и фреймов - кто мешает? Просто не надо сразу создавать фрейм и вью при загрузке. Для этого покопайся в CDocTemplate::OpenDocumentFile - она виртуальная, там можно помудрить.
2) Еще придется докрутить закрытие видов: при закрытии последнего документ в стандартном случае закрывается, а тебе ведь надо оставить его открытым до явного закрытия
Так что я бы сделала по другому: Поскольку документ один и тип у него тоже один - я бы написала свой менеджер - да хоть бы простейшую глобальную переменную. И, конечно, нужно переписать обработчик OnFileNew. А вот MDI-темплэйты я бы использовала для различных видов этого документа, представив показываемые там части как псевдо-документы (которые не надо загружать-выгружать с диска, а надо брать от глобального загруженного документа).

Автор: Rapalex 22.3.2006, 17:02
Earnest, так та оно так НО в InitInstance() есть строки:

Код

    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_ProjectTYPE,
        RUNTIME_CLASS(CDocProject),
        RUNTIME_CLASS(CJustChildFrame),
        RUNTIME_CLASS(CJustView));
    AddDocTemplate(pDocTemplate);


и что мне с ними делать. Они нужны но CJustChildFrame и CJustView нужно указывать, а при запуске приложения они создадк=уться как бы я этого не хотел.

Автор: Earnest 22.3.2006, 18:11
1) Во первых - что значит "нужны"? Зачем тебе темплэйт, если ни фрейс ни вью к нему не прилагается? Основная задача DocTemplate - это как раз связь между документом и его видами.

2) Во-вторых, если все-таки нужно зачем-нибудь (ну там строки из ресурсов загрузить) CJustChildFrame и CJustView можно заменить нулями. Конечно, тогда придется кое-где подкрутить. Скорее всего, в OpenDocumeтеFile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)