Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual Basic. Самоучитель для начинающих.2001.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
7.67 Mб
Скачать

5.4.Проект - "Графический редактор"

Проиллюстрируем применение элемента управления CommonDialog и панели инструментов на примере создания простейшего графического редактора. Пусть наш редактор умеет только следующие вещи:

  • Рисовать мышкой, как карандашом.

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

  • Выбирать цвет линии.

  • Загружать рисунки из любого графического файла формата BMP.

  • Сохранять рисунки в любом графическом файле формата BMP.

Вот внешний вид нашего графического редактора:

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

Вот программа нашего графического редактора (посмотрите, какая короткая!):

Dim Цвет As Long 'Цвет карандаша

Private Sub Form_Load() 'Начальные установки редактора:

AutoRedraw = True

BackColor = vbWhite 'Цвет листа для рисования - белый

Цвет = vbBlack 'Поначалу цвет карандаша - черный

DrawWidth = 3 'Поначалу линия тонкая

End Sub

Private Sub Command1_Click() 'Загружаем графический файл

CommonDialog1.ShowOpen

Form1.Picture = LoadPicture(CommonDialog1.FileName)

End Sub

Private Sub Command2_Click() 'Сохраняем графический файл

CommonDialog1.ShowSave

SavePicture Image, CommonDialog1.FileName

End Sub

Private Sub Command3_Click() 'Выбираем цвет карандаша

CommonDialog1.ShowColor

Цвет = CommonDialog1.Color

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

PSet (X, Y), Цвет 'Мышка превращается в карандаш

End Sub

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)

Select Case Button.Key

Case "Тонкая линия" 'Если нажата первая кнопка на панели инструментов,

DrawWidth = 3 'то линия тонкая

Case "Толстая линия" 'Если нажата вторая кнопка на панели инструментов,

DrawWidth = 20 'то линия толстая

End Select

End Sub

Пояснения:

В процедуре открытия файла я для краткости вместо

CommonDialog1.ShowOpen

Файл = CommonDialog1.FileName

Form1.Picture = LoadPicture(Файл)

написал

CommonDialog1.ShowOpen

Form1.Picture = LoadPicture(CommonDialog1.FileName)

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

SavePicture Image, CommonDialog1.FileName

по которому картинка, нарисованная на поверхности формы, сохраняется в файл, имя которого указано в свойстве CommonDialog1.FileName. На смысле параметра Image я не буду останавливаться.

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

При вставке кнопок в панель инструментов я дал первой из них ключ "Тонкая линия", а второй - "Толстая линия".

У нашей процедуры рисования Form_MouseMove есть два существенных недостатка:

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

  • Мышь рисует всегда, когда движется, а нам было бы привычней и удобней, чтобы она делала это лишь при нажатой клавише мыши.

Вот как дополнится наша программа для устранения этих недостатков:

Dim Клавиша_мыши_нажата As Boolean 'Удерживается ли нажатой клавиша мыши

'Координаты мыши при предыдущем (перед текущим) наступлении события MouseMove:

Dim X_предыдущее As Long

Dim Y_предыдущее As Long

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Клавиша_мыши_нажата Then

'Рисуем отрезок прямой от предыдущего положения мыши до текущего:

Line (X, Y)-(X_предыдущее, Y_предыдущее), Цвет

'Запоминаем текущее положение мыши для будущего срабатывания MouseMove, когда оно будет уже предыдущим:

X_предыдущее = X

Y_предыдущее = Y

End If

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Клавиша_мыши_нажата = True

'В начальный момент рисования предыдущее и текущее положения мыши совпадают:

X_предыдущее = X

Y_предыдущее = Y

End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Клавиша_мыши_нажата = False

End Sub

Пояснения:

Логично считать, что клавиша мыши удерживается нажатой, когда из двух событий - MouseDown и MouseUp последним по времени наступило MouseDown.

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

Если вы хотите улучшить наш графический редактор

Если вы хотите улучшить наш графический редактор, то:

  • Сделайте кнопку очистки листа.

  • Создайте палитру цветов, как в графическом редакторе Paint. Палитра цветов - та же панель инструментов, только кнопки в ней покрашены в разные цвета.

  • Создайте еще одну панель инструментов с ластиком, отрезком прямой, прямоугольником, овалом (эллипсом).

  • Интересно сделать пульверизатор (распылитель). Здесь вам понадобятся случайные величины.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]