Подтвердить что ты не робот

Каковы некоторые методы переноса большого приложения MFC в WPF/.NET?

В настоящее время я работаю над очень большим наследием MFC MDI. Он имеет большое количество элементов пользовательского интерфейса - прикрепляемые панели инструментов, настраиваемые элементы управления деревом, контекстные меню и т.д. Это приложение для обработки изображений, поэтому основные представления визуализируются с использованием DirectX и OpenGL. Продукт составляет около 10 лет, и одним из приоритетов здесь является обновление его внешнего вида.

Зная, что Microsoft проделала хорошую работу по обеспечению взаимодействия между С++/MFC и .NET. Я подумал, что имеет смысл постепенно перемещать базу кода. С чего я сейчас боюсь, с чего начать.

Один из подходов состоит в том, чтобы вырвать структуру MFC с помощью WPF и повторно использовать как можно больше кода на С++. Это позволит нам максимизировать преимущества архитектуры WPF, но будет означать длительный период разработки, пока мы снова не будем полностью функционировать.

Другой подход заключается в замене элементов управления MFC по одному с помощью их WPF-аналогов. Это позволит нам работать постепенно. Моя озабоченность этим подходом заключается в том, что это означает, что между управляемым и неуправляемым кодом будет очень много точек соединения, и я не уверен, с чего начать с замены таких вещей, как главное меню и панели инструментов.

Или есть другой вариант, который я не вижу?

Любые предложения или ссылки на информацию по этой теме будут оценены.

Обновление: DavidK поднял несколько отличных вопросов, поэтому я добавляю мотивации, стоящие за этим.

1) Будущее развитие продукта

Этот продукт по-прежнему активно развивается с добавлением новых функций на регулярной основе. Я подумал, что было бы очень полезно попытаться медленно перейти на С#/WPF. В моем ограниченном опыте работы с С#/WPF я обнаружил, что повышение производительности становится потрясающим благодаря работе на С++/MFC.

Другая большая вещь, которую мы получаем с WPF, - это возможность использовать многоголовочные системы. Приложения MFC ограничены одним кадром верхнего уровня, что затрудняет использование нескольких мониторов.

2) Задержание и набор сотрудников

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

4b9b3361

Ответ 1

Пересмотр этого, потому что я успешно заменил наш MFC-интерфейс верхнего уровня (основной фрейм, окна и панели инструментов) с помощью WPF.

Как оказалось, наш основной код рисования просто нужно передать HWND. Это очень упростило повторное использование основной части существующей кодовой базы С++.

Вот краткое изложение ключевых фрагментов подхода, который я принял:

  • Используется класс .NET HwndHost для размещения HWND для кода чертежа С++ для рендеринга в
  • Созданы обертки С++/CLI для любого собственного кода на С++, который должен быть открыт для кода интерфейса WPF/С#.
  • Остальная часть диалогов MFC as-находится в коде С++. Это минимизирует объем работы, необходимой для завершения пользовательского интерфейса. Диалоги MFC могут быть перенесены в WPF с течением времени.

В качестве примечания мы используем SandDock и SandRibbon от Divelements и до сих пор очень довольны ими.

Ответ 2

Я не думаю, что есть более простой способ, который вы не охватили, хотя, вероятно, это будет зависеть от того, насколько хорошо отделяется основная логика от уровня пользовательского интерфейса.

Не желая казаться отрицательным: уверены ли вы, что это будет стоить усилий? Если бы я писал большое приложение с нуля, я бы не начал с С++ и MFC сейчас, но, видя, где вы находитесь, что вы действительно получите от перезаписи? Будет ли это добавить новую функцию, за которую пользователи будут платить? Есть ли пользователи, которых вы отключите, кто не сможет запустить новую версию? Я не могу не подозревать, что вы получите гораздо большую отдачу от инвестиций, глядя на некоторые относительно простые вещи, которые вы могли бы сделать, чтобы улучшить внешний вид приложения. Например, у него есть манифест в стиле XP, так что общие элементы управления получают представление XP? Будут ли несколько дней потрачены на обновление битов (например, с использованием диалоговых окон нового стиля), вы получите большую часть нового блестящего взгляда? Имейте в виду, что даже самый новый, самый блестящий Office 2007 был реализован Microsoft с обычными элементами управления Win32.

Ответ 3

Я должен был сделать то же самое в проекте с использованием WinForms раньше. Нам нужно было перенести наш проект MFC на .NET 1.1, и мы решили взять все основные функции приложения MFC и написать управляемые обертки вокруг всех них. Затем мы написали интерфейс WinForms и подключили кэш-код старого кода С++. Я думаю, что мы сделали правильный выбор в долгосрочной перспективе. Я не представляю, как мы это сделали бы, если бы попытались одновременно сохранить интерфейс MFC.

Ответ 4

FWIW, тем не менее, вы можете использовать MFC Feature Pack (доступный с VS2008 SP1), чтобы придать вашему окну Office Office внешний вид и чувствовать себя довольно быстро (вы даже можете добавить ленту, если она понравится вашим пользователям, хотя это было бы более привлекательным.) Я обновил пользовательский интерфейс для старого приложения MFC, используя эти новые классы за один день, и теперь, если быть справедливым, это выглядит фантастически, и мои пользователи очень довольны (вы можете поддержать целый ряд взглядов и цветовые схемы.) MS выбрала инструментарий BCG, но есть и другие доступные, если вы хотите заплатить небольшую сумму денег (например, CodeJock).

Я знаю, что это не отвечает на ваш вопрос, но если он изменит только пользовательский интерфейс, тогда вам стоит посмотреть.

Ответ 5

Я думаю, что вы хорошо разбираетесь в стратегиях. Обратите внимание, что одна потенциальная точка боли при миграции в WPF заключается в том, что не каждый элемент управления имеет дескриптор. Это, к сожалению, самый неуклюжий сценарий взаимодействия. AFAIK, единственный способ взаимодействия с MFC и WPF - пройти WindowsFormsHost. Парадигма WPF также радикально отличается от MFC/WinForms, поэтому там могут быть проблемы с переводом.

Учитывая вашу большую, но функциональную, устаревшую кодовую базу, я бы, вероятно, спорил в пользу вашего второго подхода. Начните с одного элемента управления одновременно и сделайте его WPF-y. Создайте четко определенный интерфейс между вашим новым управляемым элементом управления и базовой базой кода, а затем работайте с этим интерфейсом. Если вы сделаете это по одному, вы будете работать с более низким профилем риска re: WPF, который будет довольно крутым, imho.

Я чувствую, что важно отметить, что, вероятно, я бы предложил первый подход, если вы собираетесь в WinForms. Более близкая парадигма и относительно гладкая кривая обучения будут намного легче работать через все-в-одном.