визуальные средства разработки программных приложений

Тема 8.Основы визуального программирования

Цель

Познакомиться с принципами и основами технологии визуального программирования.

Задачи

Оглавление

Средствами визуального программирования обычно решают задачи построения пользовательского интерфейса и упрощения разработки приложения путем замены метода «написания программы» на метод конструирования.

Концепция визуального программирования реализована во многих современных средах разработки программных систем. Все ведущие фирмы, создающие средства для программирования и конструирования имеют системы, поддерживающие технологию визуального программирования.

Так, например, фирма IBM наиболее полно реализовала концепцию визуального программирования в среде VisualAge Smalltalk.

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

Поддержка графического интерфейса, предоставляемая готовыми компонентами, отвечает CUA (Common User Access) спецификациям и содержит ряд расширений для организации гибкого ввода-вывода в сложных формах и таблицах. Библиотека готовых компонент предоставляет также поддержку устройств мультимедиа, коммуникаций через протоколы APPC, TCP/IP, NetBIOS, программных интерфейсов CICS External Call Interface, EHLLAPI, Message Queue Interface (MQI), работу с реляционными базами данных семейств DB2, Oracle, Sybase и многое другое.

Фирма Microsoft, разрабатывая концепцию.NET Framework, создала Visual Studio.NET Enterprise Architect 2003, в которой реализовала все последние достижения в области программирования и в частности, в технологии визуального программирования.

Фирма Borland Software Corporation является первой компанией, открывшей независимый путь к.NET с Delphi 7, межплатформенной средой быстрой разработки приложений (RAD) для платформы Windows. Характерной чертой Delphi 7 является возможность разработки и развертывания корпоративных приложений. Это позволяет разработчикам создавать корпоративные приложения, от концепции к готовому продукту, еще быстрее с использованием нового UML™-дизайнера и технологии Model Driven Architecture™ (MDA™).

Мы рассмотрели роль и место визуального программирования в области современного программирования. Теперь перейдем к рассмотрению конкретных приемов и методов, относящихся к визуальному программированию. Рассмотрим использование компонентов и приемов визуального программирования в рамках Visual Studio.NET Framework фирмы Microsoft.

Основы визуального программирования

Сегодня принято визуализировать интерфейсы программного обеспечения. Визуализация снимает проблемы «общения» пользователем с программным продуктом. Графические изображения на элементах управления позволяют пользователю интуитивно разбираться в назначении этих элементов.

Возможно, именно наличие визуальных средств построения интерфейсов в таких языках, как Microsoft Visual Basic и Delphi, а также создаваемые с помощью этих языков визуальные программные интерфейсы, закрепили за ними термин «визуальное программирование». Безусловно, существует много других аналогичных продуктов (Visual C++, Borland C++ начиная с версии 4, Symantec Visual Cafe, C++ Builder и др.), но они не смогли завоевать такой популярности, как Visual Basic и Delphi. Именно благодаря Visual Basic, мир узнал о возможности визуального построения интерфейсов программ для Windows.

Визуализируемой моделью в Visual Basic и Delphi является окно (форма, диалог) Windows, а не код программы.

Обычной практикой является визуализация работы с элементами интерфейса, когда в качестве объектов визуализации рассматриваются визуальные компоненты, из которых состоят формы (окна и диалоги) интерфейса программы. Но и операторы программы можно рассматривать как объекты визуализации. В этом случае параметры операторов и функций программы можно настраивать при помощи окна свойств (PropertyBox), а сами операторы и функции хранится в списковой форме (табличной форме).

Рис.8.1. Визуализация разработки кода программы

Рис.8.2. Средства визуального программирования

Другим примером визуализации создания кода программы может служить процесс создания макро программ в Microsoft Excel (рис.8.3).

Рис.8.3. Диалог MS Excel при автоматической записи действий пользователя

Визуализируемой моделью в данном случае является рабочий лист Excel, в котором программист выполняет действия по обработке данных. Программный код пишется автоматически в фоновом режиме, при этом происходит описание в операторах языка VBA (Visual Basic for Application) всех визуальных действий пользователя.

Окно свойств Properties присутствуют, но не в самом рабочем листе, а в среде VBA (рис.8.4). Окно инструментов при выборе объекта Module выключается, но в случае редактирования программного кода для каждого программного объекта появляется раскрывающийся список со свойствами, методами и событиями, т.е. в каждой строке записи макроса в отдельности имеется возможность выбора или смены текущей команды макроса.

Пример получаемой программы, вызов которой в рабочем листе Excel можно организовать по командной кнопке или непосредственно по имени записанного макроса, приведен на рис.8.4.

Рис.8.4. Результат автоматической записи программного кода как протокола действий пользователя

Применение визуального программирования при построении интерфейса приложения в Visual Studio.Net

Рис.8.5. Визуальное программирование средствами Visual Studio.NET

Методы элементов программируются пользователем «вручную», но и тут имеются визуальные помощники: после двойного щелчка по элементу управления в конструкторе автоматически открывается окно редактора кода и автоматически пишется заголовок процедуры обработки события. Боле того, после набора имени объекта автоматически появляется список свойств и методов объекта (рис.8.6). Таким образом, процесс написания программного кода также частично визуализирован.

Рис.8.6. Визуализация свойств и методов объекта

Кроме элементов управления, как правило, в интерфейсе приложения присутствуют и другие стандартные компоненты, реализация которых также поддержана средствами визуального программирования, например, стандартные диалоговые окна.

Рис.8.7. Пример стандартного диалога

Рис.8.8. Программирование стандартных элементов средствами Visual Studio

Концепция.NET Framework и Visual Studio.NET предоставляют в распоряжение программистов огромную библиотеку объектов, ускоряющую процесс разработки приложений. Многие объекты в этой библиотеке имеют визуальное представление и дают возможность назначения свойств объекта в режиме конструирования с помощью окна Properties или диалогов с мастером-построителем.

Выводы

Визуальное программирование предусматривает создание приложений с помощью наглядных средств.

Средства визуального программирования обычно решают задачи построения пользовательского интерфейса и упрощения разработки приложения путем замены метода «написания программы» на метод конструирования.

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

Концепция визуального программирования реализована во многих современных средах разработки программных систем. Все ведущие фирмы, создающие средства для программирования и конструирования имеют системы, поддерживающие технологию визуального программирования.

Источник

Почему визуальное программирование и D3NE могут быть Вам полезны

Визуальное программирование позволяет описывать процессы в графическом виде, в отличии от текстового представления, где нужно приложить дополнительные усилия, чтобы мыслить так, как это должен выполнять компьютер. Звучит многообещающе, но попробуем разобраться в сути и выяснить, почему Вам стоит это попробовать.

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

Кадр из сериала «Кремниевая долина»

Часто советуют начать разработку ПО с графического описания будущей системы, ее компонентов и связей между ними, чтобы на ранних стадиях определить более выгодную структуру системы и минимизировать возможные проблемы в будущем. Графическое представление легче для понимания, чем текстовый вариант, но может иметь свои ограничения, к тому же это все равно придется переводить в понятный компилятору код. Конечно, на маленькие приложения (какими они могут казаться вначале) это не распространяется, можно сразу приступить к написанию кода, но проблема все равно остается — нужно думать в рамках определенного языка программирования. Тем более, когда вы это делаете в давно приевшемся вам императивном стиле.

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

Зачем и где применяют визуальное программирование

Одним из первых инструментов, более известных и дружелюбных для рядового гражданина, можно считать Scratch. Он предназначен исключительно для образовательных целей, так как представляет собой те же блоки кода, только обернутые в разноцветные пазлы. Практической пользы нет никакой, если вы уже умеете писать код.


Похожий инструмент от Google под название Blocky

Существует другой вид визуального программирования, более полезный на мой взгляд, это Data-flow programming. Он не такой гибкий как предыдущий и служит некоторой надстройкой для программирования процессов определенной тематики. Его суть состоит в манипуляции данными, передаваемыми между блоками (узлами).


Пример редактора узлов из Blender

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

Редактор узлов в Blender — именно тот случай, когда используется программирование потоков данных для управления рендерингом, создания шейдеров и текстур. Такой подход в 3D моделировании и рендеринге достаточно популярен, так как никому не хочется писать код, а создавать инструкции для нелинейного управления данными необходимо.

Также известный всем в сообществе 3D моделлеров это Substance Designer, который позволяет создавать 3D материалы по принципу, описанному выше.


Редактор для создания материала в Substance Designer

Хотя в официальных источниках упоминания о программировании нету, в нем используется самый настоящий data-flow. Наверное, это такой маркетинговый ход — не говорить о том, что может отпугнуть.

Итак, разобрались в том, почему визуальное программирование используется в 3D моделировании, но как насчет тех сфер деятельности, где без умения писать код не получится сделать достаточно функциональный продукт? Казалось бы, если умеешь писать код, то просто нужно развивать этот навык, но нет — именно в геймдеве одними из первых стали применяться инструменты для программирования без кодинга. С одной стороны, это было выгодно для популяризации геймдева среди тех, кого отпугивает код лишь одним видом, с другой — прогресс не стоит на месте и даже гуру программирования надоело ставить пробелы вместо табов чтение тысяч строк кода и его поддержка, и они решили попробовать новые методики описания логики и процессов.

Многие знают UE4 с его Blueprint’ом. Это уже не просто data-flow, а что-то большее, так как позволяет формировать инструкции, которые будут выполняться не за один проход, а в течении всего жизненного цикла.


Пример вывода строки по событию

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

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

Общие аспекты разработки редакторов узлов

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

Главное, от чего будет зависеть процесс разработки — платформа и технологии. В последнее время много чего можно сделать прямо в браузере, пусть даже пожертвовав производительностью, что в большинстве случаев никак не отразится на качестве приложения (в ином случае asm.js/wasm в помощь). Одна из особенностей таких приложений — они могут быть встроены в другие нативные приложения. Выбор инструментов и языков программирования должен быть в интересах разработчика, чтобы сделать процесс разработки более комфортным и эффективным и снизить вероятность выстрелить себе в ногу появления проблем.

Определившись с платформой и языком, было бы хорошо использовать готовые решения (в нашем случае речь идет о редакторе узлов), но и здесь не все гладко.
Есть несколько вариантов:

Что такое D3NE

D3 Node editor (D3NE) — это JS библиотека для создания редакторов узлов для решения задач визуального программирования. Библиотека полностью берет на себя работу по отображению и обработке узлов. Использует D3.js и Angular Light

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

Все началось с одного проекта (так он и лежит в draft’ах), в котором появилась идея применить что-то похожее на UE4 Blueprint, только с поправкой на то, что нужен просто data-flow. Среди готовых open source решений на JS не оказалось подходящих: критериями были внешний вид и необходимые возможности (например, разные типы сокетов, чтобы ограничить подключение несовместимых выходов и входов). Если первое еще можно было как-то подправить извне, то добавление второго могло бы вызвать проблемы, тем более если структура и исходный код оставляют желать лучшего.

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

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

Как применить в своем проекте

Для начала нужно выяснить, необходимо ли это вам. Конечно, попробовать для себя кое-что новое никогда не помешает (если это не навредит здоровью :) ), но при решении реальных проблем стоит подумать.

Лучше один раз увидеть, чем… в общем посмотрите примеры:


Пример кастомизации в стиле UE4

Рассмотрим основные компоненты, которые нужны для создания минимально работоспособного редактора

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

Узлы обычно представляют прямоугольниками (но можно это изменить в пределах вашей фантазии и возможностей CSS и HTML). Они могут иметь входы, выходы и контролы. Входы и выходы представляют сокеты и расположены в левой и правой части узла соответственно (опять таки вы можете их расположить как угодно, используя шаблоны).

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

Компоненты нужны для того, чтобы редактор знал какие в нем можно добавлять узлы и как их обрабатывать, а именно необходимы для поддержки импорта/экспорта. Используются так называемые билдеры и воркеры, обычные функции с соответствующим ключом, которые задаются при создании компонента (и должны находиться в одном месте).

Билдер отвечает за создание экземпляра узла — в функции вы создаете экземпляр, добавляете к нему нужные входы, выходы и контролы. Создается это именно программным путем, а не через конфиги (обычно такие реализации находил), чтобы позволить повторное использование, к примеру, контролов, а то и наследование узлов.

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

Один из основных объектов, который управляет всем вышеперечисленным с целью отображения и взаимодействия с пользователем. Ему передаются идентификатор, компоненты, контекстное меню.

Служит для обработки данных в узлах. Особенность в том, что ему нужны только данные, экспортированные из редактора, таким образом можно выполнять обработку узлов вовсе без наличия редактора (например, есть его реализация на С++). Именно этот компонент библиотеки отвечает за обход узлов, определяя с какого нужно начать обработку, вызывает ваши воркеры, передавая в них входные данные, полученные от предыдущих узлов. Может работать с асинхронными функциями, что не может не радовать на фоне поддержки браузерами async/await. Более того, за счет асинхронной обработки может параллельно выполнять несколько узлов.

Заключение

Как видим, визуальное программирование хоть и призвано заменить написание кода, но довольно редко используется в настоящий момент. Наверное потому, что многие скептически относятся к идее программирования мышкой. Это отчасти справедливо, так как большинство задач в разработке ПО привычнее будет решить на каком-либо языке программирования, чем использовать недостаточно проверенный инструмент.

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

Чтобы убедиться в этом и проверить, как говорится, на себе все описанные возможности, вы можете построить на основе D3NE свой редактор визуального программирования.

Источник

Визуальные средства разработки программных приложений

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

Рубрика Программирование, компьютеры и кибернетика
Вид шпаргалка
Язык русский
Дата добавления 26.06.2014
Размер файла 285,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Диалоговые окна. Типы диалоговых окон. Общие принципы программирования диалоговых окон. Использование ClassWizard для программирования диалоговых окон.

2. Формирование ресурса диалогового окна. Выбор элементов управления для диалогового окна.

3. Задание идентификаторов диалогового окна и элементов управления. Создание класса диалогового окна. Ассоциированные переменные.

4. Организация вывода диалогового окна на экран. Функция обмена данными между элементами управления и ассоциированными переменными. Иерархия вызовов функций при организации модального диалога.

5. Использование элемента управления типа «список». Стили окон списков. Сообщения от элемента управления типа «список» (LBN_). Некоторые методы класса CListBox.

6. Комбинированные списки (класс CCombobox). Стили окон комбинированных списков. Сообщения от элемента управления типа «комбинированный список» (CBN) Некоторые методы класса CCombobox.

7. Использование элементов типа переключатель (флажки, радио-кнопки). Статические поля (Static text). Окна редактирования (Edit box). Методы класса CEdit.

8. Обработка сообщений. Карты сообщений.

9. Реализация обработки сообщений в приложении с помощью ClassWizard. Виды сообщений.

10. Команды. Реализация обработки команд с помощью ClassWizard.

11. Архитектура «Документ-представление». Классы документа и представления.

12. Вывод на экран. Контекст устройства. Классы контекстов устройства в MFC.

13. Классы изобразительных средств. Примеры рисования простейших фигур.

14. Использование перьев. Работа с кистью.

16. Создание класса, обеспечивающего сохранение-восстановление объектов.

17. Использование основных методов класса CFile (Открыть файл, записать в файл, считать из файла. Привести пример записи в файл текущей выборки базы данных). Использование стандартных диалоговых панелей для открытия и записи в файл.

18. Панель инструментов и строка состояния. Добавление и удаление пиктограмм. Обработка сообщений от кнопок панели инструментов.

19. Доступ к данным в Visual C++. Технологии DAO, RDO, ODBC.

20. Доступ к данным в Visual C++. Технологии UDA, OLE DB.

21. Классы ODBC. Создание программы, работающей с БД на основе классов ODBC.

22. Регистрация БД. Создание заготовки приложения.

23. Создание экранной формы для отображения содержимого БД.

24. Добавление и удаление записей в технологии ODBC.

25. Сортировка и фильтрация записей в технологии ODBC.

26. Работа с несколькими таблицами в технологии ODBC.

