Таскание формы по экрану

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

Таскание формы по экрану

Сообщение GluKoBuG » 16.06.2006 (Пт) 18:36

У меня вопрос.
У формы свойство BorderStyle стоит в None.
Имеется надпись Label, которая должна исполнять роль панели для таскания окна по экрану.
Ничего подробного ни в поиске, ни в ApiViewer'e не нашёл.
Глюк - не глюк, если его можно исправить

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 16.06.2006 (Пт) 18:37

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

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

Сообщение BV » 16.06.2006 (Пт) 18:39

Рэй, приляг, поспи. Говорят, помогает :)

По теме: поиск по WM_NCLBUTTONDOWN
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;

Dangerous
Новичок
Новичок
Аватара пользователя
 
Сообщения: 45
Зарегистрирован: 25.05.2006 (Чт) 15:52

Сообщение Dangerous » 16.06.2006 (Пт) 18:49

Я конечно незнаю есть или нет такие темы уже на форуме, но рекомендую перед созданием темы воспользоваться поиском по форуму(правила читать надо!!!).
Ну ладно вот код:
Код: Выделить всё
' Объявляем пару функций API и пару констант(Это должно быть в модуле)
Public Declare Function SendMessage Lib "user32"  Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long,  ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub ReleaseCapture Lib "user32" ()
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2

' а это уже процедура перемещения указателя над элементом Text1(т.е. это уже код формы)

Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lngReturnValue As Long
    If Button = 1 Then
        Call ReleaseCapture
        lngReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub

И усё!
Последний раз редактировалось Dangerous 16.06.2006 (Пт) 19:11, всего редактировалось 1 раз.
Нет ничего невозможного...

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 16.06.2006 (Пт) 19:09

RayShade писал(а):Никак не пойму. Отчего, у меня дергается левый глаз, а?


2 RayShade:

Ничего подробного ни в поиске, ни в ApiViewer'e не нашёл.


А меня улыбнуло и вообще на ржач пробивает. :D
Себя вспоминаю :D

GluKoBuG
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 11.06.2006 (Вс) 21:49
Откуда: отсюда!

Сообщение GluKoBuG » 17.06.2006 (Сб) 10:00

Откудаж я знал, что надо искать какой-то "WM_NCLBUTTONDOWN", а не "тащим форму по экрану без тормозов"
Глюк - не глюк, если его можно исправить

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 11:36

"тащим форму по экрану без тормозов"

Ржунимагу! :lol: :lol: :lol:
Подпись находится в стадии разработки...

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 17.06.2006 (Сб) 13:01

Люди, будьте проще :). В данном случае можно так:

Код: Выделить всё
Option Explicit
Dim Mouse_Lock As Boolean
Dim cx As Integer, cy As Integer

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
   
   If Button = vbLeftButton Then
      Mouse_Lock = True ' Если нажата кнопка мыши, то начинаем двигать
      cx = X ' Записываем, где курсор относительно формы
      cy = Y
   End If
   
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   
   If Mouse_Lock Then ' Если мышь опущена на форму, то двигаем форму
      DoEvents
      Me.Top = Me.Top + Y - cy
      Me.Left = Me.Left + X - cx
   End If
   
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Mouse_Lock = False ' Соответственно, если мышь отпустить, то форма освобождается
   
End Sub


Это, чтоб таскать за форму. Для лейбла сам исправь

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 17.06.2006 (Сб) 13:14

Кстати интересный вариант для любителей чистого VB.
Подпись проходит рефакторинг

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 13:32

Lumen
Особенно для тех, кто не любит API:)
Подпись находится в стадии разработки...

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 17.06.2006 (Сб) 13:36

Конь
И не только для них. Вообще для тех, кому нравится решать задачи, используя внутренние возможности языка.

И чем им только API не угодил???
Подпись проходит рефакторинг

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 13:58

Ты прав.

И правда, чем?!
Подпись находится в стадии разработки...

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 18:23

Воть. Для смеха.
Вложения
Гыгы.rar
(5.29 Кб) Скачиваний: 49
Подпись находится в стадии разработки...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 17.06.2006 (Сб) 20:49

IIIypuk писал(а):Люди, будьте проще :)
Это называется проще? Мало того, что с твоим кодом форма дергается, как припадошная, так еще и при даблклике событие MouseDown "проглатывается", т.е. если по твоей форме кликнуть быстро два раза и после второго клика мышку не отпускать, то никуда она не поедет. Хотя конечно это несмертельно...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 17.06.2006 (Сб) 20:51

Неплохо. Правда боянисто, но прикольно.
Подпись проходит рефакторинг

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 20:52

Lumen
Ты про что?
Подпись находится в стадии разработки...

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 17.06.2006 (Сб) 21:00

Конь
Про твою прогу "для смеха". Сам такие писал, когда учился программировать, но всё равно прикольно.
Подпись проходит рефакторинг

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 21:02

Lumen
Оригинальностью особой не отличаюсь:)

Просто показал, как этот код работает:)

Но спасибо;)
Подпись находится в стадии разработки...

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 17.06.2006 (Сб) 21:12

Насчет дергается - это потомуу, что у тебя первый пень, наверное.
Насчет даблклика - просто нужно доработать.

И еще:
vvs_adm писал(а):...Это называется проще? Мало того, чт.....

это именно самый простой, на мой взгляд пример (хоть и работает чуть коряво). Никаких API и т.п. Попробуй придумай проще :lol: :lol:

Конь
Постоялец
Постоялец
 
Сообщения: 650
Зарегистрирован: 02.06.2006 (Пт) 6:49
Откуда: г. Красноярск

Сообщение Конь » 17.06.2006 (Сб) 21:20

Ничего не дергается! Все ОК!

ЗЫ если мой пример дергается, то это лишь потому, что я был вынужден изменять положение в любую сторону на 20, а то бы двигалось слишком медленно.
Подпись находится в стадии разработки...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 17.06.2006 (Сб) 21:40

IIIypuk Дергается не при перетаскивании, а после остановки мыши форма еще летает туда сюда, как буд-то у нее масса есть и она на пружинке :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.06.2006 (Сб) 22:40

IIIypuk, ентот самый код хоть и правилен и любим мной, но в твоём варианте он ужасен. :pukel:

Я опять, с грустью, где-то там, в сердце, наблюдаю MouseMove-ное перетаксивание без всякого предусмотрения рекурсивного вызова события. И это уже который раз (помните за что мне дали звание?)

Наверное придётся мне статью что-ли написать про это дело :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.06.2006 (Вс) 15:28

Хорошо, тогда если чуть чуть изменить, то уже не дергается:

Код: Выделить всё
Option Explicit
Dim Mouse_Lock As Boolean
Dim cx As Integer, cy As Integer

Dim temp As Boolean

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
   
   If Button = vbLeftButton Then
      Mouse_Lock = True ' Если нажата кнопка мыши, то начинаем двигать
      cx = X ' Записываем, где курсор относительно формы
      cy = Y
   End If
   
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   
   If temp Then Exit Sub
   temp = True
   If Mouse_Lock Then ' Если мышь опущена на форму, то двигаем форму
      DoEvents
      Me.Top = Me.Top + Y - cy
      Me.Left = Me.Left + X - cx
   End If
   temp = False

End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Mouse_Lock = False ' Соответственно, если мышь отпустить, то форма освобождается
   
End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.06.2006 (Вс) 18:08

temp должна быть static
MouseLock.... ? А не одно и тоже ли это что и Button <> 0
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 18.06.2006 (Вс) 19:07

Код: Выделить всё
Option Explicit
Dim cx As Single, cy As Single

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
   If Button = 1 Then
      cx = X
      cy = Y
   End If
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
      Top = Top + Y - cy
      Left = Left + X - cx
   End If
End Sub

без лишних строк типа If temp Then Exit Sub temp = True doevents
при даблклике не проглатывается и не дергается

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.06.2006 (Вс) 20:30

Хакер писал(а):Я опять, с грустью, где-то там, в сердце, наблюдаю MouseMove-ное перетаскивание безо всякого предусмотрения рекурсивного вызова события. И это уже который раз (помните за что мне дали звание?)


Naked - ещё один умник...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 9:54

Naked
В общем самый правильный код.
Но, по крайней мере в ХРшке, таскается не форма а силуэт формы.
Да, и стоит событие применять не к форме а к лэйблу.

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 18.07.2006 (Вт) 10:09

2 XPAHuTEJIb Теме месяц... Вернее, месяц в нее никто не писал... Это не наводит на мысли соответствующие? И притом, это не первый случай подымания тобой старых тем. Может не стоит заниматься некрофилией, притом неоправданной?
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

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

Сообщение Twister » 18.07.2006 (Вт) 10:35

Наводит на мысли о том, что XPAHuTEJIb просто набивает количество постов. Интересно, а его не посещала мысль о том, что некрофилия на форуме не безнаказана?
А я все практикую лечение травами...

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 18.07.2006 (Вт) 10:50

2Twister:
меня твой пост наводит на теже мысли...или ты боишься, что я обгоню тебя по количеству постов?

2Oxygen:
Новое-хорошо забытое старое...возможно этот пост и не оправдан - удалите его
А насчёт остальных - я не согласен.

След.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 21

    TopList