[win32-gui] сравнение Qt и MFС

Landstreicher

Господа! Кто имел опыт работы с MFC (я сам не имел)? Прокомментируйте, плз, статью http://phil.freehackers.org/kde/qt-vs-mfc.html
Действительно, такие грабли имеются или же автор гонит?

Dasar

Если учесть, что MFC остановилась в своем развитии - лет 7 назад, то, конечно, прав.

sasha79

гг, все и так давно знают, что MFC - невероятный отстой.
с Qt работал не очень много, но впечатления остались приятные

enochka1145

Ален Голуб в своей книге "правила программирования на C/C++" постоянно брал примеры из MFC (ранних версий, правда) как примеры того, как делать не надо.

DiDiPi

Let's take the example of a dialog containing a CEdit control. You can not use the method GetWindowText on this field if you are not inside the DoModal method. It will fail miserably
Для модальных диалогов это так, поскольку окно модального диалога вне DoModal не создано (и window handle - HWND - 0 соответственно, о чем и пишут в документации поэтому только в DoModal.
Но там же можно и немодальные диалоги создавать. И уже по-другому.
template creates the view but it is not possible to access it.
Плохо читать такое без конкретного примера, че и как у него не получилось. Там действительно неочевидно до View добраться бывает( сначала до текущего CFrameWnd и т.д., потом уже GetActiveView, есть и др. способы). Но не невозможно.
Короче, обсуждать статью без конкретных примеров, а тем более делать выводы какие-то, не очень разумно.
Я ничего и никого не защищаю, просто статья как-то, имхо, неудачно написана.
PS
Еще про non-resizable edits, buttons. Да, в чистой MFC, к сожалению, так. Но на тех же codeguru.com, codeproject.com полно бесплатных resizable - контролов, ну и советов, как более сложные свои делать. Так что можно взять либо готовый (есть даже бесплатные для коммерческого использования) CResizableEdit, либо по статьям и советам свой писать.
Некоторые библиотеки на основе MFC (Stingray Objective Toolkit, BCG) поддерживают что-то там resizable.

DiDiPi

что MFC остановилась в своем развитии - лет 7 назад,
А почему до сих пор пишут и поддерживают библиотеки на основе MFC?
Мне приходилось работать с BCG.
Стоит всего 300$, а функциональность очень хорошая.

shlyumper

В общем, местами он, конечно, гонит, но в целом да MFC - это весьма убого. Оценить его хвалебные отзывы о Qt нет возможности - под Qt не писал, но есть подозрение, что и в Qt далеко не все так шоколадно, как обещают.

Slavaga

+1

Julie16

>Qt далеко не все так шоколадно, как обещают.
Как человек, который уже лет 5 пишет на QT, могу с уверенностью сказать что все именно так шоколадно Единственное с чем не согласен - со словами про layout engine. Иногда его трудно заставить делать то что нужно.

Dasar

> А почему до сих пор пишут и поддерживают библиотеки на основе MFC?
а почему до сих пор пишут и поддерживают библиотеки на Cobol-е, basic-е, fortran-е?
ps
Есть много кода, который использует MFC, есть много людей и компаний которые уже знают и используют MFC.
И только в основном поэтому MFC как-то держится.

shlyumper

Ну если сравнивать Qt vs. MFC, то тогда наверное нужно рассказать о том, как легко и удобно работать через Qt с ActiveX/OLE, особенно писать ActiveX компоненты и OLE серверы. Расскажи, как у Qt с этим обстоят дела?

Julie16

Великолепно обстоят дела. http://doc.trolltech.com/3.3/activeqt.html

Dasar

То, что написано по твоей ссылке - это и какой-нибудь ATL-умеет.
Как быть, например, с OLE-серверами?

Julie16

Слушайте, ну чего вы ко мне прикопались? Я винды и ихний апи уже пять лет в глаза не видел Я правильно понимаю что ole и mfc ну никак не связаны? Тогда я думаю что писать оле сервер под Qt и под MFC примерно одинаково по сложности.

Dasar

на сколько я помню, в MFC как раз входила поддержка разработки OLE-серверов.

shlyumper

Поддержка OLE-серверов в MFC входит, об этом уже написал. OLE и MFC очень даже связаны, в том плане, что в MFC для этого есть какой-никакой набор классов. А в Qt в этом плане нет ничего. Еще для разнообразия можно устроить benchmark на потребление памяти интерфейсом, и нагрузку на CPU, для одинакового интерфейса, реализованного на Qt и на MFC. Думаю, что для такого теста можно подобрать такие варианты, что будет рулить любой из наперед заданных GUI Toolkits.
Вообще, все сравнения у кого пися длиннее - у Qt или у MFC, или еще у кого - это такая глупость...

kokoc88

Есть много кода, который использует MFC, есть много людей и компаний которые уже знают и используют MFC.
И только в основном поэтому MFC как-то держится.
Я, например, прямо сходу могу придумать задачу, которую можно сделать на MFC/Win32, но нельзя на Windows Forms. Самые красивые и удобные библиотеки начинают просасывать, когда требуются нестандартные решения.

Dasar

И какую же?

kokoc88

Есть MDI окно. В нём есть дочерние окна. Надо внутри дочерних окон сделать ещё любое количество дочерних окон, которые должны иметь тайтл бар, ресайзиться, и т.п.

yolki

MDI разве не умер? Photoshop не в счёт
А что такое Windows Forms?

kokoc88

Термин MDI не в смысле MFC, он в смысле наличия дочерних и родительских окон особого типа.

Dasar

Не могу себе представить задачу, зачем такое извращение надо?
Чем не устраивают перетаскивающееся контролы? Зачем их делать честными windows-окнами?

kokoc88

Затем, что есть программа, в которой работают много модулей параллельно, и в этих модулях нужны окна, которые функционируют только внутри этих модулей и на них уже есть контролы и пр. Ну не буду я полностью проект описывать, просто это надо было сделать. На Windows Forms не получилось, а на MFC получилось.

Dasar

Чем не устраивают перетаскивающееся контролы? Зачем их делать честными windows-окнами?

Dasar

Сделать Custom control - у которого есть title, за который можно перетаскивать и все.
И работать будет быстрее, и выглядить будет лучше.

kokoc88

Тем, что они сами должны иметь на себе группы контролов. Слушай, не прикапывайся плиз к задаче. Она была, была реальной, и была сделана.

Dasar

> Тем, что они сами должны иметь на себе группы контролов
и? что мешает контролу в себе содержать еще толпу контролов?
ps
Ты предложил задачу, я тебе предлагаю решение - причем более правильное, соответствующее лучшим рекомендациям от microsoft-а.
и мне не понятно - чем это решение тебе не нравиться...

kokoc88

И чем этот контрол будет отличаться от окна?.. Ну ты это можешь сделать на Windows Forms?

Dasar

Политика же microsoft-а довольно четкая в этом плане.
Они говорят, что вставка одних top-левел окна в другие топ-левел окна (например, как в mdi) - это не правильно.
Что модель должна быть проще - есть топ-левел окна, и есть контролы, и другого не надо.

Dasar

Тем, что он будет контролом

public partial class Form1 : Form
{
public Form1
{
InitializeComponent;
}
private void Form1_Load(object sender, EventArgs e)
{
Control control = new Control;
control.Width = 40;
control.Height = 40;
control.BackColor = Color.Red;
this.Controls.Add(control);
Control control2 = new Control;
control2.Width = 20;
control2.Height = 20;
control2.BackColor = Color.Green;
control.Controls.Add(control2);
control.MouseDown += new MouseEventHandler(control_MouseDown);
control.MouseUp += new MouseEventHandler(control_MouseUp);
control.MouseMove += new MouseEventHandler(control_MouseMove);
}
void control_MouseMove(object sender, MouseEventArgs e)
{
if (isMove)
{
Control control = (Control)sender;
control.Location = new Point(startP.X + e.X - p.X,
startP.Y + e.Y - p.Y);
Console.WriteLine("{0}:{1},{2}", e.Button, e.X, e.Y);
}
}
void control_MouseUp(object sender, MouseEventArgs e)
{
if (isMove)
{
Control control = (Control)sender;
control.Location = new Point(startP.X + e.X - p.X,
startP.Y + e.Y - p.Y);
isMove = false;
}
}
bool isMove = false;
Point p;
Point startP;
void control_MouseDown(object sender, MouseEventArgs e)
{
if e.Button & MouseButtons.Left) == 0)
return;
isMove = true;
p = new Point(e.X, e.Y);
startP = Control)sender).Location;
}
}

