Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Перетаскивание Добавлено: 10.05.05 17:32  

Автор вопроса:  Lister | ICQ: 298621256 
Нужно сделать перетаскивание PictureBox'а по форме с прилипанием к точкам или линиям сетки.
Одним словом, мне нужно реализовать такое же прилипание, как при добавлении контрола на форму VB... Помогите советами

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 10.05.05 18:39
Если делаешь drag пикчербокса, то по событию Picture1_MouseUp, в момент, когда отпущена мышь, получи координаты left и top пикчербокса, и округли их до ближайшего значения, кратного шагу сетки
x1 = CLng(Picture1.left/cellStep)*cellStep
y1 = CLng(Picture1.top/cellStep)*cellStep
Picture1.Move x1,y1

Ответить

Номер ответа: 2
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #2 Добавлено: 10.05.05 18:56
На всякий случай ещё и drag:

Dim cellStep As Long, bDrag As Boolean, dx As Single, dy As Single, cx As Single, cy As Single
Private Sub Form_Load()
    cellStep = 100
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    bDrag = True: dx = X: dy = Y: cx = Picture1.Left: cy = Picture1.Top
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If bDrag Then
        cx = cx + X - dx: cy = cy + Y - dy
        Picture1.Move cx, cy
    End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    bDrag = False
    X1 = CLng(Picture1.Left / cellStep) * cellStep
    Y1 = CLng(Picture1.Top / cellStep) * cellStep
    Picture1.Move X1, Y1
End Sub

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 10.05.05 18:56
А как делается такая же бадяга для формы? получается очень некрасиво, форма моргает, глючит хотя прилипает отлично :-/

Private Sub Timer1_Timer()
Me.Visible = False
Me.Left = Round(Me.Left \ 1500) * 1500
Me.Visible = True
Me.Caption = Me.Left
End Sub


Вот так тоже ессно не пашет :(

Ответить

Номер ответа: 4
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #4 Добавлено: 10.05.05 19:11
Вообще-то этот код я переделал именно из драга формы. Там нет никакого таймера, для чего он?
Всё один в один как в примере выше, только вместо слова Picture вставь Form и всё. Никаких мерцаний и глюков :)

Ответить

Номер ответа: 5
Автор ответа:
 Lister



ICQ: 298621256 

Вопросов: 57
Ответов: 304
 Профиль | | #5 Добавлено: 10.05.05 19:43
Спасибо, конечно, но не то...
Нужно прилипание во время перемещения, а не после того как отпуститься кнопка мыши.

Такое же, как во время дизайна формы - при перемещении контрола по форме. Посмотрите внимательнее, какое там прилипание...

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 10.05.05 21:17
Это чтобы перемещалось скачками? Тогда может тебе обратиться в сторону сабклассинга? При сообщении WM_MOVING в качестве lParam передается указатель на структуру RECT, в которой содержатся текущие координаты окна. Если изменить соответствующим образом эту структуру, то Винда выставит окно в соответствие со вновь заполненной структурой RECT.

Ответить

Номер ответа: 7
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #7
Добавлено: 10.05.05 21:37
а может таймером обойтись вместо сабклассинга?

Ответить

Номер ответа: 8
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #8 Добавлено: 10.05.05 22:30
AutoRedraw поможет...

Ответить

Номер ответа: 9
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #9 Добавлено: 10.05.05 23:14
Morpheus, а как таймер может помочь?

Ответить

Номер ответа: 10
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #10
Добавлено: 11.05.05 00:32
Ну, как то выравнивать форму кучу раз в секунду наверное :-/

Ответить

Номер ответа: 11
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #11 Добавлено: 11.05.05 01:17
Что-то мне подсказывает, что это будет нечто ужасное :)))

Тут мысль ещё пришла: как в ответе 2, но: не тащить пикчербокс драгом, а только отслеживать изменения положения курсора над ним, и при переходе координат курсора через очередную границу сетки двигать пикчербокс одним шагом, равным шагу сетки. Тем же методом move. Но сейчас уже честно сказать, лениво проверять, да и поздно.

Ответить

Номер ответа: 12
Автор ответа:
 freeloader



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #12
Добавлено: 11.05.05 15:27

IMHO Сабклассинг самое оно...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам