Codexzy Ответов: 7

Win32 API vs MFC : что выбрать


Недавно я изучил Win32 API. (Купил книгу Чарльза Петцольда и почти полностью прочитал ее). Мне очень нравится Win32 API, но мне кажется, что я трачу время впустую. Поэтому я думаю об изучении MFC. Я верю, что смогу быстро учиться, так как знаю Win32.

Есть несколько вопросов.
Стоит ли изучать МФЦ ?
Насколько сложно / легко переносить приложения MFC на другие платформы ?
Что вы лично предпочитаете: MFC или Win32 (или ни то, ни другое) ?

Редактировать:
Я пишу только нативные приложения на C++.

7 Ответов

Рейтинг:
45

Maximilien

Это зависит от того, какую работу вы ожидаете выполнить в ближайшем будущем и какие технологии используют эти домены (посмотрите на списки вакансий).

Одна важная вещь заключается в том, что при разработке приложения необходимо разделить компоненты GUI (MFC, QT,...) от основных функций (C++), так что если вам нужно портировать приложение, вам придется только портировать/переписывать часть GUI, а не основные функции.

Я использую C++/MFC полный рабочий день в течение последних 12 лет, и я знаю, что если я изменю работу, мне, вероятно, нужно будет сделать что-то еще (нет никакой работы локально с C++/MFC),


Captain Price

+5 Для графического разделения частей.

Albert Holguin

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

Рейтинг:
2

Albert Holguin

Да, на этот счет существует множество различных мнений...

Цитата:
Стоит ли изучать МФЦ ?
Насколько сложно / легко переносить приложения MFC на другие платформы ?
Что вы лично предпочитаете: MFC или Win32 (или ни то, ни другое) ?


Стоит учиться: Конечно, если вы уже знакомы с WinAPI, это действительно не имеет большого значения. Вы просто обнаружите, что все обернуто вокруг классов C++ и гораздо проще выполнять свою работу. Вы не можете сказать, что существует много рабочих мест, требующих MFC, но знание WinAPI и MFC будет означать, что вы знаете о Windows намного больше, чем большинство других программистов (некоторые из этих уровней абстракции наверняка заставляют программистов, которые не знают, что происходит за кулисами). Кроме того, как я уже упоминал в одном из других решений, MFC существует уже давно.

Перенос: Ну, вы можете использовать уровень совместимости Wine для запуска приложений MFC в Linux, но вам определенно нужно тестировать, тестировать, тестировать. Как бы они ни старались, вино не идеально, поэтому есть много вещей, которые хорошо работают в Windows и плохо работают с вином в Linux. Лучший вариант здесь - убедиться, что вы разделили графический интерфейс и основной код, чтобы у вас была возможность просто добавить собственный графический интерфейс, совместимый с Linux, и перекомпилировать его.

MFC V. Win32: MFC намного лучше, чем raw Win32 API. С учетом сказанного, однако, приятно знать, что именно MFC оборачивает за кулисами, потому что тогда вы можете легко манипулировать MFC (или любой другой фреймворк), чтобы работать именно так, как вы хотите.


Рейтинг:
2

WuRunZhe

I really like the Win32 API but it feels like I'm wasting time. 


Ну, я думаю, это неправильно. Классы, поддерживаемые MFC, - это капсулированные функции и классы API.

Однако это зависит от вашей работы в будущем. По моему опыту, WIN32 API очень важен, а знание WIN32 API очень полезно при использовании MFC.

При создании программ с помощью MFC существует множество проблем, которые не могут быть решены с помощью MFC. В этот момент мы реализуем метод WIN32 API для решения проблемы.

По моему собственному мнению, изучение WIN32 API-это не пустая трата времени.

Спасибо.


Рейтинг:
2

nv3

Стоит ли изучать МФЦ ?

Если вы используете C++ (родной, а не .net), то MFC по-прежнему является одной из лучших платформ. В любом случае это предпочтительнее, чем чистый Windows API, потому что он хорошо инкапсулирует большую часть распределения ресурсов. Но прежде чем начать новый проект с MFC, я бы взглянул на альтернативы, такие как Qt или использование C# и .net вместо собственного C++.

Насколько сложно / легко переносить приложения MFC на другие платформы ?
Там не так уж много переносимости. С MFC вы практически прилипли к Windows. Вот почему я хотел бы взглянуть на Qt.

