Есть у меня плавающая форма (показывается, когда навожу мышью на объект, и скрывается, когда вывожу за пределы объекты). Так вот, как сделать, чтобы Left и Top формы были равны X и Y курсора мыши, и изменялись при передвижении мыши?
Плавающую форму - просто выставить в свойствах формы "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)? В смысле - пример кода моей формы с испольванием функции? Спасибо
А если left и top твоей формы будут всегда под мышью, то как ты собираешься покинуть пределы этой формы(ну для того чтобы скрыть её)???(это если left и top метки равны 0)
А если left и top метки не равны 0, то передвигаясь за курсором, форма не позволит тебе поставить мышь над меткой и событие Label1_MouseMove не наступит никогда
Видимо для покидания формы надо будет использовать какое-нибудь событие типа Click, а не просто увести мышь с формы.
CRESTA, Ты наверно не понял чего я хочу... я имею ввиду, что операция приравнивания позиции формы должны происходить только пока мышь нахдится на объекте производящем оную операцию. А когда мышь выходит за пределы, то есть едет по голой форме, то форма выполняет операцию скрытия окна.
В результате я добился чего хотел, но меня раздражает что плавающая форма перехватывает на себя фокус, получается что рябит в глазах. Вот мой код:
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, то получается каша - сами посмотрите. Что тут сделать?
Так у тебя оказывается две формы, тогда понятно. А FrmDesc будет ловить фокус, так и должно быть,т.к. ты активизируешь её событие Form_MouseMove.Передавая фокус в FrmMain (при помощи SETFOCUS), ты тут-же снова переносишь фокус назад событием на FrmDesc Form_MouseMove, потому и мелькает А если FrmDesc двигать из FrmMain, то FrmMain будет всегда наверху, а FrmDesc под ней снизу, поскольку FrmMain всегда будет в фокусе. А вобще что это такое, какая задача? Тут ещё мысля одна: а если сделать еще одну форму и из нее управлять поведением FrmDesc и FrmMain, и чтобы она была невидимой или за границами видимой части экрана?Попробуй
Я имею ввиду, чтобы пусть хоть фокус и снимается, но чтобы заголовок формы не менял цвет на инактивный. Это наверно никак не возможно, потому что если основная форма будет в фокусе, то всплывающая форма будет под ней что не годится.
Чтобы заголовок формы не менял цвет, надо в настройках рабочего стола Windows активному и неактивному окну установить одинаковый цвет заголовка, но тогда как различать активные окна других приложений? Не знаю, по-моему, это невозможно, а может сделать frmmain без заголовка, а вместо него повесить метку?
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)
Правда этот пример работает только если у объекта есть hWnd - у метки нету - но вместо метки можно использовать PictureBox (В мего можно воткнуть еще один PictureBox и в него какую-нибудь иконку и будет настоящий заголовок-