Страница: 1 |
Страница: 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:
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-сайт:
Профиль | | #3
Добавлено: 10.05.05 18:56
А как делается такая же бадяга для формы? получается очень некрасиво, форма моргает, глючит хотя прилипает отлично
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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #12
Добавлено: 11.05.05 15:27
IMHO Сабклассинг самое оно...