Что вы лично предпочитаете: MFC или Win32 (или ни то, ни другое) ?
Если это либо/либо, ТО МФЦ без вопросов. Вы можете делать все, что можно сделать с помощью Win32 API (на самом деле вы все еще можете вызывать функции Win32 API в приложении MFC). Но MFC делает несколько вещей, таких как маршрутизация сообщений, распределение ресурсов и структурирование приложений, намного проще.


Codexzy

Да, я использую родной C++.

Albert Holguin

Опубликовал комментарий к этому решению.

Albert Holguin

Вы забываете о Wine для переноса приложений на Linux. Работает прилично хорошо, если вы всегда тестируете свой код как в Windows, так и в Linux (не думайте, что он будет работать в Linux, потому что он работает в Windows). Кроме того, все, кого я знаю, кто использовал Qt, жаловались на это... так что я не знаю, назвал бы я это "лучшей альтернативой" MFC, просто "альтернативой".

nv3

Спасибо, Альберт, что указал на это. Я еще не работал с вином. Интересно слышать, что на самом деле существует некоторая переносимость приложений MFC. Я слышал хорошие и плохие вещи о Qt. Я, конечно, содержит некоторые очень хорошие функции.

Albert Holguin

Вино работает, но это боль в заднице... и Qt работает, но это тоже боль в заднице. Я думаю, что есть варианты для всего. У нас есть инженер, который поклялся никогда больше не работать с Qt после крупного проекта, который преобразовал старый код C++ в Qt для многоплатформенного использования.

KarstenK

Каковы ваши "профессиональные впечатления" от вина?

