![]() |
|
![]() ![]() ![]() |
|
CaptainFlint |
|
|||
![]() Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
Задача такая: создать приложение, работающее не с файлами, а с проектами, наподобие 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 - это бывший Константин. ;) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Я не знаю таких готовых FrameWork'ов, но не вижу проблем подкрутить MFC для такого проекта. На мой взгляд, не так уж много нужно подкручивать (я не говорю об интерфейсных штучках, а только о фреймворке).
-------------------- ... |
|||
|
||||
CaptainFlint |
|
|||
![]() Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
А где и как? Может, я просто готовить его не умею? Потому что мне пока так и не удалось быстро и удобно всё это настроить... -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Быстро и удобно я и не обещала... ![]() Все придется делать ручками, вооружившись отладчиком и контекстным поиском. Основные классы, которые придется курочить - это шаблоны (CDocTemplate), документы и менеджер документов (CDocManager). У них куча виртуальных функций, так что особых проблем быть не должно. Но в исходном коде полазить придется. Если есть конкретные вопросы, постараюсь ответить. -------------------- ... |
|||
|
||||
CaptainFlint |
|
||||
![]() Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
Редиска! ![]() ![]()
Кабы всё было так просто... Пока что в 90% случаев отладчик упирается в дичайшие макросы-перегружатели типа
которые ни в какую не хотят нормально разворачиваться и рассказывать, кого же они вызывают, и главное - зачем они это делают... В общем, я уже с месяц этой гадостью занимаюсь, и конца пока не видно. ![]() ![]() Пока что каждую новую функцию добавляю после нескольких часов ковыряния с дебаггером в недрах MFC, причём нередко потом оказывается, что добавил не ту функцию, которую нужно было переопределять. И гигантское количество внутренних перенаправлений вызовов облегчению работы никак не способствует. CWinApp:OnOpenDocument вызывает CDocManager::OpenDocumentFile, тот вызывает CMultiDocTemplate::OpenDocumentFile, который обращается к CDocument::OpenDocumentFile... И это далеко не полная цепочка, да и не цепочка вообще, а весьма и весьма разветвлённое дерево - они ж все не по одной функции вызывают... Боюсь, кончится тем, что я просто сделаю копи-паст полного кода всех нужных мне классов со всеми методами, отнаследовав их от оригинальных, и буду прямо в них вносить все изменения. ![]() Пока что конкретных проблем нет, всё решается, но решается ме-едленно. ![]() -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну да, так с любой практически библиотекой приходится бороться. Но со временем, как только почувствуешь внутреннюю логику, время будет сокращаться в геометрической прогрессии... Ты бы посмотрел в исходные коды библиотеки BCG (это коммерческая библиотека контролов - неплохая, богатая, но написана в худших традициях MFC...). Я как-то полдня искала, какая сволочь отшибает мне горячие клавиши в меню. Никакой зацепки, что, собственно, искать (кроме символа \t)... ![]() -------------------- ... |
|||
|
||||
OverBug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Я пробовал создавать CDialogBar, помещал в него ресурс диалога, но бар не ресайзлся, как в VC6. Тогда я создал класс на основе диалога, но не смог его вставить в CDialogBar.
![]() ![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
DialogBar действительно не ресайзится, а среда VC6 вовсе не их использует.
Все надо делать ручками, но это весьма геморройно. Лучше поискать готовые решения. -------------------- ... |
|||
|
||||
OverBug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Где - бы их найти, и есть ли они. ПЛЗ дайте ссылку или пример на мое мыло. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Поищи в форуме, недавно было обсуждение библиотек.
-------------------- ... |
|||
|
||||
OverBug |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Я пробовал, вернее была идея, что CComandBar можно как-то навернуть, сделать на его основе класс, но визард выбрать его не дает, да и вообще, при объявлении объекта вываливается сообщение об ошибке, типа в этом классе есть виртуальная функция.
Интересно, а какой из этих вариантов правильный.
Да, я тоже натыкался. Там обсуждали эту тему, и пришли к выводу что все эти контролы и вообще весь интерфейс в Word2003 т.д. это все самодельные контролы. Вот только какие именно стандартные контроллы из MFC можно так навернуть? Да кстати есть ресурс, там можно по это что-то найти: http://olddos.narod.ru/doc/comp/bsp/v28/ |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Никакой. Для того чтобы "навернуть", как ты выражаешься, MFC, для начала неплохо бы выбраться из пеленок визарда. Т.е. нужно хорошо представлять себе внутреннее устройство библиотеки и уметь обходиться без визарда. То, что тебе нужно, можно построить на основе CControlBar. Впрочем, можно попробовать и CDialogBar кастомизировать. Но при этом, скорее всего, придется что-то докручивать в фреймворке. Тебе ведь сплиттер нужен - чтобы как в студии пристыкованные панели тянулись? Т.е. нужно комплексное решение - библиотека компонентов + фреймворк. Я знаю только коммерческие, но вроде есть и свободные - ищи. -------------------- ... |
|||
|
||||
OverBug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
нашел много примеров на http://www.codeproject.com/library/. на других платных есть 30-дневные халявные версии библиотек, только я не могу понять как это будет выглядеть. На http://www.prof-uis.com есть фрее версия. Но толи у них там чтото на сервере, толи у меня глюк - скачать её мне не удаётся. А у BCG есть ведь устаревшие версии библитек, напимер 6.0 или 5.0. Может они окажутся фрее?
Да, некоторые скачанные библиотеки требуют UXTeme.lib и UXTeme.h. Последний я взял из Билдрёа 6.0, а вот либа там не было, и вообще, с ним компиллер ругается на Билдёревские прагмы.
Согласен. На МФЦ я совсем немного (менее полугода), а до этого юзал почти год чистый АПИ. Поэтому продолжу упорно ![]() ![]() |
|||
|
||||
CaptainFlint |
|
|||
![]() Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
OverBug
Я использую CSizingControlBar. Вроде, то, что тебе нужно. Фришная, открытый код, никаких DLL и LIB не требует. Маленькая, удобная. Есть демо-примеры. Хотя не без недостатков, разумеется... -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
OverBug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 13.4.2006 Где: г.Пенза, Пензенск ой обл. Репутация: нет Всего: 1 |
Спасибо за ссылку, работает замечательно, все устраивает.
Если я пишу приложение, работающее с БД, что может дать использование document/view технологии? И как в этом случае обмениваться сообщениями представлению с документом? |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |