Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Притягивание плавающей формы к курсору Добавлено: 17.11.03 03:28  

Автор вопроса:  -=Neo=- | ICQ: 252708240 

Есть у меня плавающая форма (показывается, когда навожу мышью на объект, и скрывается, когда вывожу за пределы объекты). Так вот, как сделать, чтобы Left и Top формы были равны X и Y курсора мыши, и изменялись при передвижении мыши?

Ответить

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

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



ICQ: 213777061 

Вопросов: 21
Ответов: 159
 Профиль | | #1 Добавлено: 17.11.03 12:29

 

Ответить

Номер ответа: 2
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #2 Добавлено: 17.11.03 22:30

Плавающую форму - просто выставить в свойствах формы "No Border", и дальше

Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
frmFloat.Show
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
frmFloat.Hide
End Sub

Поскольку я совсем новичок в этом деле, то можете мне конкретней объяснить, как пользоваться этой функцией (API GetCursorPosition)? В смысле - пример кода моей формы с испольванием функции? Спасибо

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #3 Добавлено: 18.11.03 00:28

А если left и top твоей формы будут всегда под мышью, то как ты собираешься покинуть пределы этой формы(ну для того чтобы скрыть её)???(это если left и top метки равны 0)

А если left и top метки не равны 0, то передвигаясь за курсором, форма не позволит тебе поставить мышь над меткой и событие Label1_MouseMove не наступит никогда

Видимо для покидания формы надо будет использовать какое-нибудь событие типа Click, а не просто увести мышь с формы.

В форме поставь вот это:

Ответить

Номер ответа: 4
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #4 Добавлено: 18.11.03 03:01

CRESTA,
Ты наверно не понял чего я хочу... я имею ввиду, что операция приравнивания позиции формы должны происходить только пока мышь нахдится на объекте производящем оную операцию. А когда мышь выходит за пределы, то есть едет по голой форме, то форма выполняет операцию скрытия окна.

Ответить

Номер ответа: 5
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #5 Добавлено: 18.11.03 03:12

В результате я добился чего хотел, но меня раздражает что плавающая форма перехватывает на себя фокус, получается что рябит в глазах. Вот мой код:

FrmMain

Option Explicit

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
        X As Long
        Y As Long
End Type

Dim curPosition As POINTAPI

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
frmDesc.Hide
End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload frmDesc
Unload Me
End
End Sub

Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
frmDesc.lblTip.Text = "Internet Explorer 6.0" & vbCrLf & "5.0"
frmDesc.Show
GetCursorPos curPosition
frmDesc.Left = curPosition.X * Screen.TwipsPerPixelX
frmDesc.Top = curPosition.Y * Screen.TwipsPerPixelY
End Sub

FrmDesc

Option Explicit

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
        X As Long
        Y As Long
End Type

Dim curPosition As POINTAPI

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
GetCursorPos curPosition
Me.Left = curPosition.X * Screen.TwipsPerPixelX
Me.Top = curPosition.Y * Screen.TwipsPerPixelY
End Sub

 

При этом если я пользуюсь функией SetFocus, то получается каша - сами посмотрите. Что тут сделать?

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 18.11.03 12:09
Так у тебя оказывается две формы, тогда понятно.
А FrmDesc будет ловить фокус, так и должно быть,т.к. ты активизируешь её событие Form_MouseMove.Передавая фокус
в FrmMain (при помощи SETFOCUS), ты тут-же снова переносишь
фокус назад событием на FrmDesc Form_MouseMove, потому и мелькает
А если FrmDesc двигать из FrmMain, то FrmMain будет всегда наверху,
а FrmDesc под ней снизу, поскольку FrmMain всегда будет в фокусе.
А вобще что это такое, какая задача?
Тут ещё мысля одна: а если сделать еще одну форму и из нее управлять
поведением FrmDesc и FrmMain, и чтобы она была невидимой или за границами
видимой части экрана?Попробуй

Ответить

Номер ответа: 7
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #7 Добавлено: 18.11.03 15:20

Ты порыскай на http://outen.narod.ru/ - там этот пример в наличии

Если нет - пиши

Ответить

Номер ответа: 8
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #8 Добавлено: 18.11.03 15:29

CRESTA,

Я имею ввиду, чтобы пусть хоть фокус и снимается, но чтобы заголовок формы не менял цвет на инактивный. Это наверно никак не возможно, потому что если основная форма будет в фокусе, то всплывающая форма будет под ней что не годится.

AE SOFT,

Спасибо, посмотрю.

 

Ответить

Номер ответа: 9
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #9 Добавлено: 18.11.03 22:53
ССЫЛКА НЕ РАБОТАЕТ!!!

Ответить

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



Вопросов: 117
Ответов: 1538
 Профиль | | #10 Добавлено: 18.11.03 23:18
Чтобы заголовок формы не менял цвет, надо в настройках рабочего стола Windows активному и неактивному окну установить одинаковый цвет заголовка, но тогда как различать активные окна других приложений? Не знаю, по-моему, это невозможно, а может сделать frmmain без заголовка, а вместо него повесить метку?

Ответить

Номер ответа: 11
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #11 Добавлено: 19.11.03 00:15
Да, хорошая идея, так и сделаю.

Ответить

Номер ответа: 12
Автор ответа:
 -=Neo=-



ICQ: 252708240 

Вопросов: 3
Ответов: 13
 Профиль | | #12 Добавлено: 19.11.03 03:49
Но возникает новый вопрос: как сделать чтобы форму можно было перетаскивать за любое место?

Ответить

Номер ответа: 13
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #13 Добавлено: 19.11.03 09:23
Какая ссылка у тебя не работает??? Я же сказал - не нашел, пиши - вышлю...

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 19.11.03 09:45
Это таскать форму за любое место, Можно применить и к Метке, а форму подтягивать к метке и будет 
полная имитация заголовка
Dim cx As Single, cy As Single, dx As Single, dy As Single
Dim bDrag As Boolean
 
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'Если нажата кнопка мыши, то синхронизируем координаты
    bDrag = True: dx = X: dy = Y: cx = Me.Left: cy = Me.Top
End Sub
 
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'Вместе с мышью тащим форму
    If bDrag Then
        cx = cx + X - dx: cy = cy + Y - dy
        Me.Move cx, cy
    End If
End Sub
 
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'Когда кнопка отпущена, перестаем тянуть форму
    bDrag = False
End Sub

Ответить

Номер ответа: 15
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #15 Добавлено: 19.11.03 09:54

А ещё можно при помощи API:

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
 ;(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

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

В процедуру Form_MouseDown вставь:

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

Call ReleaseCapture
Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&;)

End Sub

Правда этот пример работает только если у объекта есть hWnd - у метки нету - но вместо метки можно использовать PictureBox (В мего можно воткнуть еще один  PictureBox и в него какую-нибудь иконку и будет настоящий заголовок-:)

Ответить

Страница: 1 |

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



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