Тема: AHK: ToolTip по наведению на элемент окна
Библиотека для показа тултипов по наведению курсора на контролы.
* Тултипы показываются с задаваемой задержкой.
* Для гарантированного скрытия тултипа на все время его показа создается таймер.
* При движении по контролу тултип скрывается и не показывается снова, пока курсор не покинет контрол.
Gui Add, text, HwndCntrl1Hwnd, Move the mouse cursor here
Gui Add, ComboBox, HwndCntrl2Hwnd, Do not move cursor here!
Gui Show ; ↓ Magic
CntrlToolTipArr := Object(Cntrl1Hwnd, "You did it!", Cntrl2Hwnd, "You don``t have to do that."), showDelay := 700 ;ms
HowerFn := Func("Hower").bind(CntrlToolTipArr, showDelay, false, false)
OnMessage(WM_MOUSEMOVE := 0x200, HowerFn)
Return ; ↑ Magic
GuiClose:
ExitApp
Hower(CntrlsHowerArr, showDelay, showTimer, hideTimer) {
static OldCntrlHwnd, OldHowerFn_ShowTimer, OldHowerFn_HideTimer, xTT, yTT, ToolTipExist, PreventShowToolTipOnSameCntrl, HideTimerPeriod := 200
MouseGetPos x, y,, CurrentCntrlHwnd, 2
if !(CurrentCntrlToolTipText := CntrlsHowerArr[CurrentCntrlHwnd]) {
parentCntrlHwnd := DllCall("GetParent", "UInt", CurrentCntrlHwnd)
if CurrentCntrlToolTipText := CntrlsHowerArr[parentCntrlHwnd]
CurrentCntrlHwnd := parentCntrlHwnd
}
if (OldCntrlHwnd != CurrentCntrlHwnd)
PreventShowToolTipOnSameCntrl:=false
OldCntrlHwnd := CurrentCntrlHwnd
if (!hideTimer && !showTimer) { ; WM_MOUSEMOVE
If OldHowerFn_ShowTimer {
SetTimer % OldHowerFn_ShowTimer, Delete
OldHowerFn_ShowTimer := ""
}
if (ToolTipExist && ((x != xTT) || (y != yTT))) {
ToolTipExist := false
ToolTip
PreventShowToolTipOnSameCntrl := true
} else if CurrentCntrlToolTipText {
HowerFn_ShowTimer := Func("Hower").bind(CntrlsHowerArr, showDelay, true, false)
SetTimer % HowerFn_ShowTimer, % -showDelay
OldHowerFn_ShowTimer := HowerFn_ShowTimer
}
} else if showTimer {
if (!PreventShowToolTipOnSameCntrl && CurrentCntrlToolTipText) {
ToolTipExist := true
ToolTip % CurrentCntrlToolTipText
xTT:=x, yTT:=y
HowerFn_HideTimer := Func("Hower").bind(CntrlsHowerArr, showDelay, false, true)
SetTimer % HowerFn_HideTimer, % HideTimerPeriod
OldHowerFn_HideTimer := HowerFn_HideTimer
}
} else if hideTimer {
if (ToolTipExist && !CurrentCntrlToolTipText) {
ToolTipExist := false
ToolTip
SetTimer % OldHowerFn_HideTimer, Delete
}
}
}
Если кто подскажет, как сделать код проще и изящнее буду признателен.