| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Создание проектно-ориентированного MDI-приложения |
| Автор: CaptainFlint 3.4.2006, 01:14 |
| Задача такая: создать приложение, работающее не с файлами, а с проектами, наподобие Visual Studio. А именно: 1. Есть основное окно приложения, в нём — "прилипающее" окошко с деревом проекта. Дерево содержит некие абстрактные элементы, работа с которыми полностью определяется моим кодом. 2. В меню программы есть команда "Открыть", которая открывает собственно проект. Этот проект добавляется в MRU-список, откуда, естественно, его можно вызвать впоследствии. 3. Сам проект представлен в виде дерева в том самом окошке из п.1. Список элементов составляет программа на основе открытого файла проекта (это не обязательно набор файлов, может быть что угодно). 4. По двойному щелчку на элементе дерева создаётся пара экземпляров классов а-ля документ-вид, соответствующая этому элементу. Соответственно, открывается дочернее окошко, отображающее нужную информацию (детали определяются приложением), контроллируемое классом типа "Вид". Попробовал создать Explorer-style MDI-приложение — не подошло (там своё дерево у каждого дочернего окна). Подскажите, пожалуйста, существует ли что-нибудь для создания шаблона подобного приложения? Очень желательно, чтобы это "что-то" было не сильно навороченным. Есть всякие профессиональные библиотеки, но они в основном играют на GUI: добавление всяких докающихся окон, гридов, Office XP/2000/2003-интерфейсов, панелей инструментов и прочее. Мне же нужна просто базовая архитектура, куда можно было бы пихать свой код, а в интерфейсе обойдусь и стандартными причиндалами. Пока что пытаюсь извращаться, подгоняя существующие шаблоны MFC MDI под эти требования, но это получается чересчур муторно. Слишком всё жёстко завязано на конкретный шаблон приложения: документ — это файл и только файл, обязательно добавляющийся в MRU, и открывающийся из MRU именно как документ; открытие/сохранение работает только с документами (файлами); и т.д. Соответственно, пытаюсь всё это подстроить под себя: добавил окошко с деревом; вместо ID_OPEN_FILE сделал новую команду, которая открывает проект, а не файл (чтобы не создавался документ-вид раньше времени); обрабатываю двойной клик в дереве, вызывая при этом OpenDocumentFile с фиктивным параметром (фиктивным — потому что передаётся имя файла и только имя файла, да ещё и в полный путь преобразуется в недрах MFC); переопределяю CMyApp::AddToRecentFileList(), чтобы не добавлялись дочерние элементы изнутри OpenDocumentFile, нужные же мне элементы (открытые проекты) добавляю вручную явным вызовом CWinApp::AddToRecentFileList()... Короче, мороки столько, что уже и сам не рад. |
| Автор: CaptainFlint 3.4.2006, 19:16 |
| А где и как? Может, я просто готовить его не умею? Потому что мне пока так и не удалось быстро и удобно всё это настроить... |
| Автор: Earnest 3.4.2006, 19:33 | ||
Быстро и удобно я и не обещала... Все придется делать ручками, вооружившись отладчиком и контекстным поиском. Основные классы, которые придется курочить - это шаблоны (CDocTemplate), документы и менеджер документов (CDocManager). У них куча виртуальных функций, так что особых проблем быть не должно. Но в исходном коде полазить придется. Если есть конкретные вопросы, постараюсь ответить. |
| Автор: CaptainFlint 3.4.2006, 20:31 | ||||
| Редиска!
Кабы всё было так просто... Пока что в 90% случаев отладчик упирается в дичайшие макросы-перегружатели типа
которые ни в какую не хотят нормально разворачиваться и рассказывать, кого же они вызывают, и главное - зачем они это делают... В общем, я уже с месяц этой гадостью занимаюсь, и конца пока не видно. Пока что каждую новую функцию добавляю после нескольких часов ковыряния с дебаггером в недрах MFC, причём нередко потом оказывается, что добавил не ту функцию, которую нужно было переопределять. И гигантское количество внутренних перенаправлений вызовов облегчению работы никак не способствует. CWinApp:OnOpenDocument вызывает CDocManager::OpenDocumentFile, тот вызывает CMultiDocTemplate::OpenDocumentFile, который обращается к CDocument::OpenDocumentFile... И это далеко не полная цепочка, да и не цепочка вообще, а весьма и весьма разветвлённое дерево - они ж все не по одной функции вызывают... Боюсь, кончится тем, что я просто сделаю копи-паст полного кода всех нужных мне классов со всеми методами, отнаследовав их от оригинальных, и буду прямо в них вносить все изменения. Пока что конкретных проблем нет, всё решается, но решается ме-едленно. |
| Автор: Earnest 4.4.2006, 19:41 | ||
Ну да, так с любой практически библиотекой приходится бороться. Но со временем, как только почувствуешь внутреннюю логику, время будет сокращаться в геометрической прогрессии... Ты бы посмотрел в исходные коды библиотеки BCG (это коммерческая библиотека контролов - неплохая, богатая, но написана в худших традициях MFC...). Я как-то полдня искала, какая сволочь отшибает мне горячие клавиши в меню. Никакой зацепки, что, собственно, искать (кроме символа \t)... |
| Автор: OverBug 13.4.2006, 02:39 |
| Я пробовал создавать CDialogBar, помещал в него ресурс диалога, но бар не ресайзлся, как в VC6. Тогда я создал класс на основе диалога, но не смог его вставить в CDialogBar. |
| Автор: Earnest 13.4.2006, 08:18 |
| DialogBar действительно не ресайзится, а среда VC6 вовсе не их использует. Все надо делать ручками, но это весьма геморройно. Лучше поискать готовые решения. |
| Автор: OverBug 14.4.2006, 00:09 | ||
Где - бы их найти, и есть ли они. ПЛЗ дайте ссылку или пример на мое мыло. |
| Автор: Earnest 14.4.2006, 08:37 |
| Поищи в форуме, недавно было обсуждение библиотек. |
| Автор: OverBug 14.4.2006, 22:28 | ||||
Я пробовал, вернее была идея, что CComandBar можно как-то навернуть, сделать на его основе класс, но визард выбрать его не дает, да и вообще, при объявлении объекта вываливается сообщение об ошибке, типа в этом классе есть виртуальная функция.
Интересно, а какой из этих вариантов правильный.
Да, я тоже натыкался. Там обсуждали эту тему, и пришли к выводу что все эти контролы и вообще весь интерфейс в Word2003 т.д. это все самодельные контролы. Вот только какие именно стандартные контроллы из MFC можно так навернуть? Да кстати есть ресурс, там можно по это что-то найти: http://olddos.narod.ru/doc/comp/bsp/v28/ |
| Автор: Earnest 16.4.2006, 09:50 | ||
Никакой. Для того чтобы "навернуть", как ты выражаешься, MFC, для начала неплохо бы выбраться из пеленок визарда. Т.е. нужно хорошо представлять себе внутреннее устройство библиотеки и уметь обходиться без визарда. То, что тебе нужно, можно построить на основе CControlBar. Впрочем, можно попробовать и CDialogBar кастомизировать. Но при этом, скорее всего, придется что-то докручивать в фреймворке. Тебе ведь сплиттер нужен - чтобы как в студии пристыкованные панели тянулись? Т.е. нужно комплексное решение - библиотека компонентов + фреймворк. Я знаю только коммерческие, но вроде есть и свободные - ищи. |
| Автор: OverBug 16.4.2006, 11:41 | ||
| нашел много примеров на http://www.codeproject.com/library/. на других платных есть 30-дневные халявные версии библиотек, только я не могу понять как это будет выглядеть. На http://www.prof-uis.com есть фрее версия. Но толи у них там чтото на сервере, толи у меня глюк - скачать её мне не удаётся. А у BCG есть ведь устаревшие версии библитек, напимер 6.0 или 5.0. Может они окажутся фрее? Да, некоторые скачанные библиотеки требуют UXTeme.lib и UXTeme.h. Последний я взял из Билдрёа 6.0, а вот либа там не было, и вообще, с ним компиллер ругается на Билдёревские прагмы.
Согласен. На МФЦ я совсем немного (менее полугода), а до этого юзал почти год чистый АПИ. Поэтому продолжу упорно |
| Автор: CaptainFlint 16.4.2006, 13:42 |
| OverBug Я использую http://www.datamekanix.com/sizecbar/. Вроде, то, что тебе нужно. Фришная, открытый код, никаких DLL и LIB не требует. Маленькая, удобная. Есть демо-примеры. Хотя не без недостатков, разумеется... |
| Автор: OverBug 17.4.2006, 21:44 |
| Спасибо за ссылку, работает замечательно, все устраивает. Если я пишу приложение, работающее с БД, что может дать использование document/view технологии? И как в этом случае обмениваться сообщениями представлению с документом? |
| Автор: Earnest 18.4.2006, 08:13 |
| OverBug, Модератор: Пожалуйста, один топик - один вопрос. Ты и так уже к капитану Флинту в тему влез. Заведи свой топик. |