Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание проектно-ориентированного MDI-приложения 
:(
    Опции темы
CaptainFlint
Дата 3.4.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 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()... Короче, мороки столько, что уже и сам не рад. smile Вроде бы, задача не такая уж и редкая, должны быть какие-то сторонние расширения для подобных вещей...


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 3.4.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Я не знаю таких готовых FrameWork'ов, но не вижу проблем подкрутить MFC для такого проекта. На мой взгляд, не так уж много нужно подкручивать (я не говорю об интерфейсных штучках, а только о фреймворке).
Цитата(CaptainFlint @ 3.4.2006, 01:14 Найти цитируемый пост)
документ — это файл и только файл, обязательно добавляющийся в MRU, и открывающийся из MRU именно как документ
Вот уж нет. Документом ты можешь сделать все, что угодно, нужно только соответствующие функции переписать или просто заглушить. Добавление в MRU, загрузка, сохранение - все это настраивается.



--------------------
...
PM   Вверх
CaptainFlint
Дата 3.4.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: 7
Всего: 23



Цитата(Earnest @ 3.4.2006, 19:56 Найти цитируемый пост)
Добавление в MRU, загрузка, сохранение - все это настраивается.

А где и как? Может, я просто готовить его не умею? Потому что мне пока так и не удалось быстро и удобно всё это настроить...


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 3.4.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(CaptainFlint @ 3.4.2006, 19:16 Найти цитируемый пост)
Потому что мне пока так и не удалось быстро и удобно всё это настроить...

Быстро и удобно я и не обещала... smile
Все придется делать ручками, вооружившись отладчиком и контекстным поиском. Основные классы, которые придется курочить - это шаблоны (CDocTemplate), документы и менеджер документов (CDocManager).
У них куча виртуальных функций, так что особых проблем быть не должно. Но в исходном коде полазить придется. Если есть конкретные вопросы, постараюсь ответить.


--------------------
...
PM   Вверх
CaptainFlint
Дата 3.4.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: 7
Всего: 23



Цитата(Earnest @ 3.4.2006, 20:33 Найти цитируемый пост)
Быстро и удобно я и не обещала...

Редиска! smile Ещё издевается. smile

Цитата(Earnest @ 3.4.2006, 20:33 Найти цитируемый пост)
Все придется делать ручками, вооружившись отладчиком и контекстным поиском.

Кабы всё было так просто... Пока что в 90% случаев отладчик упирается в дичайшие макросы-перегружатели типа
Код
AFX_ISOLATIONAWARE_FUNC(DWORD ,CommDlgExtendedError,(void),(),0)

которые ни в какую не хотят нормально разворачиваться и рассказывать, кого же они вызывают, и главное - зачем они это делают... В общем, я уже с месяц этой гадостью занимаюсь, и конца пока не видно. smile Конечно, приложение постепенно обретает всё более правильные формы, но какая уймища времени на всё это уходит... smile Потому и задумался, а вдруг есть готовые решения, где всё это уже проделано? Ну или по крайней мере, где-то в MFC запрятаны механизмы, которые позволяют это настроить попроще. Очень не люблю велосипеды изобретать.

Пока что каждую новую функцию добавляю после нескольких часов ковыряния с дебаггером в недрах MFC, причём нередко потом оказывается, что добавил не ту функцию, которую нужно было переопределять. И гигантское количество внутренних перенаправлений вызовов облегчению работы никак не способствует. CWinApp:OnOpenDocument вызывает CDocManager::OpenDocumentFile, тот вызывает CMultiDocTemplate::OpenDocumentFile, который обращается к CDocument::OpenDocumentFile... И это далеко не полная цепочка, да и не цепочка вообще, а весьма и весьма разветвлённое дерево - они ж все не по одной функции вызывают... Боюсь, кончится тем, что я просто сделаю копи-паст полного кода всех нужных мне классов со всеми методами, отнаследовав их от оригинальных, и буду прямо в них вносить все изменения. smile

Цитата(Earnest @ 3.4.2006, 20:33 Найти цитируемый пост)
Если есть конкретные вопросы, постараюсь ответить.

Пока что конкретных проблем нет, всё решается, но решается ме-едленно. smile Если в какую-то стенку упрусь, тут напишу.


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 4.4.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(CaptainFlint @ 3.4.2006, 21:31 Найти цитируемый пост)
Пока что каждую новую функцию добавляю после нескольких часов ковыряния с дебаггером в недрах MFC

Ну да, так с любой практически библиотекой приходится бороться.
Но со временем, как только почувствуешь внутреннюю логику, время будет сокращаться в геометрической прогрессии...

Ты бы посмотрел в исходные коды библиотеки BCG (это коммерческая библиотека контролов - неплохая, богатая, но написана в худших традициях MFC...). Я как-то полдня искала, какая сволочь отшибает мне горячие клавиши в меню. Никакой зацепки, что, собственно, искать (кроме символа \t)... smile


--------------------
...
PM   Вверх
OverBug
Дата 13.4.2006, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

Репутация: нет
Всего: 1



Я пробовал создавать CDialogBar, помещал в него ресурс диалога, но бар не ресайзлся, как в VC6. Тогда я создал класс на основе диалога, но не смог его вставить в CDialogBar. smile smile
PM MAIL ICQ   Вверх
Earnest
Дата 13.4.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



DialogBar действительно не ресайзится, а среда VC6 вовсе не их использует.
Все надо делать ручками, но это весьма геморройно. Лучше поискать готовые решения.


--------------------
...
PM   Вверх
OverBug
Дата 14.4.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

Репутация: нет
Всего: 1



Цитата

Лучше поискать готовые решения.


Где - бы их найти, и есть ли они. ПЛЗ дайте ссылку или пример на мое мыло.
PM MAIL ICQ   Вверх
Earnest
Дата 14.4.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Поищи в форуме, недавно было обсуждение библиотек.


--------------------
...
PM   Вверх
OverBug
Дата 14.4.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

Репутация: нет
Всего: 1



Я пробовал, вернее была идея, что CComandBar можно как-то навернуть, сделать на его основе класс, но визард выбрать его не дает, да и вообще, при объявлении объекта вываливается сообщение об ошибке, типа в этом классе есть виртуальная функция.
Код

CCommandBar m_wndLeftBar;
или
CCommandBar m_wndLeftBar = new CCommandBar();

Интересно, а какой из этих вариантов правильный.

Цитата

Поищи в форуме,

Да, я тоже натыкался. Там обсуждали эту тему, и пришли к выводу что все эти контролы и вообще весь интерфейс в Word2003 т.д. это все самодельные контролы. Вот только какие именно стандартные контроллы из MFC можно так навернуть?
Да кстати есть ресурс, там можно по это что-то найти: http://olddos.narod.ru/doc/comp/bsp/v28/
PM MAIL ICQ   Вверх
Earnest
Дата 16.4.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата

Интересно, а какой из этих вариантов правильный

Никакой.

Для того чтобы "навернуть", как ты выражаешься, MFC, для начала неплохо бы выбраться из пеленок визарда. Т.е. нужно хорошо представлять себе внутреннее устройство библиотеки и уметь обходиться без визарда.
То, что тебе нужно, можно построить на основе CControlBar. Впрочем, можно попробовать и CDialogBar кастомизировать. Но при этом, скорее всего, придется что-то докручивать в фреймворке.  Тебе ведь сплиттер нужен - чтобы как в студии пристыкованные панели тянулись? Т.е. нужно комплексное решение - библиотека компонентов + фреймворк. Я знаю только коммерческие, но вроде есть и свободные - ищи.
 


--------------------
...
PM   Вверх
OverBug
Дата 16.4.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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, а вот либа там не было, и вообще, с ним компиллер ругается на Билдёревские прагмы.
Цитата

Для того чтобы "навернуть"... MFC.. неплохо бы выбраться из пеленок визарда. Т.е. нужно хорошо представлять себе внутреннее устройство библиотеки и уметь обходиться без визарда.

Согласен. На МФЦ я совсем немного (менее полугода), а до этого юзал почти год чистый АПИ.
Поэтому продолжу упорно  smile , вдуг получится  smile
PM MAIL ICQ   Вверх
CaptainFlint
Дата 16.4.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: 7
Всего: 23



OverBug
Я использую CSizingControlBar. Вроде, то, что тебе нужно. Фришная, открытый код, никаких DLL и LIB не требует. Маленькая, удобная. Есть демо-примеры. Хотя не без недостатков, разумеется... 


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
OverBug
Дата 17.4.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 13.4.2006
Где: г.Пенза, Пензенск ой обл.

Репутация: нет
Всего: 1



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

Если я пишу приложение, работающее с БД, что может дать использование document/view технологии? И как в этом случае обмениваться сообщениями представлению с документом?
 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.