Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Вопрос про Label и мышь Добавлено: 30.05.05 12:46  

Автор вопроса:  astoro | ICQ: 649109 
Есть на форме два лейбла
Как сделать чтобы при движении мыши над первым лейблом появлялось сообщение на втором, а при выходе мыши за пределы первого лейбла сообщение на втором исчезало.
Голову уже всю поломал себе с эти делом.

Понятно, что можно отследить MouseMove и выключить второй лейбл при срабатывании над формой, а включить при срабатывании над первым лейблом, однако это не подходит, т.к. первый лейбл находится в контейнере, который не имеет события MouseMove.
Может можно как-нибудь отслеживать движении мыши по форме так, чтобы MouseMove формы всегда срабатывал, независимо от того, над чем мышь реально движеться, или еще как нибудь...

Ответить

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

Номер ответа: 1
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #1
Добавлено: 30.05.05 20:10
API - ScreenToClient

Ответить

Номер ответа: 2
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #2
Добавлено: 30.05.05 20:13
API - ScreenToClient

Тьфу! Забыл же, у Label'ов нет хэндла! :(
Сорри...

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 30.05.05 20:45
не, правильно ты про ScreenToClient, я вот просто подумал про решение, которй некрасивое, но имхо, надёжное: Сделай RECT, который описывает твой лабл, получай (не знаю по таймеру или как то ещё) GetCursorPos, потом выполни ScreenToClient, проверь через PtInRect... короче, я пример делал с кнопками, котррые рисуются DrawFrameControl'ом с подновороченной графикой и события которых происходили при участии вышеперечислены функций проходили идеально, несмотря на юзанье МаусМув вместо таймера

Ответить

Номер ответа: 4
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #4
Добавлено: 31.05.05 20:07
2Morpheus: классное решение! А чего ты говоришь, что оно некрасивое?

Ответить

Номер ответа: 5
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #5
Добавлено: 31.05.05 20:29
Да кстати, Morpheus, у Type RECT координаты задаются относительно всего экрана? А тогда, имхо, при перемещении формы Label уже не будет в том самом RECT. Или я не прав?

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #6
Добавлено: 31.05.05 21:15
Нет, RECT - это client. для этого и юзаем ScreenToClient.

Ответить

Номер ответа: 7
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #7
Добавлено: 31.05.05 21:45
RECT - это client

Тогда я чего-то недопонимаю :) Напиши, как юзать RECT.

Ответить

Номер ответа: 8
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #8
Добавлено: 31.05.05 22:37
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 .....

Ну и присваеваешь ему границы лабла... или я ты не это имел в виду?

Ответить

Номер ответа: 9
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #9
Добавлено: 31.05.05 22:56
В листинге, что ты привел, RECT не выступает как client. Если я не ошибаюсь, эти координаты (X1, Y1; X2, Y2) задаются относительно всего экрана, ведь SetRect не требует хэндла, значит, откуда этой ф-ции знать, относительно чего задаются координаты нами.
Если я все-таки прав, то, правда, все равно можно будет "отслеживать" этот Label через таймер.

Кстати, у меня есть вопросы по сходной теме.
1. Напиши, пожалуйста, как ты юзал ф-цию PtInRect, а то у меня VB вылетает, когда до нее доходит.
2. Вот, к примеру, я юзаю RECT с определенными координатами. Можно ли вызвать ToolTipText, если курсор зайдет в этот RECT (у меня тоже Label, у которого нет этого хэндла, в чем и проблема)?

Ответить

Номер ответа: 10
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #10
Добавлено: 31.05.05 22:58
Блин, всегда что-нибудь забываю или спросить, или написать :(

Morpheus, а Xury в аське - это ты? Когда ты вообще выходишь в нее?

Ответить

Номер ответа: 11
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #11
Добавлено: 01.06.05 04:28
2 Black Dragon

да, 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, а то я не знаю чё то :(

Ответить

Номер ответа: 12
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #12
Добавлено: 01.06.05 11:07
PtInRect в API viewer'e объявлена неправильно

Тогда ясно, чего VB вылетал.

Насчет этого 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'ов (или это два совершенно разных дескриптора)?

Ответить

Номер ответа: 13
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #13
Добавлено: 01.06.05 11:46
Ой, ведь так легко было с Label'ом и ToolTipText'ом, что даже противно, как я ранше не догадался! :(((
Раз у Label'а нет хэндла, ToolTipText нужно присваивать его контейнеру, что мне и говорил HACKER.

Ладно, а вопрос о Label и RECT у нас остается :)

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #14
Добавлено: 01.06.05 16:32
По ходу я правдо ч то не понял...
Вот этот пример обведёт твой лабн прямоуголиником и выведет клиентские координаты 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

Ответить

Номер ответа: 15
Автор ответа:
 Black Dragon



ICQ: 321186096 

Вопросов: 30
Ответов: 347
 Web-сайт: в разработке
 Профиль | | #15
Добавлено: 01.06.05 20:18
Нет! Обводит лэйбл код правильно лишь потому, что рисуем-то мы на форме (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
   
   Me.Caption = "Label Left:=" & Label1.Left & "; RECT Left:=" & R.Left
   
   Call InflateRect(R, 2, 2)
   
   With R
      Call Rectangle(Me.hdc, .Left, .Top, .Right, .Bottom)
   End With
End Sub

Private Sub Timer1_Timer()
   Call GetCursorPos(Pt)
   Label1.Caption = PtInRect(R, Pt.X, Pt.Y)
End Sub

Поводи курсором по лэйблу. Если курсор в RECT'е, то Label1.Caption = 1, если нет - Label1.Caption = 0.

Ответить

Страница: 1 | 2 |

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



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