27. Схема процесса обмена данными между источником данных и экранной формой с использованием классов CRecordSet и CRecordView. Режимы работы с наборами данных Snapshot и Dynaset.

28. Анализ текстов, созданных АррWizard для класса, производного от CRecordSet. (Функции DoFieldExchange(), GetDefaultConnect(), GetDefaultSQL() и др.).

29. Анализ текстов, созданных Арр Wizard для класса, производного от CRecordView. (Функции DoDataExchange(), OnInitialUpdate(), OnMove()). Связь ресурсов с ассоциированными переменными. Доступ к объекту «набор данных» (класса CRecordSet) из класса CRecordView.

30. Основные методы класса CDatabase.

31. Класс CRecordset. Компоненты данных и основные методы (открытие набора, получение атрибутов результирующего набора IsOpen, IsBOF, IsEOF, IsDeleted, обновление результирующего набора).

32. Класс CRecordset. Компоненты данных и основные методы (операции перемещения по результирующему набору, операции IsFieldDirty, IsFieldNull, Requary, SetFieldDirty, SetFieldNull).

33. Класс CRecordset. Переопределяемые методы (DoFieldExchange, GetDefaultSQL. GetDefaultConnect).

34. Класс CRecordView. Основные методы (конструктор, OnGetRecordSet, OnMove).

35. Технология ADO. Объектная модель, наборы ADO.

36. Применение ADO Data Control и DataGrid Control.

37. Удаление, добавление и редактирование записей в технологии ADO.

38. Сортировка и фильтрация записей в технологии ADO.

39. Настройка элементов управления ADO Data Control и DataGrid Control из кода приложения.

40. Обзор технологий ActiveX и OLE.

42. Управляющие элементы ActiveX.

43. Возможности АррWizard по созданию приложений, поддерживающих технологию ActiveX.

44. Библиотеки динамической компоновки DLL. Статическое подключение DLL. Экспортирование функций из DLL.

45. Библиотеки динамической компоновки DLL. Динамическая загрузка и выгрузка DLL. Экспортирование функций из DLL.

46. Создание и использование динамически связываемых библиотек. Привести пример.

47. Потоки в Visual C++. Создание рабочего потока. Управление приоритетами потоков.

48. Синхронизация потоков. Объекты синхронизации и классы MFC.

49. Потоки в Visual C++. Работа с исключающим семафором.

50. Потоки в Visual C++. Работа с критической секцией.

51. Потоки в Visual C++. Работа с семафором.

52. Потоки в Visual C++. Работа с объектом события.

53. Программирование сетевых приложений в Visual C++. Технология Windows Socket для взаимодействия приложений.

54. Модель клиент-сервер.

55. Создание сетевого приложения. Методы класса CAsyncSocket.

56. Создание сетевого приложения. Функции обработки событий для класса сокета.

57. Посылка и прием сообщения приложением.

58. Отладка программ в Visual C++. Точка останова. Установка точек останова. Команды и окна отладки.

59. Отладка программ в Visual C++. Анализ значений переменных. Окно CallStack.

1. Диалоговые окна. Типы диалоговых окон. Общие принципы программирования диалоговых окон. Использование ClassWizard для программирования диалоговых окон

В операционной среде Windows получить данные от пользователя приложение может через диалоговые окна.

Приложение может иметь любое количество диалоговых окон, в которых происходит ввод данных пользователем.

Библиотека классов MFC содержит класс Dialog (наследованный от базового класса CWnd), специально предназначенный для управления диалоговыми панелями.

Модальные и немодальные диалоговые окна. Большинство диалоговых окон, которые приходится включать в состав приложения, относятся к так называемым модальным окнам. Модальное окно выведено всегда поверх всех остальных окон на экране. Пользователь должен поработать в этом окне и обязательно закрыть его, прежде чем приступить к работе в любом другом окне этого же приложения. Примером может служить окно, которое открывается при выборе команды File\Open любого приложения Windows.

Немодальное диалоговое окно позволяет пользователю, не закончив работы с ним, работать в других окнах приложения, выполнить там необходимые действия, затем снова вернуться в немодальное окно и продолжить работу. Типичными немодальными окнами являются окна, которые открываются при отработке команд Edit\Find (Правка\Поиск) и Edit\Replace (Правка\Замена) во многих приложениях Windows.

Для каждого диалогового окна в приложении необходимо разработать две вещи: ресурсы окна и класс окна.

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

Так как класс диалоговой панели обрабатывает сообщения, то содержит таблицу сообщений и соответствующие методы-обработчики сообщений.

Ресурсы диалога создаются посредством редактора ресурсов, с помощью которого возможно включать в его состав необходимые элементы управления и размещать их в необходимом порядке. Класс окна создается при помощи ClassWizard. Как правило, класс диалогового окна в проекте является производным от класса CDialog, входящего в MFC. ClassWizard также поможет связать ресурсы окна с классом окна. Обычно каждый элемент управления, включенный в состав ресурсов диалога, имеет в классе окна соответствующий член-переменную. Для того чтобы вывести диалоговое окно на экран, нужно вызвать функцию- член его класса. Для того чтобы установить значения по умолчанию для элементов управления перед выводом окна на экран или считать состояние элементов управления после завершения работы пользователя, необходимо обращаться к членам-переменным класса.

Чтобы создать модальную диалоговую панель, сначала необходимо создать объект определенного в приложении класса диалоговой панели, а затем вызвать метод DoModal, определенный в классе CDialog.

