Разработка модуля для автоматического размещения текстовых надписей на рисунке в векторном графическом редакторе - Курсовая работа

бесплатно 0
4.5 212
Обзор средств разработки и технологий: особенности языка программирования Visual Basic и подсистемы WIN32 API. Методы, приемы решения задачи автоматического размещения текстовых надписей на рисунке. Механизм создания полигонального объекта. Код программы.


Аннотация к работе
Однако для решения некоторых прикладных задач стандартных средств языка бывает недостаточно, тогда программист имеет возможность обратиться к подсистеме win32 API для осуществления вызова к внутренним функциям операционной системы. Чтобы однозначно задать полигон в памяти программы необходимо указать координаты всех его точек. Проще всего задать координаты относительно левого верхнего угла устройства на котором будет отображен полигон. Второй вариант имеет наиболее высокую производительность, однако наиболее целесообразно будет применить для этой цели специальный пользовательский тип, принятый по умолчанию в Win32 API: Public type POINTAPI x as Long y as Long Шрифт текста выбирается по нажатию на кнопку «font» из специального диалога выбора шрифта.В качестве результата данной курсовой работы представляется компьютерная программа - модуль для графического векторного редактора. Программа позволяет вводить с помощью мыши полигональные объекты, находить центр тяжести введенного полигона, а также размещать на рисунке надпись, по линии симметричной относительно центра.

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

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

Изображение должно выводиться на стандартную форму Visual Basic. Работа с графикой осуществляется специальной подсистемой опирающейся на подсистему win32 API, конкретно библиотеку gdi32.dll.

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

2. Теоретическое обоснование методов и приемов решения поставленной задачи.

3. Программная реализация.

4. Подготовка отчета.

Обзор средств разработки и технологий

Условиями курсового проекта оговорена среда разработки Visual Basic 6.0, а также технология Win32 API.

Язык программирования Visual Basic.

Visual Basic представляет собой язык программирования высокого уровня. В составе интегрированной среды разработки (IDE) является языком для быстрого создания пользовательских приложений. IDE VB позволяет визуально проектировать интерфейс, предоставляет простой доступ к БД используя установленные в системе драйвера доступа к данным.

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

Набор встроенных функций VB достаточно обширен и многие из них созданы для решения типичных задач с которыми приходится сталкиваться программисту. Однако в случае нестандартных задач часто возникает ситуация когда применение высокоуровневых функций затруднено. В этом случае и приходит на помощь система библиотек Win32 API. Функции библиотеки есть базовые функции операционной системы и соответственно являются наиболее гибким инструментом для реализации поставленной задачи в среде Windows.

Подсистема Win32 API

Интерфейс прикладного программирования Win32 API (Application Programming Interface) - это программный интерфейс, который используется для управления операционной системой Windows. Win32 API состоит из набора функций и подпрограмм, поставляемых в виде динамически подключаемых библиотек (Dynamic Link Libraries - DLL), которые обеспечивают программный доступ к возможностям операционной системы.

Win32 API может интенсивно использоваться для расширения возможностей Visual Basic. Для использования некоторых вызовов API пользователю нет необходимости вникать в работу операционной системы.

Теоретическое обоснование методов и приемов решения поставленной задачи

Механизм создания полигонального объекта.

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

Для ввода координат используем событие MOUSEDOWN объекта PICTUREBOX, который представляет собой рабочее поле программы. Процедура - обработчик события получить координаты места щелчка, а также номер кнопки мыши.

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

1. Хранение в виде массива из двух элементов Array(x, y), который в свою очередь будет являться элементом массива содержащего все вершины полигона.

2. Хранение координат всех вершин полигона в двух массивах, отдельно для x, отдельно для y.

3. Хранение координат в пользовательском типе данных в одном массиве.

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

Второй вариант имеет наиболее высокую производительность, однако наиболее целесообразно будет применить для этой цели специальный пользовательский тип, принятый по умолчанию в Win32 API: Public type POINTAPI x as Long y as Long

End type

Записываем координаты в структуру и сохраняем ее в специальном массиве вершин полигона.

После ввода каждой новой вершины производим отрисовку сцены.

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

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

Нахождение центра масс

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

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

Тогда координаты центра масс определяться как сумма координат вершин отнесенная к их количеству, другими словами среднее арифметическое координат вершин:

Организация элементов интерфейса программы.