kokoc88

Ну теперь ещё нужно туда прицепить тайтл бары, загнать внутрь другие контролы, добавить модальность (например, выполнение одного из этих окон модально в рамках MDI Child окна)... Что-то мне не кажется, что всё это так просто получится?..

Dasar

> нужно туда прицепить тайтл бары
одна строчка при отрисовке
одна строчка при определении надо двигать или нет
> загнать внутрь другие контролы
уже в примере есть внутренние контролы
> добавить модальность
это еще пара строчек в wndProc-е

shlyumper

offtopic:
вообще, интересная тенденция. Последнее время любой спор "технология от MS" vs. что-либо еще заканчивается всегда однозначно: "А вот .NET лучше!".

Dasar

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

shlyumper

Да я ж не спорю, мне .NET нравится. Просто тенденция забавная.

kokoc88

Не знаю как у тебя, но у меня этот кусок кода работает странно. Контролы дёргаются пока кнопку мыши не отпустишь, не успевают за движением мыши. Ну ладно, допустим это всё можно подогнать. Плюс ко всему вышеперечисленному надо добавить z order (то есть отслеживать клики на любой даже внутренний контрол клиппинг отрисовки, tab order внутри контролов, хотя бы кнопочку закрытия окна справа сверху... Эти замечания только сходу придумались... Так мне кажется, я на Win32 API быстрее выполню эту задачу. Как я уже написал, любое нестандартное решение превращает красивый Windows Forms в кучу извращений, так что пока я мнения не изменил...

kokoc88

Хотя да, ты убедил меня, что на Windows Forms это теоретически можно сделать. Когда мы копались, то пытались найти способ создать окна, что невозможно.

AVGO

вот что про MFC пишут сами буржуины.. http://msdn.microsoft.com/visualc/whidbey/mfc2005/default.aspx
статья полный чес - особенно прибил абзац про МСДН дальше даже читать не стал, и про Эдиты пример полностью бредовый.. сделал наследника и сделал все нужные методы безопасными для вызова после прибития окна.. все.. делов на копейку.с Qt не знаком, меня занесло прогать на MFC впечатление в целом терпимое, обертка вокруг апи нормальная, можно пользоваться этим самым апи напрямую или через врапперы, есть конечно минусы (Док-Вид это конечно страшный сон от которого нельзя проснуться) с удовольствием перешел бы на .NET, пока такого удоваольствия не предоставляется. вот может с выходом 2005 , обещают интеграцию и видимо в дальнейшем она углубится, инерция у MFC слишком большая, чтобы взять и выйти на ходу ...
Оставить комментарий
Имя или ник:
Комментарий: