Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 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
    ;DoEvents
    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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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
ИМХО, даже большая куча апи лучше чем самый маленький хук!!!

Мнение автора МОЖЕТ НЕ СОВПАДАТЬ С МННИЕМ ФОРУМА. НЕ НАДО РАЗВОДИТЬ ОФФТОП ПО ЭТОМУ ПОВОДУ.

Ответить

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

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



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