2. Формирование ресурса диалогового окна. Выбор элементов управления для диалогового окна

Рис. 2.1. Добавление ресурса диалогового окна

Рис.2.2. Заготовка диалогового окна

Вызовите на экран диалоговое окно Dialog Properties для вновь создаваемого диалогового окна, выбрав в меню View\Properties или щёлкнув правой кнопкой мыши на диалоговом окне. В поле Caption (Надпись) введите заголовок диалога, как это показано на рис.2.3.

Рис.2.3. Окно свойств (Dialog Properties) создаваемого диалогового окна

Выбор элементов управления для диалогового окна достаточно велик. Для установки элементов диалогового окна используется технология, получившая наименование WYSIWYG (What You See Is What You Get) что видишь, то и получишь. Чтобы установить в своем окне кнопку, нужно выбрать ее образец на поле инструментария, перетянуть в желаемое место на поле заготовки окна приложения и сбросить ее там и заменить надпись.

Краткая характеристика основных Windows-элементов управления, используемых для построения диалога:

3. Задание идентификаторов диалогового окна и элементов управления. Создание класса диалогового окна. Ассоциированные переменные

Задание идентификаторов диалогового окна и элементов управления.

Создание диалогового окна Dialog

Установите элементы управления на поверхности диалога. Для этого щелкните мышью на пиктограмме соответствующего элемента управления, а затем щелкните на форме в том месте, где будет расположен этот элемент. Если посчитаете нужным, «ухватитесь» указателем мыши за один из размерных маркеров вокруг изображения элемента. С помощью его передвижения можно изменять границы размеров элемента.

Выберите переключатель One, вызовите окно Dialog Properties и установите в нем флажок Group (Группа). Такая установка означает, что переключатель One является первым элементом группы переключателей, т.е. именно к переключателям, объединенным в группу, будет в дальнейшем применяться принцип «только один прав».

Теперь добавьте в формируемое окно еще и элемент типа список. Установите его слева от переключателей и измените размеры. В то время, когда этот элемент еще остается выбранным, с помощью команды View=> Properties вызовите на экран окно Dialog Properties. Выберите вкладку Styles (Стили) и проверьте, не установлен ли флажок Sort (Сортировка). Если этот флажок установлен, то при выполнении программы элементы в списке будут отсортированы по алфавиту.

Создание класса диалогового окна.

Когда формирование ресурсов диалогового окна будет завершено, вызовите на экран диалоговое окно мастера ClassWizard. Для этого нужно выбрать View\ClassWizard. Мастер ClassWizard обнаружит новый диалог и предложит создать новый класс. Установите переключатель Create a new class (создать новый класс) и щелкните на ОК. Появится новое диалоговое окно New Class (новый класс). В поле Name (имя) введите имя нового класса (например, CSDIDialog) и щелкните на ОК. После этого ClassWizard создаст новый класс, подготовит файл текста программы SDIDialog.cpp и файл заголовка SDIDialog.h и включит их в состав проекта.

Создание ассоциированных переменных.

Ассоциированная переменная позволяет установить связь между текстом программы и ресурсами окна.

Ниже перечислены типы переменных, которые могут быть ассоциированы с тем или иным типом элемента управления:

Свяжите таким же образом значение, которое содержится в элементе IDC_EDIT1, с членом-переменной m_edit типа CString. Элемент IDC_LIST1 должен быть связан с членом-переменной m_list, который должен быть объектом класса CListBox (в списке Category должно быть избрано Control). Первый переключатель в группе IDC_RADIO1 должен быть связан с членом-переменной m_radio типа int, причем связь должна быть установлена по значению.

После добавления переменных ClassWizard предложит установить параметры, которые могут быть использованы для проверки достоверности ввода данных. Это делается не для всех видов переменных. Но, например, если речь идет о переменной, связанной с текстовым полем, СlassWizard предлагает в поле Maximum Characters (Максимум символов) установить максимальную длину вводимой строки. Для члена-переменной m_edit установите значение этого параметра равным 10. Если текстовое поле ассоциировано с переменной типа int или float, ClassWIzard использует эту же часть окна для установки верхнего и нижнего пределов вводимого пользователем значения. В дальнейшем всю работу по проверке соответствия введенного значения установленным ограничениям и выдачу в случае их нарушения сообщения с просьбой повторить ввод берут на себя функции из библиотеки MFC.

4. Организация вывода диалогового окна на экран. Функция обмена данными между элементами управления и ассоциированными переменными. Иерархия вызовов функций при организации модального диалога

Использование класса диалогового окна

Теперь, когда сформирован ресурс и подготовлен класс окна, можно создавать объект этого класса в программе (методе InitInstance) и выводить на экран связанное с ним диалоговое окно. Выведем диалоговое окно сразу после запуска приложения. Для этого используется функция DoModal().

Организация вывода диалогового окна на экран.

Теперь при трансляции компилятор будет знать, где взять информацию о классе CSDIDialog. Перейдите в конец текста функции CSDIApp::Initlnstance() в файле SDI.CPP и добавьте перед окончанием текста функции следующие строки:

Запуск и компиляция приложения. Запустите процесс компиляции и компоновки проекта, выбрав команду Build=>Build или щелкнув на пиктограмме Build (Построить) панели инструментов Build. Запустите выполнение приложения, воспользовавшись командой Build\Execute (Построить\Выполнить) или щелкнув на пиктограмме Execute (Выполнить) панели инструментов Build. Вы увидите, что на экране появилось диалоговое окно с параметрами элементов управления, установленными по умолчанию в программе, которую вы только что отредактировали.