Я не буду "ездить на мертвых лошадях", как МФЦ :-(

Albert Holguin

Вино работает нормально,но вы должны убедиться, что все проверили. Есть тривиальные вещи, которые хорошо работают в MFC, но не так хорошо в Wine. Они также не поддерживают все, что доступно в MFC,например, приоритеты потоков... но их обоснование заключается в том, что приоритеты потоков могут открыть вас для DoS-атак (что верно). Я бы еще не назвал MFC мертвой лошадью, пока MS продолжает поддерживать его и выпускать новые версии.

Рейтинг:
1

xenotron

Всегда есть вещи низкого уровня и очень высокого уровня и постепенный переход между ними. В windows, если мы говорим о графическом интерфейсе, то самым низким уровнем является WinAPI, который представляет собой процедурный интерфейс C (расположенный в основном в пользовательских библиотеках и библиотеках gdi), а интерфейс действительно хорошей высокоуровневой реализации GUI framework обычно объектно-ориентирован и обычно не имеет ничего общего с чистым графическим интерфейсом C WinAPI windows.

Фреймворк высокого уровня (например, Qt, java swing, Delphi, .Net gui framework) может показаться сложным в использовании сначала, если вы привыкли использовать winapi или MFC, но после их изучения (и шаблона MVC, который они используют) эти фреймворки более высокого уровня намного лучше, и с ними намного проще писать более приятный / повторно используемый код. Не говоря уже о том, что большинство хороших высокоуровневых библиотек предоставляют инструменты для визуального редактирования окон (гораздо лучше, чем редактор ресурсов диалогового окна winapi, используемый в winapi и mfc). API высокого уровня обычно полностью скрывают от вас API низкого уровня (и простой / обычный код gui не содержит уродливых вещей, таких как подключение к Winapi HWNDS / диалоговым элементам управления с объектами MFC).

Если вы сосредоточитесь на хорошем дизайне кода, то узнаете, как работает высокоуровневая объектно-ориентированная библиотека gui. Если вы заинтересованы в том, что происходит под капотом, то изучите также некоторые низкоуровневые winapi, это определенно делает вас лучшим программистом, и вы понимаете еще более высокоуровневые графические библиотеки, особенно если вы узнаете, как реализовать простой объектно-ориентированный графический фреймворк поверх winapi. На мой взгляд, борьба с книгой Чарлста Петцольда-не пустая трата времени.

MFC: забудьте об этом и изучайте его только в том случае, если это необходимо. Кстати MFC это очень большая библиотека которая занимается не только графическим интерфейсом: http://msdn.microsoft.com/en-us/library/ws8s10w4.aspx[^]
MFC содержит несколько полезных классов высокого уровня (например, для работы в сети, ...), но их использование затрудняет перенос вашей программы на другие платформы. Если мы говорим о GUI-части MFC: она гораздо ближе к сырому winapi, чем к высокоуровневой объектно-ориентированной хорошей структуре. Фактически, MFC довольно устарел, и MS поддерживает его из-за огромного кода наследия, но он не имеет большого отношения к современной среде графического интерфейса пользователя, и большинство его методов класса имеют то же имя, что и функции winapi, и обычно они делают то же самое. Большинство механизмов MFC построены на необработанных механизмах winapi, и MFC не пытается скрыть это (на мой взгляд, это иногда ужасно). MFC только наполовину (а может быть, треть) объектно-ориентирован, а остальное в основном является прямым Winapi. Если вы все еще хотите изучить MFC (или если вам нужно изучить MFC, потому что вам нужно поддерживать некоторые проекты в MFC), то изучение книги Чарльза Петцольда является обязательным, вы должны знать winapi, чтобы работать с MFC, потому что MFC gui в основном представляет собой набор классов, которые имеют те же методы, что и часть графического интерфейса winapi. период. Если вас устраивает посредственное знание MFC, вы можете сделать это, не изучая winapi, просто скопировав вставленные примеры из сети, но в случае некоторых сложных проблем вам часто понадобится помощь других.

Если вы хотите попробовать некоторые хорошие графические фреймворки, то найдите пример кода графического интерфейса, написанного в вышеупомянутых графических фреймворках, и сравните их с примерами mfc. Проверьте уровень "объектно-ориентированности" и связь с winapi или любыми другими низкоуровневыми API этих фреймворков и MFC. Вы увидите разницу, особенно если у вас есть опыт winapi.

Открытым исходным кодом и кроссплатформенным родным братом MFC является wxWidgets, для меня решения/механизмы wxWidget очень похожи на решения / механизмы MFC.

Правка: забыл упомянуть некоторые важные вещи:
Qt довольно хорош, единственное, что мне в нем не нравится,-это сверхпрочный механизм сигнального слота и его генератор кода перед компиляцией. Но сам либерал-это вполне нормально. В Qt тоже есть много неграфических вспомогательные классы (например, контакты, в формате XML, ...)

Еще одна очень хорошая альтернатива-C++ Builder. Его графический редактор похож на графический редактор Delphi или .Nets gui builder, который, на мой взгляд, является лучшим. C++ Builder имеет тот недостаток, что вы должны придерживаться его компилятора C++, но если это нормально, то этот gui builder, вероятно, является лучшим инструментом RAD для редактирования графического интерфейса C++. Если вам интересно, каково это-разрабатывать GUI-интенсивное приложение с лучшими инструментами разработки gui, то обязательно попробуйте .Net, Delphi (pascal) или C++ Builder (который имеет точно такую же IDE, как Delphi).


Рейтинг:
0

KarstenK

MFC-это ваш выбор, если вы хотите C++ и Windows. На других платформах он не будет работать.

Если вы хотите переносимости, вам лучше изучить Java.

Я программирую MFC уже более 10 лет, но чувствую, что он исчезает. Я использую MFC для "GUI-Stuff" и выполняю тяжелую работу с C++.

Мой совет - не "учиться" MFC, а использовать подход "учиться на практике" для необходимых MFC-вещей. В codeproject есть тонны MFC-кода, так что вы можете узнать его здесь. ;-)


Albert Holguin

Ну... есть вино как слой переносимости для MFC.

KarstenK

Отличный аргумент в пользу использования MFC...

действительно....

Рейтинг:
0

VNyavotso

MFC V. Win32
Ну, есть те, кто имеет удовольствие работать с нуля; и вы, может быть, один из них (я один из них). С другой стороны, вы можете искать более быстрый и непосредственный способ достижения решения. Эти две возможности четко определят, каким будет ваш выбор.
Мое личное мнение таково: работа с чистым WinAPI вначале будет казаться "пустой тратой времени", но как только вы поймете это яснее, вы будете "летать, как рыба в воде". Для большинства вещей (функций, структур...) вы уже можете создать свои собственные классы/библиотеки. Используйте MFC, чтобы сделать все быстро (это один из основных принципов проектирования MFC), но твердое знание WinAPI будет хорошим оружием на этом пути.


Richard MacCutchan

Этот вопрос был открыт и на него был дан ответ почти 3 года назад. Ваши комментарии слишком запоздали и не добавляют ничего нового.