На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Графический интерфейс пользователя в приложениях на языке C++
    Сначала небольшое "лирическое отступление"

    GUI в Windows 7
    Прикреплённая картинка


    Графический интерфейс пользователя, или Graphical User Interface (сокр. GUI) представляет собой всю совокупность элементов, с которыми взаимодействует пользователь для работы с программой. Программы могут работать и без GUI, например, в фоне, выполняя какие-то системные задачи, а могут взаимодействовать через текстовый терминал –- консоль. Но у таких программ, как правило, ограниченная область применения, и их довольно немного. Большинство программ отображают GUI, в виде окон или изображений (скинов). Данная мини-статья как раз о том, какими средствами можно реализовать GUI в приложении на C++

    C++ является языком, описанным стандартом, и когда мы говорим C++, мы имеем ввиду не среду (IDE), не компилятор, а стандарт. И стандарт C++ не предусматривает работы с GUI, по крайней мере, на данный момент. Следовательно, любая высокоуровневая работа с GUI выходит за рамки стандарта, и за рамки языка, и является либо частью какой-либо IDE/ОС, либо отдельной кроссплатформенной/кросс-IDE библиотекой
    Рассмотрим сначала C++ IDE с поддержкой GUI

    CodeGear C++ Builder
    Данная IDE базируется на библиотеке Visual Components Library (VCL), написанной на паскале. Это значит, что любое приложение, созданное в этой IDE (без особых настроек), так или иначе, использует часть VCL для выполнения рутинных задач. VCL отвечает не только за GUI, это высокоуровневая обертка над Win32 API. Но, тем не менее, существенная её часть отведена под работу GUI, и избавляет программиста от нужды использовать непосредственно Win32API для построения GUI и управления оным.

    Плюсы:
    Очень удобный конструктор форм, работающий по принципу WYSIWYG.
    Возможность создавать собственные элементы управления, совмещая существующие, или используя собственную отрисовку и логику
    Каждый элемент представлен объектом (C++ классом)
    Легкая и интуитивно понятная обработка событий

    Минусы:
    Как и любая высокоуровневая обертка, вносит дополнительный код и замедляет работу приложения
    В связи с тем, что VCL написана на паскале, работа с ней из C++ довольно медленна

    Microsoft Visual C++
    Поддержка GUI в этой IDE зависит от выбранной технологии и типа проекта. Начнем с простого, Win32 Project. С этим типом проекта программисту доступны следующие технологии: Windows Template Library (WTL) и Dialog Templates.

    WTL представляет собой набор шаблонных классов, оборачивающих стандартные элементы управления Windows. Весьма незначительно упрощает работу, по сравнению с "голым" Win32 API, но позволяет писать объектный код, и упрощает некоторые манипуляции с GUI.

    Плюсы:
    Стандартные элементы управления представлены объектами

    Минусы:
    Имеет весьма ограниченный набор классов
    Неудобная работа с событиями
    Нет собственного конструктора форм

    Dialog Templates является технологией ОС Windows, и она не привязана к языку или IDE. Основной задачей DT является упрощение построения диалоговых окон. Поскольку DT представляют собой тип ресурсов Windows, конструктор DT является частью функционала редактора ресурсов. Редактор ресурсов VC++ содержит конструктор DT, но таким же конструктором может обладать любой редактор ресурсов Windows, ив качестве примера можно привести Restorator или ResHack (Замечание: в Express-версии VC++ нет редактора ресурсов, и, как следствие, конструктора DT. С этой версией следует использовать сторонние редакторы ресурсов).

    Плюсы:
    Поддерживается конструктор форм (*зависит от редактора ресурсов)
    Нет привязки к языку или IDE

    Минусы:
    Вся работа с DT осуществляется посредством Win32 API
    Конструктор форм ограничен только стандартными элементами управления

    Перейдем теперь к MFC. По сути, MFC является некоторой помесью WTL и DT, незначительно расширяя возможности DT и предоставляя объекты под э.у. а так же систему обработки событий
    Итак, MFC состоит из двух частей: DT с дополнительными MFC-функциями и библиотека классов, обеспечивающая взаимодействие с GUI. Библиотека классов MFC, в отличие от WTL, лишь частично базируется на шаблонах (ATL), использует иерархию классов, и незначительно упрощает взаимодействие с GUI. Основной особенностью библиотеки MFC является тесная интеграция с Win32 API, методы классов повторяют Win32 API функции, оттого работать с этой библиотекой достаточно трудно.

    Плюсы:
    Поддерживает конструктор форм (на базе DT, см. выше)
    Поддерживает работу с ActiveX
    Стандартные элементы управления представлены объектами

    Минусы:
    Относительная низкоуровневость классов, требующая знание Win32 API
    Неудобная работа с событиями

    Остался еще один тип проекта, который представляет собой Win32 Project с задействованием возможностей .NET Framework, как на уровне языка, так и на уровне классов, а, следовательно, и GUI. Называется он C++/CLI WindowsForms Project. Первая часть названия указывает на дополнения в языке C++, вторая на тип .NET проекта. C++/CLI проект, помимо стандартных библиотек, использует .NET Framework, в том числе и для работы с GUI. Технология WindowsForms поддерживается на уровне IDE, и имеет весьма удобный, не уступающий по качеству конструктору VCL, WYSIWYG-конструктор форм. .NET FW полностью избавляет программиста от необходимости работы с Win32 API для взаимодействия с GUI, а так же обеспечивает кроссплатформенность

    Плюсы:
    Очень удобный конструктор форм
    Возможность создавать собственные элементы управления
    Удобная работа с событиями
    Кроссплатформенность (ограниченная)

    Минусы:
    Зависимость от тяжелого (до нескольких сотен МБ).NET FW, который может отсутствовать в системе
    Привязка кода к IDE VC++

    На данный момент более нет IDE для C++, со встроенной поддержкой GUI. Посему, переходим к библиотекам. Наиболее распространены следующие сторонние библиотеки для GUI: Qt, Gtk+, WxWidgets. Все они кроссплатформенны, но не все объектно-ориентированы

    Qt ( Adil )
    Кроссплатформенная библиотека, не только для GUI, но и практически на все случаи жизни: состоит из раздельно подключаемых модулей - QtCore, QtGui, QtNetwork, QtSql и т.д.
    Имеется набор приложений для разработчика -
    QtDesigner - WYSIWYG редактор форм
    QtLinguist - средство локализации
    QtAssistant - справка в стиле MSDN
    На данный момент вышла вторая версия специализированной IDE QtCreator, где встроены QtDesigner, QtAssistant и редактор кода со многими современными фишками, редактор ресурсов, есть поддержка отладчика. Среда использует внешние компиляторы и отладчики.
    Так же существуют расширения для поддержки разработки в Qt в других IDE - MSVS, Eclipse.

    Распространяется под двумя вариантами лицензирования - свободной (LGPL) и коммерческой.

    Плюсы:
    Широкая кроссплатформенность. Есть реализация даже для встраиваемых решений - Qt Embedded
    WYSIWYG редактор форм, не уступающий VCL и .NET
    Возможность создавать собственные элементы управления
    Сравнительная лёгкость при локализации приложения.
    Свободное распространение с исходными кодами
    Весьма приличная документация.

    Минусы:
    Довольно тяжеловесна - исполняемый файл win32 со статически прилинкованной библиотекой весит от 4-5 МБт
    Довольно медлительна.
    Не совсем интуитивно понятная, особенно для новичка, система обработки событий SIGNAL-SLOT
    LGPL - всё-таки не самая свободная лицензия. В данном случае разработчик приложения с Qt должен обеспечить возможность переcборки своего приложения конечным пользователем с другой версией Qt, что означает, что приложение должно поставляться с исходными кодами или, как минимум, - с объектными файлами.
    Сборка библиотеки из исходников - весьма нетривиальное занятие (правда, имеются так же и готовые сборки, не требующие компиляции)

    wxWidgets ( MinLexx )
    Кроссплатформенная библиотека, в основном, для GUI, хотя и консольные приложения делать есть возможность. Позволяет создавать приложения для Windows, OS X, Linux/Unix, также для Win Mobile, iPhone SDK. Очень похожа на WinAPI (названия функций, констант, легко привыкаешь после WinAPI). Также есть классы для работы с сетью, файловой системой, итд. Билдится в 2х вариантах - с поддержкой Unicode и без (это кроме вариантов с Debug/Release). Легко строится из сырцов. Имеются сторонние дизайнеры UI (мне нравится wxFormBuilder, например). Как утверждают разработчики, wxWidgets приложения выглядят как родные на каждой платформе, потому что используют нативные элементы управления, а не занимаются эмуляцией GUI (отсюда, в частности, следует минус, что не все элементы ведут себя одинаково на разных платформах).

    Плюсы
    Достаточно маленькая (таки меньше Qt)
    Соединения событий и обработчиков напоминает систему из MFC со статической таблицей (BEGIN_MESSAGE_MAP / DECLARE_MESSAGE_MAP), равно как и есть возможность динамических соединений
    Есть возможность создавать собственные элементы управления
    Есть возможность локализации
    Свободное распространение с исходными кодами

    Минусы
    Все-таки недостаточно кроссплатформенная - некоторые функции не работают под Lin/Mac, или наоборот, под Win, или работают по-разному - это надо будет учесть
    Слабая документированность
    LGPL таки не совсем свободная лицензия
    Статически слинкованные с либой бинарники, все-таки, маленькими не назовешь

    Эта часть статьи требует дополнения

    Gtk+
    [описание]

    Плюсы:
    Минусы:



    В заключение, хотел бы напомнить, что нет понятия "лучшая GUI-технология", есть понятие "подходящая для данной задачи GUI-технология". Для каждой конкретной задачи взвешивайте все плюсы и минусы, и сами решайте, что будет наиболее удобно
    char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
    for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


    user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0978 ]   [ 17 queries used ]   [ Generated: 15.11.19, 06:20 GMT ]