После загрузки созданного вами приложения поменяйте что-либо в текстовом поле (например, введите текст hello), а затем щелкните на ОК. После этого на экране должно появиться окно сообщения.

Снова запустите приложение, отредактируйте текст в поле и выйдите из окна, щелкнув на Cancel. Обратите внимание на сообщение, гласящее, что в поле остался исходный текст hello. Это получилось потому, что MFC не дублирует содержимое текстового поля (как элемента управления) в переменную-член в случае, если пользователь щелкает на Cancel для выхода из окна. И снова, как и в предыдущем эксперименте, закройте приложение.

После того, как вы щелкнете на ОК, приложение выведет в окне сообщения копию текста, введенного в текстовом поле. Надпись в окне глаит: В”You clicked OK. Edit Box Is: hello”.

Если вы щелкнете на Cancel, приложение проигнорирует любые изменения элементов управления. Надпись в окне гласит: “You clicked Cancel. Edit Box Is: hello”.

Как это происходит? Когда вы щелкнули на OK, MFC организовал вызов функции OnOK(). Функция OnOK() унаследована от базового класса CDialog, классом-наследником которого является наш диалог. Помимо прочего в нем находится функция DoDataExchange(), подготовленная средствами СlassWizard. Вот как она выглядит в настоящий момент:

DDX_Control(pDX, IDC_LIST1, m_list);

DDX_Check(pDX, IDC_CHECK1, m_check);

DDX_Text(pDX, IDC_EDIT1, m_edit);

DDX_Radio(pDX, IDC_RADI01, m_radio);

Приложение не должно напрямую вызывать метод DoDataExhange. Он вызывается через метод UpdateData, определенный в классе CWnd. Необязательный параметр этой функции определяет, как будет происходить обмен данными.

Если метод UpdateData вызывается с параметром FALSE, то выполняется инициализация диалоговой панели. Информация из данных класса отображается в органах управления диалоговой панели.

В случае если метод UpdateData вызван с параметром TRUE, данные перемещаются в обратном направлении. Из органов управления диалоговой панели они копируются в соответствующие элементы данных класса диалоговой панели.

Метод UpdateData возвращает ненулевое значение, если обмен данными прошел успешно, и нуль в противном случае. Ошибка при обмене данными может произойти, если данные копируются из диалоговой панели в элементы класса диалоговой панели и пользователь ввел неправильные данные, отвергнутые процедурой автоматической проверки данных.

При создании модальной диалоговой панели перед тем, как панель появится на экране, вызывается виртуальный метод OnInitDialog класса CDialog. По умолчанию OnInitDialog вызывает метод UpdateData и выполняет инициализацию органов управления.

Если метод OnInitDialog переопределяется в классе диалоговой панели, в первую очередь необходимо вызвать метод OnInitDialog класса CDialog.

Метод UpdateData также вызывается некоторыми другими методами класса CDialog. Так, метод UpdateData вызывается, когда пользователь закрывает модальную диалоговую панель, нажимает кнопку «Ok».

Заметим, что кнопка «Ok» должна иметь идентификатор IDOK. Если пользователь нажмет на кнопку «Cancel», имеющую идентификатор IDCANCEL, то диалоговая панель также закрывается, но метод UpdateData не вызывается и обмен данными не происходит.

Методу DoDataExchange, который служит для реализации механизмов автоматического обмена данными, передается указатель pDX на объект класса CDataExchange. Этот объект создается, когда инициируется процесс обмена данными вызовом функции UpdateData.

Элементы данных класса CDataExchange определяют процедуру обмена данными, в том числе определяют, в каком направлении будет происходить этот обмен. Следует обратить внимание на то, что указатель pDX передается функциям DDX_ и DDV_.

Замечание. Если к диалоговой панели добавить новые органы управления и связать их средствами ClassWizard с элементами данных класса CDlg, то в блоке AFX_DATA_MAP будут размещены вызовы и других функций DDX и DDV, необходимые для выполнения обмена данными.

5. Использование элемента управления типа «список». Стили окон списков. Сообщения от элемента управления типа «список» (LBN_). Некоторые методы класса CListBox

Использование элемента управления типа список

Когда наступает время инициализировать диалоговое окно, перед выводом его на экран, вызывается функция-член класса CDialog OnInitDialog(). Для того, чтобы включить эту функцию в члены класса CsdiDialog необходимо воспользоваться услугами ClassWizard.

В окне ClassView щелкнуть правой кнопкой на CsdiDialog и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows). На экране появится окно New Message and Event Handlers. В списке New Windows Messages/Events выбрать WM_INITDIALOG и щелкнуть на кнопке Add Handler. Идентификатор сообщений исчезнет из списка в левой части окна и появится в списке Existing Messages/Event Handlers в правой части. Щелкнуть на нем и затем щелкнуть на кнопке EditExisting с тем, чтобы увидеть текст программы.

BOOL CsdiDialog:: OnInitDialog()

Для того, чтобы добавить функцию, которая будет вызываться после щелчка OK, нужно выполнить следующее.

В окне ClassView щелкнуть правой кнопкой на CsdiDialog и в контекстном меню выбрать команду Add Windows Message Handler (Добавить обработчик сообщений Windows).

В окне New Message and Event Handlers выбрать в списке Class or object to handle IDOK.

