Так вот, немного пошарил в нете, понял что есть такие штуки, как WinForms и WPF. Еще так же есть вариант winAPI. И вот тут у меня ступор — где, что и как? Помогите разобраться, какие технологии применяются для создания интерфейсов с пом.С++ в MSVS; что лучше использовать на сегодняшний день? А так же посоветуйте нормальную литературу на этот счет.
Проект в рамках университета (небольшая программка по электротехнике для расчета всяких величин по заданой схеме), если это важно.
И все же повторюсь в своем вопросе: что нужно знать и что нужно изучать, что бы начать писать GUI на С++ с пом. Visual Studio?
Отслеживать
20.1k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
задан 28 апр 2014 в 12:27
hamsternik hamsternik
501 3 3 золотых знака 8 8 серебряных знаков 29 29 бронзовых знаков
На сегодняшний день лучше вообще не писать графические интерфейсы на C/C++. А для обучения при первой же возможности надо уходить с винды. Если требуют курсач с MSVS, но можете сменить тему курсача на что-нибудь неграфическое — меняйте.
Изучение TKinter за 8 минут / Разработка GUI программы на Python
28 апр 2014 в 12:35
WPF — это вообще не про С++. Winforms в общем-то тоже, хотя завести его на С++ можно. Правда, если мне не изменяет память, это будет С++/CLI, что далеко не то же самое, что и собственно С++
28 апр 2014 в 12:35
Согласен, и честно — я бы только «за», к примеру писать на том же python! Но задача, к сожалению, поставлена так, что нужно(!) писать все на С++ (т.к. изучается конкретно этот язык), с использованием инструмента MSVS(вопрос — а Visual studio — это инструмент?). Вот поэтому и встал такой вопрос — что нужно знать для написания GUI с пом.С++ и майкрософтовского продукта.
28 апр 2014 в 12:38
Окей. А для чего WPF? Просто, на сколько я понял, что его можно использовать и для C++. Хотя с гугле почти 100% от общего кол-ва запросов выдает WPF в связке с C#! Ага, на сколько я понял: WinForms == C++/CLI?
То есть мне нужно изучить C++/CLI, что бы уметь писать GUI?
28 апр 2014 в 12:40
Есть еще MFC, старый как то, что бывает старым, и лучше бы вам его не откапывать. И WTL, который на слуху и, кажется, я слышал о нем неплохие отзывы.
28 апр 2014 в 12:40
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Самое, что вам ближе — это MFC. WinForms — это не С++, это C++/CLI, который работает на платформе MS .Net Framework.
Беда MFC в том, что это тонкая прослойка над WinAPI там шаг влево-шаг вправо от идеологии фреймворка — пропасть.
Писать годные интерфейсы можно и нужно. Но, к счастью или несчастью, Qt здесь почти безальтернативен. Пусть он превносит в язык расширения в виде сигналов-слотов, как следствие — предобработки исходного кода MOC’ом, но это действительно юзабельный бриллиант в мире C++.
В академических целях, желательно овладевать чистым C++, в разумных пределах — WinAPI. Реальные более-менее сложные, переносимые интерфейсы можно писать wxWidget, GTKmm и иже с ними, just for fun.
Как в Python писать программы с интерфейсом?
Но Qt — это настоящее и будущее C++)
ЗЫ Плагин Qt позволяет писать из-под MSVS. Однако, студия враждебна к юникоду.
Источник: ru.stackoverflow.com
Лекция 7, 8. Программирование графического интерфейса пользователя
Лекция 7, 8 3. Управляющие кнопки, которые позволяют запускать и останавливать процесс расчета, перерисовывать результаты, выходить из задачи. 4. Поясняющие надписи (статический текст).
Конечно, возможны и другие элементы управления, такие как прокручиваемые списки, радио-кнопки для выбора одного из многих вариантов и т.д., но сейчас мы подробно сосредоточимся только на перечисленных в списке четырех типах. В системе MATLAB предусмотрены два способа организации интерфейса с пользователем.
Первый из них словно назовем динамическим . Он заключается в том, что на стадии выполнения программы создаются те или иные графические объекты и их свойствам присваиваются соответствующие значения. Для этого используются специальные функции, такие как Uicontrol , Uimenu и Uicontextmenu , которые мы рассмотрим чуть позже.
Но для упрощения работы и создания однотипных элементов интерфейса в системе MATLAB имеется специальная программа, которая позволяет на уровне визуального программирования, почти без написания кода создать требуемые элементы. 1.1. Проектирование графического интерфейса пользователя.
Сейчас мы рассмотрим использование MATLAB для разработки внешнего вида графического интерфейса ( GUI -GraphicsUserInterface) с использованием средств графического (визуального) программирования. Для вызова визуального редактора необходимо в командном окне MATLAB набрать команду guide или выбрать команду меню File|New|GUI . На экране дисплея будет выведено диалоговое окно GUIDE Quick Start (см. на рис. 1).
Это окно позволяет выбрать дальнейшее направление работ: создать новую заготовку для GUI-приложения (пустую или предопределенного формата) или открыть же существующий (но требующий доработки или переработки). Рис. 1. Диалоговое окно GUIDE Quick Start. Для создания «чистой» новой заготовки здесь нужно выбрать позицию Blank GUI и нажать OK.
Тогда появится окно редактора, содержащее как саму заготовку, так и палитру графических элементов управления (см. рис. 2).
Лекция 7, 8 Панель инструментов для управления приложением Палитра графических элементов управления Заготовка окна приложения Рис. 2. Окно редактора GUIDE. На рисунке 3 в увеличенном виде представлена палитра элементов управления редактора GUIDE, при этом дана краткая характеристика каждого элемента.
Выбор режима | |
выделения объектов в | |
окне приложения. | Кнопка |
Кнопка. | переключатель. |
Переключатель. | Флаг. |
Область ввода текста. | Текстовая область. |
Полоса скроллинга. | Рамка. |
Список. | Раскрывающийся |
список. | |
Оси. |
Рис. 3. Палитра элементов управления редактора GUIDE. Перед созданием графического интерфейса желательно «разработать проект» того, что вы хотите иметь в качестве интерфейса. В качестве демонстрационного примера мы рассмотрим разработку приложения для решения квадратного уравнения ax 2 + bx + c = 0 . Для этого предположим, что нам хотелось бы видеть на форме главного приложения три окна для ввода коэффициентов уравнения, два
Лекция 7, 8 | |
окна для отображения значений найденных корней и кнопку для запуска алгоритма вычисления | |
корней после вода очередных значений коэффициентов. В этом приложении очень полезным бы | |
оказалось бы окно, воспроизводящее график функции | y = ax 2 + bx + c и визуально подтверждающее |
расположение найденных корней. | |
Окно вывода | Окна ввода |
графика | коэффициентов |
a= | |
b= | |
c= | |
Решить | |
x1= | |
x2= | |
Кнопка для вычисления | Окна вывода |
корней уравнения | |
корней уравнения. |
Рис. 4. Эскиз окна предполагаемого приложения. На первом этапе необходимо разработать внешний вид интерфейса. Пусть по нашему предварительному эскизу интерфейс должен выглядеть приблизительно следующим образом (рис. 4).
Элементами этого интерфейса являются окно вывода графика ( Axes/Оси в терминах палитры элементов), пять статических надписей “a=”, “b=”, “c=”, “x1=”, “x2=” ( Static Text/Текстовая надпись ), три окна ввода/редактирования данных ( Edit Text/Область ввода текста ), два окна вывода данных ( Static Text/Текстовая надпись ) и одна кнопка ( Push Button/Кнопка ). Теперь мы можем непосредственно приступить к созданию интерфейса пользователя. Для создания окна, в котором будет выводиться график, используется кнопка ( Axes ). Щелкнув по этому элементу на панели палитры элементов управления и переведя мышь на панель рисунка, необходимо поместить крест, который будет на кончике мыши, в то место, где должен находиться левый верхний угол окна.
Нажав и удерживая левую кнопку мыши, необходимо вытянуть получающийся прямоугольник до нужных размеров. Для создания редактируемых окон ввода используется кнопка
Надписи на панели рисунка, а также результирующих значений корней уравнения создаются с помощью кнопки ( Static Text ), которая переносится и выравнивается аналогично вышеописанному. Для создания и размещения кнопки используется панель
Лекция 7, 8 ними с помощью кнопки выравнивания ( Align Objects ). Для задания ряда объектов, с которыми будут выполняться какие-либо действия (в частности выравнивание), необходимо их выделить, щелкая по каждому из них при нажатой клавише Shift . Выделенные объекты отмечаются черными точками вокруг соответствующих объектов. После этого необходимо на панели инструментов щелкнуть по кнопке
, после чего появится соответствующе окно выравнивания, с помощью которого несложно выполнить требуемые действия.
При необходимости изменить размер какого-либо объекта (кнопки, окна и т.д.) необходимо щелкнуть по этому объекту с помощью левой кнопки мыши и с помощью мыши изменить требуемый размер так же, как и размер любого окна Windows. Выделенный объект можно перемещать, используя клавиатуру, с помощью клавиш вверх, вниз, влево, право, что очень удобно.
Следует также отметить, что уже созданные и размещенные на панели рисунка объекты можно с помощью стандартных средств Windows копировать и вставлять, тем самым создавать новые объекты с такими же свойствами. Рис. 5. Размещение элементов управления на панели рисунка.
Выполняя вышеописанные действия, добиваясь внешнего сходства с разработанным нами эскизом, мы можем получить заготовку представленную на рисунке 5. После того как мы разместили требуемые объекты, мы можем задать их свойства. Например, задать соответствующее свойство ( String ) для надписей такие как “a=”, “b=”, и т.д. вместо значений по умолчанию – “Static Text”, определить способ выравнивания текста в окнах ввода (свойство HorizontalAlignment значение “left” ) и т.п. Для этого используется редактор свойств, который вызывается либо при помощи кнопки Property Inspector
Лекция 7, 8 Рис. 6. Редактор свойств. Таким способом можно изменить все свойства выделенного объекта: видимость, цвет, расположение и его размеры, имя шрифта надписи, размер шрифта, выравнивание надписи и т.д. Всего для всех графических элементов управления предусмотрено 41 свойство большинство из которых имеют вполне приемлемые значения по-умолчанию.
Одно из полезных свойств графических объектов это свойство Tag . Оно содержит имя объекта (не путать с надписью на объекте – свойство String ) и используется для доступа к конкретному объекту. По-умолчанию, редактор GUIDE задает свойству Tag значения: text1, text2, text3, edit1, edit2, edit3, pushbutton1 и т.д. Однако нам следует задать более осмысленные значения.
Так для информационных текстовых надписей свойству Tag зададим значения: textA, textB, textC, textX1, textX2; для текстовых надписей в которые мы будем выводить значения корней уравнения: textOutX1, textOutX2; для редактируемых окон ввода: edA, edB, edC; для кнопки pbtnSolve. Выполнив настройку всех свойств объектов, необходимо сохранить наш проект.
Для этого необходимо выполнить команду главного меню File|Save As… и задать имя файла, под которым результаты работы будут сохраняться. Назовем его, например, «MyRoot2».
При этом создаются сразу два файла с одинаковым (заданным пользователем – «MyRoot2») именем и с расширениями fig и m. Бинарный файл с расширением fig содержит в закодированном виде сведения о графических элементах управления, а текстовой m-файл содержит код на M-языке. Содержание последнего m-файла может обескуражить неподготовленного пользователя, но пугаться не стоит.
Большая часть строк этого файла представляет подробный комментарий. Первая строка – это заголовок нашей функции “MyRoot2”, вызов которой из командной строки собственно и открывает созданное нами окно пользователя. Строки 2-25 представляют собой подробный комментарий нашей функции.
В строках 26-46 располагаются команды инициализации приложения, и менять в этих строках ничего нельзя. Строки 46-65 занимает так называемая «открывающая» функция с именем MyRoot2_OpeningFcn, которая всегда вызывается при открытии приложения. Следующая функция (строки 66-75) MyRoot2_OutputFcn условно можно назвать «закрывающей». Она срабатывает перед завершением приложения.
Далее идут так называемые функции обработки событий (о которых пойдет речь дальше). К счастью, детально разбираться во всех тонкостях вышеперечисленных функций нам не придется, в чем вы убедитесь далее. 1.2. Программирование событий. Обработчик Callback.
Лекция 7, 8 Чтобы запустить наше приложение достаточно ввести в командной строке MyRoot2, или выполнить команду Tools|Run главного меню редактора GUIDE, или просто нажать кнопку на панели инструментов. Приложение запускается в отдельном окне с заголовком MyRoot2 (рис.7).
Пользователь может нажимать на кнопку, вводить какую либо текстовую информацию в редактируемые окна, однако, при этом ничего полезного не происходит. Недостаточно разместить элементы интерфейса в окне приложения, следует позаботиться о том, чтобы каждый элемент выполнял нужные функции при обращении к нему пользователя.
Так, при нажатии на кнопку необходимо чтобы был выполнен расчет корней уравнения и был выведен результат. Для этого необходимо запрограммировать обработчик событий Callback для кнопки pbtnSolve. Рис. 7. Приложение MyRoot2. Закроем наше приложение MyRoot2 и в редакторе GUIDE щелчком мыши выделим нашу кнопку pbtnSolve (с надписью «Решить»), после чего выполним команду View | Component Callbacks | Callback (Вид | Отобразить Callback-функции | Callback) – рис.8.
Лекция 7, 8 Рис.8. Переход в тело Callback-функции. Конструктор интерфейса формирует заготовку для обработки указанного события и переводит нас в окно редактора кода на позицию, которую пользователь должен заполнить:
% — Executes on button press in pbtnSolve. | |||||
function pbtnSolve_Callback(hObject, | eventdata, handles) | ||||
% hObject | handle to pbtnSolve (see | GCBO) | version | of MATLAB | |
% | eventdata | reserved — to be defined | in a future | ||
% | handles | structure with handles and user data | (see GUIDATA) |
Комментарий в первой строке свидетельствует о том, что функция выполняется при щелчке по кнопке pbtnSolve. Среди параметров, передаваемых функции, важны первый и третий. Первый hObject является указателем (дескриптором) на объект, инициировавший событие callback, т. е. на кнопку pbtnSolve. Третий handles — структура, содержащая поля с указателями на все интерфейсные элементы, установленные на фигуре (в нашем примере таковыми являются указатели handles.edA на редактируемое окно edA, handles.edB на редактируемое окно edB, handles.textOutX1 на текстовую область textOutX1 и т.д.). Теперь приступим непосредственно к заданию алгоритма действий который будет выполняться при нажатии на кнопку pbtnSolve («Решить»). % — Executes on button press in pbtnSolve.
function pbtnSolve_Callback(hObject, | eventdata, handles) | ||||
% hObject | handle to pbtnSolve (see | GCBO) | version | of MATLAB | |
% | eventdata | reserved — to be defined | in a future | ||
% | handles | structure with handles and user data | (see GUIDATA) |
%сохраняем дескрипторы
Лекция 7, 8 | %на оси axes1 | ||
hAxes=handles.axes1; | |||
hA=handles.edA; | %на окно ввода edA | ||
hB=handles.edB; | %на | окно | ввода edB |
hC=handles.edC; | %на | окно | ввода edC |
hX1=handles.textOutX1; %на окно вывода textOutX1 hX2=handles.textOutX2; %на окно вывода textOutX2 %делаем активным оси с дескриптором hAxes и очищаем их axes(hAxes); cla; %Получаем из редактируемых окон ввода edA,edB,edC %их значения с помощью функции get и с помощью %функции str2num переводим их в числовой вид str=get(hA, ‘String’ ); a=str2num(str); str=get(hB, ‘String’ ); b=str2num(str); str=get(hC, ‘String’ ); c=str2num(str); %формируем вектор коэффициентов полинома — p %и с помощью функции roots находим корни уравнения p=[a b c]; x=roots(p) %в переменные xr1 и xr2 помещаем действительную %часть корней уравнения xr1=real(x(1)); xr2=real(x(2)); %задаем промежуток [xmin,xmax] для построения %графика функции y=ax^2+bx+c xmin=min(xr1,xr2)-0.5; xmax=max(xr1,xr2)+0.5; %формируем вектор аргументов xx=xmin:0.1:xmax; %вычисляем вектор значений и строим график yy=polyval(p,xx); plot(xx,yy) grid on %выводим значения найденных корней в %текстовые области textOutX1 и textOutX2 %предварительно преобразуя числовые значения %корней x(1) и x(2) в строковые с помощью %функции num2str set(hX1, ‘String’ ,num2str(x(1))); set(hX2, ‘String’ ,num2str(x(2))); В тексте программы приведен подробный комментарий, поясняющий каждое действие. Отметим только новые для нас функции, это:
Лекция 7, 8 • cla (Clear Axes) – удаляет все графики в текущих осях; • str2num(str) – преобразует строку str в число (если возможно, иначе будет ошибка); • num2str(x) – преобразует x число в строку; Если мы теперь запустим наше приложение на исполнение, то получим работоспособную интерфейсную программу, показанную на рисунке 9. Рис.9. Программа решения квадратного уравнения.
2. Динамическое программирование графического интерфейса пользователя. 2.1. Функция uicontrol для разработки интерфейсных программ. Функция uicontrol является основной функцией для динамической разработки интерфейсных программ. Она размещает в памяти и высвечивает на указанном графическом окне интерфейсные элементы.
Следующие две строки открывают графическое окно и размещают на нем интерфейсный элемент. h1=figure; hu=uicontrol(h1); Тип интерфейсного элемента, его размеры, расположение в графическом окне, цвет и т.д. определяются значениями свойств интерфейсного объекта. Посмотреть все возможные поля объекта и их значения по умолчанию можно командой set(hu) . В следующей таблице приводятся некоторые свойства интерфейсных объектов и их возможные значения. Значения по умолчанию выделены в фигурные скобки.
Свойство | Назначение |
BackgroundColor | Определяет цвет объекта. |
FontUnits | Единицы измерения размера шрифта. Возможные значения |
[ inches | centimeters | normalized | | pixels ] | |
FontName | Имя шрифта. |
Источник: studfile.net
Что такое программирование на интерфейсах? Поиграем в архитектора
Может быть, когда-то ты слышал, есть такая штука как «программирование на интерфейсах». Пора познакомиться с этим поближе. Тут будет мало текста и много кода (без логики). Я не смог найти, когда появились первые интерфейсы. Наверно это было очень давно, и интернет об этом забыл. Ну да ладно. Идея интерфейса простая: описать, что мы будем делать без подробностей. Т.е. неважно, как вы это сделаете, важно, что вы сделаете. Зато после того, как я написал эту статью, я нашел хорошую, на похожую тему, тут в группах. Жмакай по ссылке и читай, чем больше, тем лучше! Содержимое:
- Зачем это нужно?
- Что это дает разработчику?
Зачем это нужно?
Когда код состоит из одного класса, это нафиг не нужно. Но когда классы должны взаимодействовать между собой, а их количество — переваливать за несколько десятков, тут впору задуматься о проектировании. Сначала продумать всю структуру проекта сверху вниз (от максимальной абстракции к реализации). Если над проектом работает несколько человек, то очень удобно договориться, описать интерфейсы взаимодействия классов, потом разобрать эти интерфейсы и начать реализовывать. Получается хорошая параллельность задач, их легко делить, т.к. все обо всем договорились, а подробности никого не волнуют.
Что это дает разработчику?
Разработчику не нужна реализация класса. Это значит, что после того как все договорились, он берет нужные ему интерфейсы и пользуется ими. Реализация будет подставлена, когда будет готова. Давай я покажу свой пример, и потом поговорим дальше. Я решил написать небольшой проект кассы.
Она будет помогать выбирать билеты, продавать их, сдавать деньги в банк и брать из банка, менять деньги для понаехавших. Итак, мой архитектурный выдох: P.S. не надо копировать и создавать структуру, для лиги лени я приложил архивчик с кодом в конце статьи 😉 Структура:
Куча моделек:
package cashbox.model; public enum Currency
package cashbox.model; public interface Transport
Пара exception:
package cashbox.exception; public class NoSoMuchMoneyException extends RuntimeException
package cashbox.exception; import cashbox.model.Money; public class NoSuchCurrencyException extends RuntimeException < private Money money; public NoSuchCurrencyException(Money money) < this.money = money; >public NoSuchCurrencyException(String message, Money money) < super(message); this.money = money; >public Money getMoney() < return money; >>
Касса — самая важная часть:
Первое, что бросается в глаза не подготовленному разработчику, это javadoc . Хотя, наверно, неподготовленному разработчику как раз они привычны. Это некоторые иногда лентяйничают, мой же код и так хорош, без доки 😉 Мне даже сейчас на некоторые вещи не хочется писать доку. Ну зачем писать транспорту, что это транспорт? Оставим это на потом! Я постарался доками описать все, что надо.
Теперь объясню, почему так писать код удобнее. Смотри, я сейчас могу дать тебе интерфейс CashBox и попросить его реализовать. Он же не трудный? Плюс требуемое поведение описано в документации. Тебе не надо будет ждать, пока кто-то напишет модели или ещё что-то. Ты берешь модели интерфейсов и начинаешь работать на их основе. Теперь ты программируешь на интерфейсах, поздравляю.
А теперь главное. Я могу дать тебе задачу реализовать CashBox , а так же ещё кому-то, чтобы у нас было 2 реализации. Например, пригородная и международная касса. Вы сможете писать код параллельно и любой член команды, который будет писать код на основе CashBox , может уже начинать и опираться на интерфейс. Это очень удобно.
Многозадачность, чтоб её. Ссылка на код на гугл диске -> тут
Источник: javarush.com