Тема: AHK: Альтернатива стандартному Tooltip
Возможности альтернативного Tooltip:
Включение прозрачности, в том числе прозрачность для кликов мышью;
Автоматическое пропадание после указанного времени;
Пропадание при нажатии;
Изменение параметров шрифта;
Изменение цвета фона;
Уменьшенное мерцание при частом обновлении текста;
Работа с несколькими мониторами.
Пример:
SetBatchLines,-1
tooltip1:=new Tool_Tip()
tooltip1.Show("Это тестовый текст`n`nНажмите F1 чтобы переключить прозрачность",,,10000)
tooltip2:=new Tool_Tip()
loop
{
mousegetpos,mX,mY,mW,mC
text:="Альтернативный Tooltip`n" a_tickcount "`nmX=" mX "`nmY=" mY "`nmW=" mW "`nmC=" mC
tooltip2.Show(text,,,,Trans,0x303030,"c00FF00 s12 w600 italic underline","Times New Roman")
; tooltip2.Show("Static text`n`n`n`n`nCollision test",,,2000,Trans)
sleep,30
}
return
esc::
exitapp
f1::
Trans:=!Trans
mousegetpos,mx,my,mw,mc
tooltip1.Show(Trans?"Прозрачность включена`nклики проходят насквозь":"Прозрачность выключена`nнажмите сюда чтобы убрать",,my-50,10000,Trans)
return
f2::
sleep,5000
return
; Ctrl+Alt+L
^!L::listlines
return
Class:
; Метод Show(Text,X,Y,Delay,Transparent,BackColor,Font,FontName)
; Text - Текст который необходимо отобразить
; X, Y - Координаты появления относительно экрана
; Delay - задержка пропадания после вызова в миллисекундах
; Transparent - Прозрачность в формате AHK Gui (2-255), 0-не прозрачно, 1-прозрачность 180
; BackColor - Цвет фона
; Font - Параметры шрифта в формате Gui (цвет, размер, наклон, толщина, подчеркнутый, зачеркнутый)
; FontName - Название шрифта
;
; Метод Hide() - Скрывает Tooltip
;
class Tool_Tip
{
static DPICoef:=Tool_Tip.GetDPICoef()
Pos[]
{
get
{
wingetpos,X,Y,W,H,% "ahk_id " this.hTool_Tip
return {"X":X,"Y":Y,"W":W,"H":H}
}
set
{
return value
}
}
__Delete()
{
obm:=this.obm
settimer,% obm,Delete
this.obm:=""
if this.hTool_Tip
Gui,% this.hTool_Tip . ":Destroy"
}
__New()
{
this.Text:=Text
this.Font:="s9"
this.FontName:="Arial"
this.obm:=ObjBindMethod(this,"Hide")
SaveDefaultGui:=A_DefaultGui
Gui,New,+HwndhTool_Tip +ToolWindow -sysmenu -Resize +AlwaysOnTop -Caption +Border +E0x2080000
Gui,% SaveDefaultGui . ":Default"
this.hTool_Tip:=hTool_Tip
Gui,%hTool_Tip%:font,% this.Font,% this.FontName
Gui,%hTool_Tip%:Color,FFFFFF
Gui,%hTool_Tip%:Margin,2,2
Gui,%hTool_Tip%:add,text,+hwndhText
this.hText:=hText
obm:=this.obm
GuiControl,+g,% this.hTool_Tip,% obm
GuiControl,+g,% this.hText,% obm
}
Show(Text="",X="",Y="",Delay="",Trans="",BackColor="",Font="s9",FontName="Arial")
{
SaveCoordMode:=A_CoordModeMouse
CoordMode,Mouse,Screen
MouseGetPos,mX,mY,mW,mC,2
CoordMode,Mouse,% SaveCoordMode
if (X="")
X:=mX+10
if (Y="")
Y:=mY+20
if (Font!=this.Font)
{
this.Font:=Font
hTool_Tip:=this.hTool_Tip
Gui,%hTool_Tip%:font,% this.Font,% this.FontName
GuiControl,Font,% this.hText
}
if (FontName!=this.FontName)
{
this.FontName:=FontName
hTool_Tip:=this.hTool_Tip
Gui,%hTool_Tip%:font,,% this.FontName
GuiControl,Font,% this.hText
}
if (Text!=this.Text)
{
this.Text:=Text
Size:=this.Measure(Text)
GuiControl,move,% this.hText,% "w" Size.W " h" Size.H
GuiControl,,% this.hText,% Text
W:=Size.W+8
H:=Size.H+8
this.bW:=W
this.bH:=H
W/=Tool_Tip.DPICoef
H/=Tool_Tip.DPICoef
}
B:=this.Bound(X,Y,this.bW,this.bH)
X:=B.X
Y:=B.Y
if (X!=this.X or Y!=this.Y or W!=this.W or H!=this.H or BackColor!=this.BackColor or !this.Visible)
{
this.X:=X
this.Y:=Y
this.W:=W
this.H:=H
this.Visible:=true
hTool_Tip:=this.hTool_Tip
if (BackColor!=this.BackColor)
{
this.BackColor:=BackColor
Gui,%hTool_Tip%:Color,% BackColor
}
o:=(X!=""?"x" X " ":"")
. (Y!=""?"y" Y " ":"")
. (W!=""?"w" W " ":"")
. (H!=""?"h" H " ":"")
. " NoActivate"
Gui,%hTool_Tip%:show,% o
}
if (Trans!=this.OldTrans)
{
if Trans
{
WinSet,Transparent,% Trans=1?180:Trans,% "ahk_id " this.hTool_Tip
Winset,ExStyle,+0x20,% "ahk_id " this.hTool_Tip
}
else
{
WinSet,Transparent,255,% "ahk_id " this.hTool_Tip
Winset,ExStyle,-0x20,% "ahk_id " this.hTool_Tip
}
this.OldTrans:=Trans
}
if Delay
{
obm:=this.obm
settimer,% obm,% -abs(Delay)
}
}
Hide()
{
if this.hTool_Tip
Gui,% this.hTool_Tip . ":hide"
this.Visible:=false
}
Measure(Text)
{
SaveDefaultGui:=A_DefaultGui
Gui,New,+HwndhTest_Tip
Gui,% SaveDefaultGui . ":Default"
Gui,%hTest_Tip%:font,% this.Font,% this.FontName
Gui,%hTest_Tip%:add,text,+hwndhTest,% Text
GuiControlGet,Size,Pos,% hTest
Gui,%hTest_Tip%:Destroy
return {"X":SizeX,"Y":SizeY,"W":SizeW*Tool_Tip.DPICoef,"H":SizeH*Tool_Tip.DPICoef}
}
GetDPICoef()
{
SaveDefaultGui:=A_DefaultGui
gui,New:add,text,x0 y0 w1000 h1000 +hwndhTest
Controlgetpos,Testx,Testy,Testw,Testh,,ahk_id %hTest%
gui,Destroy
Gui,% SaveDefaultGui . ":Default"
return Testw/1000
}
Bound(X,Y,W=0,H=0)
{
static last:=1
SysGet,Monitor,MonitorCount
Loop,% Monitor
{
SysGet,B,Monitor,% A_Index
if (X>=BLeft and X<=BRight and Y>=BTop and Y<=BBottom)
{
SysGet,B,MonitorWorkArea,% A_Index
last:=a_index
return {"X":(X+W>BRight?BRight-W:X)
,"Y":(Y+H>BBottom?BBottom-H:Y)
,"B":a_index}
}
}
SysGet,B,MonitorWorkArea,% last
return {"X":(X+W>BRight?BRight-W:X<BLeft?BLeft:X)
,"Y":(Y+H>BBottom?BBottom-H:Y<BTop?BTop:Y)
,"B":a_index}
}
}