В левом списке New Windows Messages/Events выбрать BN_CLICKED. Этим вы выбираете функцию для обработки однократного щелчка на кнопке OK.

щелкнуть на кнопке Add Handler, появится диалоговое окно Add Member Function.

Согласитесь с предложенным именем OnOK(), для чего щелкните на OK.

Щелкните на кнопке EditExisting, появится текст программы. Вставьте в него несколько строк.

В окна списка почти всегда включают идентификатор стиля LBS_NOTIFY, что позволяет родительскому окну получать от окна списка сообщение WM_COMMAND.

По умолчанию, в списке допускается выбор только одного пункта. Если необходимо создать список с возможностью выборки сразу нескольких пунктов, то следует использовать стиль LBS_MULTIPLESEL.

По умолчанию, оконная процедура окна списка выводит только список элементов без какой-либо рамки вокруг. Рамку можно добавить с помощью стиля WS_BORDER.

Для прокрутки содержимого с помощью мыши и вертикальной полосы прокрутки следует использовать стиль WS_VSCROLL.

В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD. Стиль LBS_STANDARD включает в себя наиболее часто используемые стили списка. Он определяется как комбинация

Замечание. Также можно пользоваться стилями WS_SIZEBOX и WS_CAPTION, которые дают возможность менять размер окна и перемещать его по рабочей области родительского окна.

Замечание. Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Если окно списка имеет фокус ввода, то для выбора пунктов можно пользоваться как мышью, так и клавиатурой.

Когда Вы работаете со списком, вырабатываются уведомляющие сообщения (notification) от списка. Вы можете посмотреть все сообщения, которые можете обрабатывать в Message Map, если выберите IDC_list1 списка.

Замечание. Окно списка посылает коды уведомления LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY.

Некоторые методы класса CListBox

Метод для очистки содержимое списка, делает его пустым:

Метод для добавления элемента в список:

int AddString( LPCSTR lpszItem);

Добавляет строку lpszItem в список и cортирует его, если при создании включено свойство Sort. В противном случае элемент добавляется в конец списка.

Метод для удаления элемента из списка:

int DeleteString( UINT nIndex);

Удаляет из списка элемент с индексом nIndex. Индексация элементов начинается с 0.

Метод для получения индекса элемента, выбранного пользователем:

int GetCurSel() const;

Метод для программной установки отмеченного элемента списка:

int SetCurSel( int nSelect);

Методы для копирования содержания определенного элемента в буфер:

int GetText( int nIndex, LPSTR lpszBuffer) const;

void GetText( int nIndex, CString& rString) const;

Копирует элемент с индексом nIndex в буфер.

Метод для организации прокрутки списка в окне так, чтобы элемент с индексом nIndex был видимым:

int SetTopIndex( int nIndex);

Метод для организации поиска в списке:

int FindString( int nStartAfter, LPCSTR lpszItem) const;

Организует поиск в списке и возвращает в качестве результата индекс элемента списка, префикс которого совпадает со строкой lpszItem. Результат не зависит от регистра, в котором набирались символы сравниваемых строк.

Параметр nStartAfter задает начало поиска, но поиск идет по всему списку. Он начинается от элемента, следующего за nStartAfter, до конца списка и затем продолжается от начала списка до элемента с индексом nStartAfter. В качестве результата выдается первый найденный элемент, удовлетворяющий условиям поиска. Если такого нет, результат получает значение LB_ERR.

Этот метод отличается от предыдущего тем, что теперь не префикс элемента должен совпадать со строкой lpszFind, а сам текст элемента:

int FindStringExact( int nIndexStart, LPCSTR lpszFind) const;

Поиск по-прежнему не чувствителен к регистру, в котором набираются символы.

6. Комбинированные списки (класс CCombobox). Стили окон комбинированных списков. Сообщения от элемента управления типа «комбинированный список» (CBN) Некоторые методы класса CCombobox

Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили, коды извещения и сообщения, аналогичные списку ”CListbox”, а также некоторые сообщения, специфические для редактора текста класса “CEdit”.

При создании списка “CCombobox” указываются специальные стили комбинированного списка, символические имена которых имеют префикс CBS_.

Рассмотрим базовые стили комбинированного списка

Среди всех стилей комбинированного списка можно выделить три базовых:

Рассмотрим стили Combo box, которые задаются при его создании в меню PROPERTIES

When is list box visible?

Static or edit control?

По умолчанию предлагается Simple. В этом случае список постоянно отображен на экране. В поле ввода, располагающемся сверху, можно вводить любые данные. С помощью мыши можно выделять элемент в прикрепленном окне списка и он будет попадать в поле редактирования. Кроме того, если в поле редактирования набрать символы, совпадающие с начальными символами некоторых элементов списка, эти элементы станут первыми в списке.

Стиль Droplist (раскрывающийся). В этом комбинированном списке пользователь сможет выбирать элементы только из раскрывающегося списка. Для этого он, щелкнув стрелку, укажет нужную строку или введет первую букву из выделенной строки.

Combo box можно инициализировать в окне Properties. На вкладке Data есть окно Enter Listbox Items. Каждую строку в нем следует заканчивать Ctrl+Enter.

List box можно инициализировать только когда начинается диалог, в функции OnInitDialog, которая увязана с сообщением WM_INITDIALOG, класса CSDIDialog.

Рассмотрим сообщения от комбинированного списка, посылаемые родительскому окну