Текст, который будет отображаться на рисунке вводиться в специальное поле. Шрифт текста выбирается по нажатию на кнопку «font» из специального диалога выбора шрифта. Диалог выбора шрифта создается с помощью компонента Common Dialog, который входит в число стандартных компонентов для Windows XP.

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

Рабочее поле программы представлено компонентом PICTUREBOX, конфигурированным определенным образом. Для нормальной работы необходимо, чтобы окно сохраняло полученное изображение. Для этого мы устанавливаем свойство AUTOREDRAW в значение True, это несколько замедляет работу компонента, но делает изображение «постоянным». После отрисовки на таком PICTUREBOX всякий раз необходимо вызывать метод Refresh для отображения рисунка.

Отображение

Отображение сцены происходит в несколько этапов.

Сначала рисование полигона, затем рисование центра масс, рисование линии и вывод текста.

Рисование полигона

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

Рисование центра масс и линии проходящей через него

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

Отображение текста.

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

Для конфигурирования устройства необходимо определить структуру LOGFONT.

"структура шрифта win32 API

Public Type LOGFONT "высота шрифта

IFHEIGHT As Long

"ширина

IFWIDTH As Long

"поворот шрифта

IFESCAPEMENT As Long

IFORIENTATION As Long

"толщина шрифта

IFWEIGHT As Long

"настройки шрифта

IFITALIC As Byte

IFUNDERLINE As Byte

IFSTRIKEOUT As Byte

IFCHARSET As Byte

IFOUTPRECISION As Byte

IFCLIPPRECISION As Byte

IFQUALITY As Byte

ISNGPITCHANDFAMILY As Byte

"шрифт

IFFASENAME(LF_FACECIZE - 1) As Byte

End Type

Эта структура однозначно описывает, то как текст будет отображен на устройстве. После заполнения структуры вызываем API функцию CREATEFONTINDIRECT. Функция возвращает длинное целое число, которое является указателем на объект - шрифт.

Сейчас необходимо применить созданный шрифт к устройству.

Выбираем шрифт с помощью функции SELECTOBJECT. Функция возвращает длинное целое значение - указатель на объект который был установлен на устройстве до этого. Этот объект есть шрифт который использовался устройством до этого. Сохраним этот дескриптор, для восстановления его после рисования.

Выводим текст.

Реализация программы.

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

Программный код.

Объявления API функций.

"некоторые константы для шрифта

Public Const LF_FACECIZE = 32

Public Const LOGPIXELSY = 90

"тип точка, "стандартный Win32 API тип

Public Type pointapi x As Long y As Long

End Type

"структура шрифта win32 API

Public Type LOGFONT

IFHEIGHT As Long

IFWIDTH As Long

IFESCAPEMENT As Long

IFORIENTATION As Long

IFWEIGHT As Long

IFITALIC As Byte

IFUNDERLINE As Byte

IFSTRIKEOUT As Byte

IFCHARSET As Byte

IFOUTPRECISION As Byte

IFCLIPPRECISION As Byte

IFQUALITY As Byte

ISNGPITCHANDFAMILY As Byte

IFFASENAME(LF_FACECIZE - 1) As Byte

End Type

"установка объекта для выбранного устройства

"возвращает идентификатор объекта который был установлен ранее

Public Declare Function SELECTOBJECT Lib "gdi32" (BYVAL hdc As Long, BYVAL HOBJECT As Long) As Long

"удаление объекта по хендлу

Public Declare Function DELETEOBJECT Lib "gdi32" (BYVAL HOBJECT As Long) As Long

"создание объекта шрифта из структура LOGFONT

Public Declare Function CREATEFONTINDIRECT Lib "gdi32" Alias "CREATEFONTINDIRECTA" (LPLOGFONT As LOGFONT) As Long

"вывод текста в устройство

Public Declare Function TEXTOUT Lib "gdi32" Alias "TEXTOUTA" (BYVAL hdc As Long, BYVAL x As Long, BYVAL y As Long, BYVAL LPSTRING As String, BYVAL NCOUNT As Long) As Long

"функция получения информации по устройству

Public Declare Function GETDEVICECAPS Lib "gdi32" (BYVAL hdc As Long, BYVAL INTINDEX As Long) As Long

Определение центра масс.

"определение центра масс

Private Function GETCM() As pointapi "среднее арифметическое значение "координат элементов полигона Dim arr() As pointapi arr = dots Dim SX As Long, SY As Long Dim i As Integer "проходим по всем точкам полигона For i = 1 To UBOUND(arr) "суммируем координаты SX = SX arr(i).x SY = SY arr(i).y Next "находим среднее значение GETCM.x = SX / UBOUND(arr) GETCM.y = SY / UBOUND(arr)

End Function

Процедура рисования

Sub paint_field() pic.Cls "очищаем "рабочие переменные для точек Dim dot As pointapi, NEXTDOT As pointapi "временная строка Dim TMPS As String "длина сторон полигона Dim length As Single "временная переменная для точки Dim TMPDOT As pointapi "проходим по всем точкам в массиве For i = 1 To UBOUND(dots) "цвет синий col = VBYELLOW "берем первую точку dot = dots(i) "отмечаем на поле зеленым цветом pic.Circle (dot.x, dot.y), 10, VBGREEN j = i 1 "следующая точка If j > UBOUND(dots) Then j = 1 "если вдруг следующая точка оказалась несуществующей _ значит переходим на первую col = VBGREEN End If NEXTDOT = dots(j) "определяем координаты для следующей точки "рисуем линию символизирующую сторону полигона pic.Line (NEXTDOT.x, NEXTDOT.y)-(dot.x, dot.y), col Next "если имеются точки то If UBOUND(dots) > 1 Then "определяем центр масс, записываем в глобальную переменную cm = GETCM() "рисуем этот центр масс как красную закрашенную точку pic.FILLSTYLE = 0 pic.FILLCOLOR = VBRED pic.Circle (cm.x, cm.y), 4, VBRED pic.FILLSTYLE = 1 "рассчитываем линию Dim y2 As Single, x2 As Single y2 = (pic.SCALEWIDTH) * Sin(angle) x2 = pic.SCALEWIDTH * Cos(angle) pic.Line (cm.x, cm.y)-(cm.x x2, cm.y y2) pic.Line (cm.x, cm.y)-(cm.x - x2, cm.y - y2) "читаем строку которую надо вывести Dim s As String s = TXTTEXT.Text "шрифт Dim APIFONT As LOGFONT "битовый массив Dim BYTBUF() As Byte "переменная итератор Dim INTI As Integer "имя шрифта из коммондиалога Dim STRFONTNAME As String STRFONTNAME = pic.Font.Name "приводим имя шрифта в кошерный вид BYTBUF = STRCONV(STRFONTNAME & Chr$(0), VBFROMUNICODE) "побайтово записываем в переменную для передаче API функции For INTI = 0 To UBOUND(BYTBUF) APIFONT.IFFASENAME(INTI) = BYTBUF(INTI) Next INTI "записываем параметры шрифта APIFONT.IFHEIGHT=pic.Font.Size*GETDEVICECAPS(pic.hdc, LOGPIXELSY) \ 72 APIFONT.IFITALIC=Switch(pic.Font.Italic=True,1, pic.Font.Italic = False, 0 APIFONT.IFUNDERLINE = Switch(pic.Font.Underline = True, 1, pic.Font.Underline = False, 0) APIFONT.IFSTRIKEOUT = Switch(pic.Font.Strikethrough = True, 1, pic.Font.Strikethrough = False, 0) APIFONT.IFWEIGHT = pic.Font.Weight "определяем поворот APIFONT.IFESCAPEMENT = -(angle) * 1800 / pi APIFONT.IFORIENTATION = APIFONT.IFESCAPEMENT Dim FONTOBJECT As Long, OLDFONT As Long Dim INGRES As Long "создаем объект шрифта FONTOBJECT = CREATEFONTINDIRECT(APIFONT) "выбираем созданный шрифт для данного устройства (пиктчербокс) _ при этом функция возвращает ссылку а старый шрифт OLDFONT = SELECTOBJECT(pic.hdc, FONTOBJECT) Dim OLDCOLOR As Long "сохранеяем старый цвет OLDCOLOR = pic.FORECOLOR "устанавливаем новый pic.FORECOLOR = PICFONTCOLOR "производим вывод INGRES = TEXTOUT(pic.hdc, cm.x, cm.y, s, Len(s)) "восстанавливаем параметры pic.FORECOLOR = OLDCOLOR FONTOBJECT = SELECTOBJECT(pic.hdc, OLDFONT) "удаляем созданный шрифт DELETEOBJECT FONTOBJECT End If pic.Refresh " обновляем картинку, т.к. AUTOREDRAW=true

End Sub

Режим работы приложения.

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

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

· обоснование методов и приемов решения

· разработка программной части

· реализация

· подведение итога

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

Размещено на
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?