Есть на форме два лейбла
Как сделать чтобы при движении мыши над первым лейблом появлялось сообщение на втором, а при выходе мыши за пределы первого лейбла сообщение на втором исчезало.
Голову уже всю поломал себе с эти делом.
Понятно, что можно отследить MouseMove и выключить второй лейбл при срабатывании над формой, а включить при срабатывании над первым лейблом, однако это не подходит, т.к. первый лейбл находится в контейнере, который не имеет события MouseMove.
Может можно как-нибудь отслеживать движении мыши по форме так, чтобы MouseMove формы всегда срабатывал, независимо от того, над чем мышь реально движеться, или еще как нибудь...
не, правильно ты про ScreenToClient, я вот просто подумал про решение, которй некрасивое, но имхо, надёжное: Сделай RECT, который описывает твой лабл, получай (не знаю по таймеру или как то ещё) GetCursorPos, потом выполни ScreenToClient, проверь через PtInRect... короче, я пример делал с кнопками, котррые рисуются DrawFrameControl'ом с подновороченной графикой и события которых происходили при участии вышеперечислены функций проходили идеально, несмотря на юзанье МаусМув вместо таймера
Да кстати, Morpheus, у Type RECT координаты задаются относительно всего экрана? А тогда, имхо, при перемещении формы Label уже не будет в том самом RECT. Или я не прав?
Private Declare Function SetRect Lib "user32" Alias "SetRect" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim R as RECT
SetRect .....
Ну и присваеваешь ему границы лабла... или я ты не это имел в виду?
В листинге, что ты привел, RECT не выступает как client. Если я не ошибаюсь, эти координаты (X1, Y1; X2, Y2) задаются относительно всего экрана, ведь SetRect не требует хэндла, значит, откуда этой ф-ции знать, относительно чего задаются координаты нами.
Если я все-таки прав, то, правда, все равно можно будет "отслеживать" этот Label через таймер.
Кстати, у меня есть вопросы по сходной теме.
1. Напиши, пожалуйста, как ты юзал ф-цию PtInRect, а то у меня VB вылетает, когда до нее доходит.
2. Вот, к примеру, я юзаю RECT с определенными координатами. Можно ли вызвать ToolTipText, если курсор зайдет в этот RECT (у меня тоже Label, у которого нет этого хэндла, в чем и проблема)?
да, Xury - это я
PtInRect в API viewer'e объявлена неправильно. там вот чё написано:
Declare Function PtInRect Lib "user32" Alias "PtInRect" (lpRect As RECT, pt As POINTAPI) As Long
А надо вот как:
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal ptx As Long, ByVal pty As Long) As Long
и это очень важно! ведь они даже не потрудились ByVal написать.
SetRect не требует хэндла, значит, откуда этой ф-ции знать, относительно чего задаются координаты нами.
Но мы то знаем, что Left и Top - это клиентские в твипах. Width/Height - это вообще числа.
Можно ли вызвать ToolTipText, если курсор зайдет в этот RECT
Да можно наверное, если ты знаешь как програмно вызвать ToolTipText, а то я не знаю чё то
Насчет этого ToolTipText'а, у меня есть несколько примеров создания программной подсказки и они все требуют хэндл. Может, тогда придется свою собственную подсказку описывать?
Вот, смотри, чё я делаю:
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim t_RECT As RECT
Option Explicit
Private Sub Command1_Click()
Call SetRect(t_RECT, 1200, 360, 1315, 615)
End Sub
И у меня в этом t_RECT описывается область экрана (и вроде бы в пикселях).
Скорее всего, мы просто недопонимаем друг друга. Напиши, плиз, как ты юзаешь client'ский RECT.
Кстати, у Region'ов есть хэндл. Можно его использовать как хэндл у программных ToolTipText'ов (или это два совершенно разных дескриптора)?
Ой, ведь так легко было с Label'ом и ToolTipText'ом, что даже противно, как я ранше не догадался! ((
Раз у Label'а нет хэндла, ToolTipText нужно присваивать его контейнеру, что мне и говорил HACKER.
По ходу я правдо ч то не понял...
Вот этот пример обведёт твой лабн прямоуголиником и выведет клиентские координаты Left
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim r As RECT
Private Sub Form_Load()
Show
Me.ScaleMode = 3
Me.AutoRedraw = True
' положи на форму лабл
With Label1
SetRect r, .Left, .Top, .Left + .Width, .Top + .Height
End With
'выводим Left для сравнения
Me.Caption = "Label Left:=" & Label1.Left & " RECT Left:=" & r.Left
'так что мы видим-всё в клиентских и не зависит от положения формы
' увеличиваем немного
InflateRect r, 2, 2
With r
Rectangle Me.hdc, .Left, .Top, .Right, .Bottom
End With
Refresh
End Sub
Нет! Обводит лэйбл код правильно лишь потому, что рисуем-то мы на форме (Me.hdc), а в r - область экрана! Вот, проверь:
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal ptx As Long, ByVal pty As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim R As RECT
Dim Pt As POINTAPI
Option Explicit
Private Sub Form_Load()
Me.ScaleMode = 3
Me.AutoRedraw = True
With Label1
Call SetRect(R, .Left, .Top, .Left + .Width, .Top + .Height)
End With