Коды извещения для комбинированного списка имеют символические имена с префиксом CBN_.

Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам

Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “CListbox” и редактора текста “CEdit”.

В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.

Многие методы Combo box и List box совпадают. В Combo box нет методов, связанных с множественным выбором.

Дополнительные методы, связанные с полем редактирования.

Получает начальную и конечную позиции в текущей отметке строки в поле редактирования.

DWORD dwCurSel = m_combobox.GetEditSel();

WORD dStart = LOWORD(dwCurSel);

WORD dEnd = HIWORD(dwCurSel);

BOOL SetEditSel( int nStartChar, int nEndChar );

Отмечает символы в поле редактирования. Чтобы выбрать первую позицию, вы должны указать начальную позицию (nStartChar) 0. Чтобы отметить до четвертой позиции включительно, вы должны указать номер первой позиции, следующей за отмеченной nEndChar=4.

Возвращает CB_ERR, если ComboBox имеет стиль DROPDOWNLIST.

int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

Копирует заголовок окна в буфер (lpszStringBuf) или строку (rString). Если окно является control (в нашем случае полем редактирования), копирует текст из поля редактирования.

Возвращает длину строки в байтах, не включая символ конца. Возвращает 0, если нет текста.

nMaxCount означает максимальное количество символов, которое может быть скопировано в буфер. Если строка длиннее, она обрезается.

int nLength = str.GetLength();

void SetWindowText( LPCTSTR lpszString );

Копирует строку (lpszString) в заголовок окна. Если окно является control (в нашем случае полем редактирования), копирует строку в поле редактирования.

int GetLBText( int nIndex, LPTSTR lpszText ) const;

void GetLBText( int nIndex, CString& rString ) const;

Получает строку из Listbox.

nIndex означает индекс строки, если индекс меньше нуля, или больше предельного значения возвращается CB_ERR.

lpszText означает указатель на буфер, который должен получить строку. Буфер должен иметь достаточно места и иметь символ конца строки. Размер строки должен быть определен заранее с помощью метода GetTextLen.

Возвращает длину строки в байтах включая символ конца строки. Возвращает ошибку LB_ERR, если возникает ошибка в индексе.

int SetItemData( int nIndex, DWORD dwItemData );

устанавливает 32-разрядное значение связанное с выбранным элементом

nIndex означает индекс элемента, который должен быть установлен,

dwItemData означает новое значение элемента.

DWORD GetItemData( int nIndex ) const;

Извлекает 32-разрядное значение связанное с выбранным элементом nIndex означает индекс элемента в списке.

Список может получать:

VK_SHIFT, VK_CONTROL, VK_ ALT и т.д.

VK_UP, VK_RIGHT, VK_LEFT, VK_ESCAPE, VK_RETURN,

7.Использование элементов типа переключатель (флажки, радио-кнопки). Статические поля (Static text). Окна редактирования (Edit box). Методы класса CEdit

Использование элементов типа переключатель.

Можно так организовать программу, что по умолчанию будет выбран один из переключателей.

Для выбора одного из переключателей в группе диалогового окна необходимо добавить следующий текст в функцию CSDIDialog::0nInitDialog():

Членом-переменной является m_radio, с которым связана группа переключателей. Она (переменная) представляет собой индекс выбранного переключателя в этой группе элементов управления (как всегда, индекс начинается с 0). Значение индекса 1 соответствует второму переключателю в группе. Вызов функции UpdateData() в этом фрагменте обновляет содержимое элементов управления диалогового окна соответственно состоянию связанных с ними переменных-членов. Аргумент функции UpdateData() указывает направление передачи данных: UpdateData(TRUE) обновило бы содержимое переменных соответственно элементам управления, т.е. переписало бы в m_radio индекс выбранного в группе переключателя.

Строки, которые следует включить в функцию CSDIApp::InitInstance():

msg += «Radio Selection: «;

«Статические поля (класс static)»

Рассмотрим некоторые стили статического окна

CEdit наследует методы от CWnd. Чтобы установить или получить текст из окна CEdit можно пользоваться методами CWnd SetWindowText и GetWindowText. Даже в случае многострочного окна. А также, если окно многострочное, получать или устанавливать часть текста путем вызова методов GetLine, SetSel, GetSel, ReplaceSel.

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

Список возможных сообщений от CEdit:

EN_CHANGE содержимое окна будет меняться. Так же как и EN_UPDATE сообщение посылается после того, как Windows обновит экран.

Если вы создаете объект CEdit внутри диалогового окна, он разрушается автоматически, когда пользователь закроет окно диалога.

Управляющие окна редактирования хранят текст в области памяти программы (в адресном пространстве программы). Содержимое управляющих полей редактирования ограничено примерно 32 килобайтами.

Рассмотрим стили окон редактирования

Текст в управляющих окнах редактирования может быть выравнен либо по правому краю, либо по правому, либо по центру. Формат можно задать с помощью стилей окна ES_LEFT, ES_RIGHT и ES_CENTER.

По умолчанию в управляющем окне редактирования имеется одна строка. Для создания такого окна с автоматической горизонтальной прокруткой следует добавить стиль ES_AUTOHSCROLL.

Приложение может создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для многострочного окна редактирования, если не задан стиль ES_AUTOHSCROLL, то текст автоматически переносится на новую строку при достижении правого края окна.

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • Визуальное программирование это что такое
  • Визуальное программирование что это
  • визуальное программирование мобильных приложений
  • визуальное программирование андроид приложений
  • Визуальное программирование scratch что это

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии