Страница: 1 | 2 | 3 |
Вопрос: UserControl.Move
Добавлено: 19.08.04 22:26
Автор вопроса: night-roll
всем доброго времени суток!
мучает меня вопрос:
[B]как отследить MouseMove вне контрола?[\B]
проблема такая - прорисовываю КОНТРОЛ при UserControl.Move, а при выходе из него он не прорисовывается в "дефаулт".
чё я только не делал: в UserControl.Move отслеживал прохождение курсора по границам (даже с запасом), вставлял таймер по постоянному отслеживанию положения курсора, но чё-то не то - не красиво(эстетики нет, понимаете!).... может криво написал? в архиве тоже по этому поводу ничего нет :(
P.S.
и ещё 1 просьба, напишите описание АПИ-шки transporent...(чего-то там, не помню, по-моему Bit).
весь архив перерыл ничего нет :(
зарнее спасибо заглянувшим.
Ответы
Всего ответов: 44
Номер ответа: 1
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #1
Добавлено: 19.08.04 22:28
Функция TransparentBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей заданного исходного контекста устройства в целевой контекст устройства.
Номер ответа: 2
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #2
Добавлено: 19.08.04 22:31
Для более полного описания загляни хотя бы в Яндекс и набери TransparentBlt
Номер ответа: 3
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #3
Добавлено: 19.08.04 22:51
>как отследить MouseMove вне контрола?
GetCursorPos это то что тебе нужно. Отслеживаешь координаты курсора и как только они выходят за контрол - все (можно и событие MouseOut создать).
>вставлял таймер по постоянному отслеживанию положения курсора...
Если это то что я написал свеху, то сорри, других вариантов решения не знаю.
Номер ответа: 4
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #4
Добавлено: 19.08.04 22:55
TransparentBlt
The TransparentBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.
Parameters
Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
· hdcDest
[in] Handle to the destination device context.
· nXOriginDest
[in] Specifies the x-coordinate, in logical units, of the upper-left corner of the destination rectangle.
· nYOriginDest
[in] Specifies the y-coordinate, in logical units, of the upper-left corner of the destination rectangle.
· nWidthDest
[in] Specifies the width, in logical units, of the destination rectangle.
· hHeightDest
[in] Handle to the height, in logical units, of the destination rectangle.
· hdcSrc
[in] Handle to the source device context.
· nXOriginSrc
[in] Specifies the x-coordinate, in logical units, of the source rectangle.
· nYOriginSrc
[in] Specifies the y-coordinate, in logical units, of the source rectangle.
· nWidthSrc
[in] Specifies the width, in logical units, of the source rectangle.
· nHeightSrc
[in] Specifies the height, in logical units, of the source rectangle.
· crTransparent
[in] The RGB color in the source bitmap to treat as transparent.
-------------------------
If the function succeeds, the return value is TRUE.
If the function fails, the return value is FALSE.
Example
'This project needs 2 pictureboxes
'Picturebox1 must contain a picture with a lot of white pixels (we're going to use white as transparent color)
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Picture1.AutoSize = True
'API uses pixels
Picture1.ScaleMode = vbPixels
Picture2.ScaleMode = vbPixels
End Sub
Private Sub Picture2_Paint()
'If we don't call DoEvents first, our transparent image will be completely wrong
 oEvents
TransparentBlt Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbWhite
End Sub
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 19.08.04 22:57
Kodo, причем тут мышь ? тут человеку нужно при передвижении в design-time контрола его перерисовывать... Я сам маялся с такой проблеммой, но окромя как таймер + GetWindowRect + ScreenToClient, ничего не нашел
Номер ответа: 6
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #6
Добавлено: 20.08.04 01:29
спасибо Kodo, но мне надо было лишь описание (правда, лишний примерчик никогда не помешает - вдруг опять кто-нибудь будет спрашивать, тогда ему можно дать ссылку сюда!)
и, действительно, GetCursorPos тут не подойдёт.
для Lister: если всё так было просто, то и обращаться бы не стал - ты представь сколько ссылок, а сколько бесполезных или на другие языки!
всем спасибо!!!!!
но всё-таки, неужели нет простого способа отследить хотя бы выход курсора за пределы КОНТРОЛА (to sne: будем называть это по-ламерски, дабы ясна была задача).
Номер ответа: 7
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #7
Добавлено: 20.08.04 01:50
Самая первая ссылка после поиска TransparentBlt в яндексе привела на полное описание функции на русском, но действительно не для Vb - но в этом, я считаю, ничего страшного нет. Ты же просил описание, а не пример. А описание там отменное. Да и по-русски все
А насчет отслеживания выхода курсора - покапайся в примерах на сайте там должны быть какие-нибудь примеры создания кнопок или прочего... К тому же sne прав кроме таймера + GetWindowRect + ScreenToClient ничего подходящего нет...
Ну, уж таймер-то точно нужен! Иначе как ты будешь проверять ушел курсор за контрол или нет?
Номер ответа: 8
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #8
Добавлено: 22.08.04 17:31
короче всё сводится к тому, что всё-таки придётся использовать GetCursorPos (таймер без вопросов), а вот можно ли определить хендл объекта, над которым находится курсор?
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 22.08.04 17:43
night-roll
Че ты маешься? Функция API TrackMouseEvent для чего существует?
И ещё: WindowFromPoint
Номер ответа: 10
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #10
Добавлено: 22.08.04 18:11
Вот именно, что GetCursorPos + WindowFromPoint !
Примерчик (а куда ж без него ) :
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Sub Timer1_Timer()
Dim Point As POINTAPI
ret = GetCursorPos(Point)
Me.caption = WindowFromPoint(Point.x, Point.y)
End Sub
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 22.08.04 19:04
Ну на хрена тебе GetCursorPos + WindowFromPoint?
TrackMouseEvent тебе сообщит о моменте покидания объекта или моменте появления мыши на объекте (в зависимости от установленного флага придет WM_MOUSELEAVE или WM_MOUSEHOVER). Когда инициализируешь свой объект, запусти TrackMouseEvent с hwnd этого объекта. И жди сообщений.
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 22.08.04 19:44
cresta,
Ты ему лучше пример покажи. А он уж пусть решает что ему удобнее.
Номер ответа: 13
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #13
Добавлено: 22.08.04 19:49
2cresta:
ИМХО, night-roll прпросил:
> ...а вот можно ли определить хендл объекта, над которым находится курсор?
Я и ответил. TrackMouseEvent не узнаешь текущее hwnd под курсором.
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 22.08.04 21:15
Я так понял, ему hwnd нужен, чтобы определить, вышла мышь за пределы контрола или нет. Если использовать TrackMouseEvent, необходимость в дополнительных операциях типа GetCursorPos + WindowFromPoint + куча бесполезных действий программы по постоянному контролю положения мыши отпадает.
Вот пример использования TrackMouseEvent:
ЭТО КОД В МОДУЛЕ:
'==================================
Public Const WM_MOUSELEAVE = &H2A3&
Public Const WM_MOUSEHOVER As Long = &H2A1
Public Const WM_MOUSEMOVE As Long = &H200
Public Type TRACKMOUSEEVENTTYPE
cbSize As Long
dwFlags As Long
hwndTrack As Long
dwHoverTime As Long
End Type
Declare Function TrackMouseEvent Lib "user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As Long
Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function LoByte Lib "TLBINF32" Alias "lobyte" (ByVal Word As Integer) As Byte
Declare Function HiByte Lib "TLBINF32" Alias "hibyte" (ByVal Word As Integer) As Byte
Declare Function loword Lib "TLBINF32" (ByVal DWord As Long) As Integer
Declare Function hiword Lib "TLBINF32" (ByVal DWord As Long) As Integer
Public Const GWL_WNDPROC = (-4)
Public PrevProc As Long
Public ET As TRACKMOUSEEVENTTYPE
Public Sub HookForm(F As Form)
PrevProc = SetWindowLong(F.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
SetWindowLong F.hWnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_MOUSELEAVE
Form1.Caption = "Мышь за формой"
Case WM_MOUSEMOVE
Form1.Caption = "Мышь на форме" & Str$(loword(lParam)) & "," & Str$(hiword(lParam))
End Select
WindowProc = CallWindowProc(PrevProc, hWnd, uMsg, wParam, lParam)
End Function
'=========================
ЭТО КОД ФОРМЫ
'=========================
Private Sub Form_Load()
HookForm Me
ET.dwFlags = TME_LEAVE Or TME_HOVER ' Or TME_NONCLIENT
ET.cbSize = Len(ET)
ET.hwndTrack = Me.hWnd
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
TrackMouseEvent ET
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookForm Me
End Sub
Private Sub Комманда1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.Caption = "Мышь на кнопке" & Str$(X) & "," & Str$(Y)
End Sub
'==========================================================
Номер ответа: 15
Автор ответа:
Kodo
Разработчик Offline Client
ICQ: 293048085
Вопросов: 37
Ответов: 457
Профиль | | #15
Добавлено: 22.08.04 22:14
ИМХО, даже большая куча апи лучше чем самый маленький хук!!!
Мнение автора МОЖЕТ НЕ СОВПАДАТЬ С МННИЕМ ФОРУМА. НЕ НАДО РАЗВОДИТЬ ОФФТОП ПО ЭТОМУ ПОВОДУ.