1 (изменено: Alectric, 2024-07-21 12:57:16)

Тема: 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}
  }
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.