........Итак приступим к изучению новой стороны программирования. Сегодня мы будем учиться рисовать линии. Это занятие несложное. Тем не менее, я постараюсь как можно подробнее объяснить механизм работы кода к данной статье. Она будет своего рода "Hello World!" для тех, кто впервые программирует c gdi.
........Откроем новый проект. Стандартеый exe. Два раза кликнем по форме и окажемся в редакторе кода. В этом уроке мы будем только рисовать и никаких элементов управления помещать на форму не нужно.
........Объявим четыре переменные для хранения координат начала и конца отрезка.
Option Explicit Dim X1 As Single, y1 As Single Dim X2 As Single, y2 As Single
........А далее все просто: в событии mousedown получаем координаты курсора мыши x и y при клацании по форме
Private Sub form_MouseDown(Button As Integer, ShIft As Integer, X As Single, Y As Single)
........Будем считать, что начало линии будет в той точке, в которой мы кликнули мышью. Для этого присвоим переменным x1 и y1 соответствующие значения
X1 = X y1 = Y Line (X1, y1)-(X2, y2)
End Sub
........С методом Line вы можете подробнее ознакомиться здесь. ........А сейчас я предлагаю запустить наше приложение и посмотреть, что получилось. ........А получилось вот что: при обработке события mousedown метод Line чертит линию, соединяющую точку с координатами x1 и y1 с точкой с координатами x2 и y2. Но почему все линии рисуются с левого верхнего угла формы? - спросите вы. ........ Да потому что переменным x2 и y2 мы не присвоили никакого значения. И по умолчанию они равны нулю. ........Прям как в жизни. Забыл посолить борщ и он остался не соленым. Не поступил в институт и остался без высшего образования :) ........Не нужно повторять этих ошибок в будущем. В буууудущем... вот как я заговорил. А кто знает, когда оно наступит? Я не знаю, поэтому и живу здесь и сейчас: И оно уже есть! ........Чего же мы ждем? ДЛя того, чтобы борщ был посолен его нужно посолить. Логично? Иными словами нужно присвоить переменным x2 и y2 соотвствующие значения:
Private Sub form_MouseMove(Button As Integer, ShIft As Integer, X As Single, Y As Single)
X2 = X y2 = Y
End Sub
........А теперь самое время посмотреть что получается. Запускаем и ... ничего :(. Почему??? Потому что так надо. И никуда от этого не деться. Причина всегда внутри нас. Но мы недостаточно себя знаем. В жизни вообще нужно быть внимательным: Мы получаем координаты мыши при любом перемещении курсора по форме. И присваиваем их значения переменным x2 и у2. При клике мыши по форме мы получаем те же координаты и присваиваем их переменным x1 и y1. Таким образом получатся мы чертим не линию, а точку. Как же это исправить? Вообще по моему это вопрос скорее философский. В жизни все подчиняется одним и тем же законам. Эти законы проявлены внутри нас. А значит мы заранее знаем отвты на все вопросы. Например все знают старую русскую пословицу: утро вечера мудреннее! Представтье, что мы чертим линию своей собственной жизни. И чтобы было если бы она начиналась и заканчивалась одной и той же точке? Представили? Если это было бы так, вас бы здесь не было. А теперь начертим эту линию, подобно тому как ежесекундно мы чертим свою собственную: наша жизнь подчинена циклам. Эти циклы правят миром. День-Ночь, Свет-Тьма... ........К чему я клоню? К тому, что нужно тоже создать такой цикл: живой цикл, а именно - между переменными x1 и y1.
Option Explicit Dim X1 As Single, y1 As Single Dim X2 As Single, y2 As Single
Private Sub form_MouseDown(Button As Integer, ShIft As Integer, X As Single, Y As Single)
Line (X1, y1)-(X2, y2)
X1 = X y1 = Y
End Sub
Private Sub form_MouseMove(Button As Integer, ShIft As Integer, X As Single, Y As Single)
X2 = X y2 = Y
End Sub
Ура! Мы научились чертить линии!!!! Но что-то не так... как-то это не по нашему. Наша линия не создается при движении мыши, а показывается только после клика Ну не знаю, ког как, а меня такое дело не устраивает: доделываю код. Я считаю, что человек должен контролировать любое мгновение своей жизни, любое действие... свою линию жизни
Option Explicit Dim X1 As Single, y1 As Single Dim X2 As Single, y2 As Single
Private Sub form_MouseDown(Button As Integer, ShIft As Integer, X As Single, Y As Single)
AutoRedraw = True Line (X1, y1)-(X2, y2) X1 = X y1 = Y AutoRedraw = False
End Sub
Private Sub form_MouseMove(Button As Integer, ShIft As Integer, X As Single, Y As Single)
If X1 = 0 And y1 = 0 Then Exit Sub
X2 = X y2 = Y Me.Refresh Line (X1, y1)-(X, Y)
End Sub
Ну вот и все! Удачи и успехов в постижении новых высот! Пока ;)
P.S. Каждый, у кого возник вопрос, связанный с описанным в этой статье материалом - может перейти по ссылке, туда, где эта статья обсуждается. Возможно кто-то там уже ответил на ваш вопрос, а если нет.. ну это даже лучше - навстречу неизведанному, регистриркйтесь, спрашивайте не стесняйтесь
Приятно, когда хорошо реагируют на комментарии ) Вот теперь, мне кажется, тема раскрыта полностью на том уровне, который требуется для развития творчества ) Теперь бы еще отдельно статью "А теперь давайте и круг нарисуем ))" и будет то что надо - начальный джентельменский набор: линия+прямоугольник, круг+овал+дуга, ну а про точку PSET(x,y),c и так всем всё понятно ))
а где же про параметры для прямоугольников? про Line (X1, y1)-(X2, y2),цвет, b или bf (так акжется ))) ? ждем продолжения ?
Ответ: Мне очень приятно читать подоные комментарии. Я невероятно рад. Но главной целью этой статьи было дать алгоритм отрисовки на ВБ6, а не дать справочное руководство по графике в вб6:
впрочем если хотите, можно его немножко и дороботать, например кинуть на форму PictureBox и 4-ре OptionButtona и написать следующее: (уже MS Paint почти ) Option Explicit
Dim X1 As Single, y1 As Single Dim X2 As Single, y2 As Single
Enum Commands cLine = 1 Rectangle = 2 FillRectangle = 3 cNull = 0 End Enum Dim C As Commands
Private Sub picture1_MouseDown(Button As Integer, ShIft As Integer, X As Single, Y As Single)
Picture1.AutoRedraw = True Select Case C Case 1 Picture1.Line (X1, y1)-(X2, y2) Case 2 Picture1.Line (X1, y1)-(X2, y2), , B Case 3 Picture1.Circle (X1, y1), Abs(X2 - X1) End Select
X1 = X y1 = Y Picture1.AutoRedraw = False
End Sub
Private Sub picture1_MouseMove(Button As Integer, ShIft As Integer, X As Single, Y As Single)
If X1 = 0 And y1 = 0 Then Exit Sub
X2 = X y2 = Y Picture1.Refresh
Select Case C Case 1 Picture1.Line (X1, y1)-(X2, y2) Case 2 Picture1.Line (X1, y1)-(X2, y2), , B Case 3 Picture1.Circle (X1, y1), Abs(X2 - X1) End Select
End Sub
Private Sub Option1_Click() C = cLine End Sub
Private Sub Option2_Click() C = Rectangle End Sub
Private Sub Option3_Click() C = FillRectangle End Sub
Private Sub Option4_Click() C = cNull Picture1.Refresh X1 = 0 y1 = 0 End Sub
просто хотелось бы дать нашим разработчикам свободу для творчества и развитиия мысли...