Событие MouseUp для массива контролов

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

Событие MouseUp для массива контролов

Сообщение Amed » 24.02.2006 (Пт) 23:33

Помещаем на форму пару PictureBox Picture1. С индексами 0 и 1.
В событии MouseUp прописываем Msgbox Index.

Запускаем программу, клацаем на первой картинке, а отпускаем кнопку на второй. Оказывается, что показывается индекс первой картинки.

В принципе, это вполне согласовывается с MSDN:
The WM_LBUTTONUP message is posted when the user releases the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.


Можно как-то простейшими методами определить индекс картинки, на которой отпустили кнопку?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.02.2006 (Пт) 23:50

Можно после MouseUp обрабатывать MouseMove.
А я все практикую лечение травами...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 24.02.2006 (Пт) 23:54

Сверяй WindowFromPoint и hWnd каждого PictureBox, либо ставь ReleaseCapture на выходе из Rect PictureBox, где произошло MouseDown.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.02.2006 (Пт) 23:58

Twister писал(а):Можно после MouseUp обрабатывать MouseMove.

И что это даст?
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 0:00

BV писал(а):Сверяй WindowFromPoint и hWnd каждого PictureBox, либо ставь ReleaseCapture на выходе из Rect PictureBox, где произошло MouseDown.

И это простейший способ?
Тогда уж лучше по другому. Как только X/Y стали меньше 0 или больше ScaleWidth/ScaleHeight, сбросить запомненный индекс PictureBox, на котором нажималась кнопка.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 0:07

alibek, если кнопка была зажата на одном контроле, MouseMove на другом контроле не происходит, пока не отпустить.

BV, не простейший способ. Принципиально все просто, но кода не так мало, как хочется.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 0:12

Кстати, alibek, не понял, что это даст?
Я только лишь узнаю, что мышь вышла за пределы нынешнего пикчера, а как поймаю-то нужный индекс затем?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 0:16

Amed писал(а):Я только лишь узнаю, что мышь вышла за пределы нынешнего пикчера, а как поймаю-то нужный индекс затем?

Перерасчитать его положение, например.
DX = X - Picture1(0).ScaleWidth -- это расстояние, на которое указатель вышел за пределы PictureBox.
DX0 = Picture1(1).Left - Picture1(0).Left -- расстояние между двумя PictureBox "снаружи".
Если DX находится между DX0 и DX0+Picture1(1).ScaleWidth, значит указатель расположен на втором PictureBox. Либо можно использовать WindowFromPoint.
Lasciate ogni speranza, voi ch'entrate.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.02.2006 (Сб) 0:27

2 Amed

Не простейший, да, но проблему решающий.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 0:34

alibek писал(а):
Amed писал(а):Я только лишь узнаю, что мышь вышла за пределы нынешнего пикчера, а как поймаю-то нужный индекс затем?

Перерасчитать его положение, например.
DX = X - Picture1(0).ScaleWidth -- это расстояние, на которое указатель вышел за пределы PictureBox.
DX0 = Picture1(1).Left - Picture1(0).Left -- расстояние между двумя PictureBox "снаружи".
Если DX находится между DX0 и DX0+Picture1(1).ScaleWidth, значит указатель расположен на втором PictureBox. Либо можно использовать WindowFromPoint.


Все, понял, зря долго объяснял. :)
Получается на 5 баллов, судя по всему. Всем спасибо.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:02

Тема закрыта, но все же:
alibek писал(а):И что это даст?
Как что? Смотри: по MouseUp мы узнаем, что мышь отпущена. Затем нам нужно поймать событие MouseMove, а оно произойдет как раз над тем Picture-ом, над которым отпустили мышь...
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.02.2006 (Сб) 17:11

Дык громоздко получится. Флаги, отличение нужных маусмувов от ненужных...

Код: Выделить всё
Option Explicit

Private Declare Function ReleaseCapture Lib "user32.dll" () As Long

Private Sub Picture1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  ReleaseCapture
End Sub

Private Sub Picture1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  Debug.Print "Up: "; Index
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:14

отличение нужных маусмувов от ненужных
Решаемо вводом дополнительной булевской переменной...
А я все практикую лечение травами...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 17:18

GSerg. Нет слов, оно :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.02.2006 (Сб) 17:18

Twister писал(а):
отличение нужных маусмувов от ненужных
Решаемо вводом дополнительной булевской переменной...

Первое слово зря не включил в цитату :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:19

Какие флаги ты имеешь ввиду?
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.02.2006 (Сб) 17:20

Собственно, "дополнительная булевская переменная" всегда флагом и была :)

Amed
Угу. Наши с тобой подписи обычно работают :)
Последний раз редактировалось GSerg 25.02.2006 (Сб) 17:22, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 17:22

Twister писал(а):Затем нам нужно поймать событие MouseMove, а оно произойдет как раз над тем Picture-ом, над которым отпустили мышь...

Нет. При отпускании кнопки MouseMove не будет, оно появится, когда мышку сдвинут.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:24

GSerg. Нет слов, оно
Ну вот, сначала мою идею обхаял alibek, а теперь еще и GSerg-a хвалят...
:lol:
Последний раз редактировалось Twister 25.02.2006 (Сб) 17:25, всего редактировалось 1 раз.
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:24

Нет. При отпускании кнопки MouseMove не будет, оно появится, когда мышку сдвинут
Конечно, но ее же сдвинут...
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 17:26

Twister писал(а):Конечно, но ее же сдвинут...

И сколько времени ты предлагаешь ждать, пока сдвинут?
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:27

Достаточно малейшего движения. Или, по твоему, юзверям мышь для красоты? :lol:
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 17:31

Ну-ну...
В мануале к программе будешь писать "Если программа зависла, пошевелите мышкой"?
Наверное поэтому детишки в интернет-клубах мышкой возят по экрану, чтобы Counter-Strike быстрее загружался.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:34

Ну раз мой способ устроил Amed-а, значит в этом что-то есть...
Сам посуди, разве шанс, что мышь продолжат двигать после отпускания кнопки, мал? :wink: По-моему, вероятность равна 99,99%...
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.02.2006 (Сб) 17:37

Twister писал(а):По-моему, вероятность равна 99,99%...

У человека с болезнью Паркинсона возможно.
Я не вижу причины, зачем двигать мышку после того, как отпустил кнопку. Единственная причина -- когда выполняется несколько операций подряд.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:38

Я не вижу причины, зачем двигать мышку после того, как отпустил кнопку
Чисто по инерции.
alibek, хватит спорить, пошли постигать Дао... :wink:
А я все практикую лечение травами...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 17:43

Хаха, Алибек, надо сделать такой прикол :)

Кстати, BV отдельное мерсибо.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2006 (Сб) 17:45

Twister, способ c ReleaseCapture элегантнее.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 25.02.2006 (Сб) 17:47

Twister, способ c ReleaseCapture элегантнее.
Согласен... Меньше гемороя.
А я все практикую лечение травами...


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48

    TopList