Графический редактор

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DiSe
Обычный пользователь
Обычный пользователь
 
Сообщения: 97
Зарегистрирован: 30.06.2003 (Пн) 19:11

Графический редактор

Сообщение DiSe » 10.07.2003 (Чт) 19:34

Я делаю графический редактор. Как и в PAINT-е, здесь есть стандартные инструменты. Меня интересует инструмент "Линия". Я делал его с помощью LINE. После нажатия на кнопку мыши и перетаскивания курсора в процедуре MouseMoove надо показать где находится линия. Я делаю так:
'''''''
Public cX, cY
''''''
Private Sub Shape_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
cX = X
cY = Y
End Sub
'''''''
Private Sub Shape_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Shape.Line (X, Y)-(cX, cY)
Sleep (2)
DoEvents
Shape.Line (X, Y)-(cX, cY)
End Sub
'''''''
Private Sub Shape_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Shape.Line (cX, cY)-(X, Y)
End Sub

Shape - это PictureBox
Вся проблема в том, что таким способом происходит затерание остального рисунка.
Как сделать эту "Линию" :?: Нужна помощь.

Urvin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 518
Зарегистрирован: 04.06.2003 (Ср) 10:47
Откуда: с Марса

Сообщение Urvin » 10.07.2003 (Чт) 23:35

:twisted: А ты заметил, что при двигании мышью ты постоянно по два раза рисуешь линии?
:twisted: А вообще, твой вопрос не очень понятен!
Не так страшен русский танк, как его пьяный экипаж

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 11.07.2003 (Пт) 9:31

Вставляешь элемент управления Line и двигаешь его, когда не надо делаешь Line1.Visible = False
Или можешь залить рисунок в переменную типа IPictureDisp и оттуда в пикчебокс колбасить

Aquarius
Постоялец
Постоялец
 
Сообщения: 692
Зарегистрирован: 04.11.2002 (Пн) 13:13
Откуда: Russia

Сообщение Aquarius » 11.07.2003 (Пт) 11:42

Вставляешь элемент управления Line и двигаешь его, когда не надо делаешь Line1.Visible = False
Или можешь залить рисунок в переменную типа IPictureDisp и оттуда в пикчебокс колбасить

какая не эстетичная идея.

Мой вариант.

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

Проблема лишь в том что все это тебует знаний WinAPI, а их я тебе (если у тебя самого их нет) уже дать не в состоянии.
(Всем изучать ASSEMBLER)
www.Wasm.ru, www.FlatAssembler.Net

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.07.2003 (Пт) 13:28

А по-моему двигать по форме компоненту Line вполне эстетично, и API трогать не нужно.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 11.07.2003 (Пт) 16:35

Aquarius писал(а):
Вставляешь элемент управления Line и двигаешь его, когда не надо делаешь Line1.Visible = False
Или можешь залить рисунок в переменную типа IPictureDisp и оттуда в пикчебокс колбасить

какая не эстетичная идея.

Мой вариант.

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

Проблема лишь в том что все это тебует знаний WinAPI, а их я тебе (если у тебя самого их нет) уже дать не в состоянии.


Переменная IPictureDisp - это вообще-то и есть внеэкранный буфер.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 11.07.2003 (Пт) 18:52

На пример:

чистая форма с AutoRedraw = true

Код: Выделить всё
Dim pict As IPictureDisp
Dim x1 As Long, y1 As Long

Private Sub Form_Load()
    Line (0, 0)-(100, 100)
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    x1 = X
    y1 = Y
    Set pict = Me.Image
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbLeftButton Then
        Set Me.Picture = pict
        Line (x1, y1)-(X, Y)
    End If
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 24

    TopList