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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

µское координат вершин:

 

 

 

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

Текст, который будет отображаться на рисунке вводиться в специальное поле. Шрифт текста выбирается по нажатию на кнопку 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

ширинаAs Long

поворот шрифтаAs LongAs Long

толщина шрифтаAs Long

настройки шрифтаAs ByteAs ByteAs ByteAs ByteAs ByteAs ByteAs ByteAs Byte

шрифт(LF_FACECIZE - 1) As Byte Type

 

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

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

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

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

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

Разработка интерфейса приложения

 

размещение текстовый надпись рисунок

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

 

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

некоторые константы для шрифтаConst LF_FACECIZE = 32

Public Const LOGPIXELSY = 90

тип точка,

стандартный Win32 API типType pointapi x As Long y As LongType

структура шрифта win32 APIType LOGFONTAs LongAs LongAs LongAs LongAs LongAs ByteAs ByteAs ByteAs ByteAs ByteAs ByteAs ByteAs Byte(LF_FACECIZE - 1) As Byte

End Type

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

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

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

удаление объекта по хендлу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

вывод текста в устройство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

функция получения информации по устройству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

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

UBound(dots)Thenj=1_col=vbGreenEndIfnextDot=dots(j)pic.Line(nextDot.x,nextDot.y)-(dot.x,dot.y),colNextIfUBound(dots)>1Then,cm=getCM()%d