1

Тема: AHK: Изменить цвет текста в Gui под курсором мыши

Добрый вечер, уважаемые!

Подскажите пожалуйста, как сделать, чтобы цвет текста в Gui менялся при наведении на него курсора мыши.
Пробовал с WM_MOUSEMOVE, ничего не получается.
Может чего не так делаю ...

2 (изменено: teadrinker, 2017-10-27 01:46:41)

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Задача не такая простая, как кажется на первый взгляд.

Gui, Font, s24
Gui, Add, Text, cBlue hwndhText center, I'm blue
OnMessage( 0x200, Func("WM_MOUSEMOVE").Bind(hText) )
Gui, Show
return

GuiClose:
   ExitApp

WM_MOUSEMOVE(hText, wp, lp)  {
   static hover
   MouseGetPos,,,, hControl, 2
   if (lp = "timer")   {
      if (hControl != hText)  {
         SetTimer,, Off
         hover := ""
         Gui, %wp%:Font, cBlue
         GuiControl, %wp%: Font, %hText%
         GuiControl, %wp%:, %hText%, I'm blue
      }
   }
   else {
      if (!hover && hText = hControl)  {
         hover := true
         Gui, Font, cRed
         GuiControl, Font, %hText%
         GuiControl,, %hText%, I'm red!
         timer := Func(A_ThisFunc).Bind(hText, A_Gui, "timer")
         SetTimer, % timer, 100
      }
   }
}

Что непонятно, спрашивайте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: Изменить цвет текста в Gui под курсором мыши

http://forum.script-coding.com/viewtopic.php?id=13100
http://cdn.bmwclub.ru/data/attachments/1520/1520436-efc12af88a8c24f4974f762a7ca00171.jpg

4

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Но решение там неверное.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5 (изменено: Mambr, 2017-10-27 11:47:49)

Re: AHK: Изменить цвет текста в Gui под курсором мыши

teadrinker, большое спасибо за пример!
Реально, не так просто реализовать, как думал.
Буду разбираться.
Если не сложно, каким образом можно сделать эту функцию, чтобы работала не только с одним id текста?

Например, если добавить:

Gui, Add, Text, cBlue hwndhText1
Gui, Add, Text, cGreen hwndhText2
... т.д.

Чтобы не изменять эту функцию для каждого отдельного элемента текста

if (hControl != hText)  {
...

6

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Array:=[hText1, hText2, hText3]
MsgBox % IndexOf(Array, hCntrl)

IndexOf(Arr, needle, fromIndex:=1) {
	if (fromIndex = 1) {
		for index, value in Arr
			if (value = needle)
				return index
	} else
		loop % Arr.MaxIndex() - fromIndex + 1
			if (needle = Arr[A_Index + fromIndex - 1])
				return A_Index + fromIndex - 1
	return false
}

7 (изменено: teadrinker, 2017-10-27 13:35:19)

Re: AHK: Изменить цвет текста в Gui под курсором мыши

В этом примере все контролы, имеющие в своей ассоциированной переменной текст "ChangeColor", будут менять цвет:

Gui, Font, s24
Gui, Add, Text, cBlue xp y+5, Forever blue!
Loop 5
   ; нужна метка перехода g, иначе переменная A_GuiControl будет пустой
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy, I'm blue
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
Dummy:
Return

WM_MOUSEMOVE(wp, lp, msg)  {
   static hover := {}
   if (msg = "timer")  {
      MouseGetPos,,,, hControl, 2
      if (hControl != lp)  {
         SetTimer,, Delete
         hover[lp] := false
         Gui, %wp%:Font, cBlue
         GuiControl, %wp%:Font, %lp%
         GuiControl, %wp%:, %lp%, I'm blue
      }
   }
   else  {
      GuiControlGet, hText, hwnd, %A_GuiControl%
      if ( !hover[hText] && InStr(A_GuiControl, "ChangeColor") )  {
         hover[hText] := true
         Gui, Font, cRed
         GuiControl, Font, %A_GuiControl%
         GuiControl,, %A_GuiControl%, I'm red!
         timer := Func(A_ThisFunc).Bind(A_Gui, hText, "timer")
         SetTimer, % timer, 100
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

8

Re: AHK: Изменить цвет текста в Gui под курсором мыши

teadrinker, еще раз большое спасибо!

Отличный пример - все красиво, изящно, наглядно.

Спасибо!

9

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Ошибочка маленькая. В этом случае нужно вместо SetTimer,, Off писать SetTimer,, Delete, отредактировал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

10 (изменено: Mambr, 2017-10-29 23:21:38)

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Если добавить более двух меток перехода, почему-то вываливается ошибка.

Я делал так:

Gui, Font, s24
Gui, Add, Text, cBlue xp y+5, Forever blue!
Loop 1
   ; нужна метка перехода g, иначе переменная A_GuiControl будет пустой
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy1, I'm blue
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy2, I'm blue
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy3, I'm blue
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
Return

Dummy1:
Return

Dummy2:
Return

Dummy3:
Return

WM_MOUSEMOVE(wp, lp, msg)  {
   static hover := {}
   if (msg = "timer")  {
      MouseGetPos,,,, hControl, 2
      if (hControl != lp)  {
         SetTimer,, Delete
         hover[lp] := false
         Gui, %wp%:Font, cBlue
         GuiControl, %wp%:Font, %lp%
         GuiControl, %wp%:, %lp%, I'm blue
      }
   }
   else  {
      GuiControlGet, hText, hwnd, %A_GuiControl%
      if ( !hover[hText] && InStr(A_GuiControl, "ChangeColor") )  {
         hover[hText] := true
         Gui, Font, cRed
         GuiControl, Font, %A_GuiControl%
         GuiControl,, %A_GuiControl%, I'm red!
         timer := Func(A_ThisFunc).Bind(A_Gui, hText, "timer")
         SetTimer, % timer, 100
      }
   }
}

А с двумя работает нормально. Может чего не так делаю?

11

Re: AHK: Изменить цвет текста в Gui под курсором мыши

  Gui, Add, Text, cBlue xp y+5 wp center vChangeColor1 gDummy1, I'm blue
  Gui, Add, Text, cBlue xp y+5 wp center vChangeColor2 gDummy2, I'm blue
  Gui, Add, Text, cBlue xp y+5 wp center vChangeColor3 gDummy3, I'm blue
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

12 (изменено: teadrinker, 2017-10-30 19:45:48)

Re: AHK: Изменить цвет текста в Gui под курсором мыши

А зачем добавлять несколько меток перехода? Достаточно одной:

Gui, Font, s24
Gui, Add, Text, cBlue y+5, Forever blue!
Loop 3  {
   ; нужна метка перехода g, иначе переменная A_GuiControl будет пустой
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy, I'm blue
}
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
Dummy:
Return

WM_MOUSEMOVE(wp, lp, msg)  {
   static hover := {}
   if (msg = "timer")  {
      MouseGetPos,,,, hControl, 2
      if (hControl != lp)  {
         SetTimer,, Delete
         hover[lp] := false
         Gui, %wp%:Font, cBlue
         GuiControl, %wp%:Font, %lp%
         GuiControl, %wp%:, %lp%, I'm blue
      }
   }
   else  {
      GuiControlGet, hText, hwnd, %A_GuiControl%
      if ( !hover[hText] && InStr(A_GuiControl, "ChangeColor") )  {
         hover[hText] := true
         Gui, Font, cRed
         GuiControl, Font, %A_GuiControl%
         GuiControl,, %A_GuiControl%, I'm red!
         timer := Func(A_ThisFunc).Bind(A_Gui, hText, "timer")
         SetTimer, % timer, 100
      }
   }
}

Или то же самое без цикла:

Gui, Font, s24
Gui, Add, Text, cBlue y+5, Forever blue!
Gui, Add, Text, cBlue xp y+5 wp center vChangeColor1 gDummy, I'm blue
Gui, Add, Text, cBlue xp y+5 wp center vChangeColor2 gDummy, I'm blue
Gui, Add, Text, cBlue xp y+5 wp center vChangeColor3 gDummy, I'm blue
Gui, Show
OnMessage(0x200, "WM_MOUSEMOVE")
Dummy:
Return

WM_MOUSEMOVE(wp, lp, msg)  {
   static hover := {}
   if (msg = "timer")  {
      MouseGetPos,,,, hControl, 2
      if (hControl != lp)  {
         SetTimer,, Delete
         hover[lp] := false
         Gui, %wp%:Font, cBlue
         GuiControl, %wp%:Font, %lp%
         GuiControl, %wp%:, %lp%, I'm blue
      }
   }
   else  {
      GuiControlGet, hText, hwnd, %A_GuiControl%
      if ( !hover[hText] && InStr(A_GuiControl, "ChangeColor") )  {
         hover[hText] := true
         Gui, Font, cRed
         GuiControl, Font, %A_GuiControl%
         GuiControl,, %A_GuiControl%, I'm red!
         timer := Func(A_ThisFunc).Bind(A_Gui, hText, "timer")
         SetTimer, % timer, 100
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

13

Re: AHK: Изменить цвет текста в Gui под курсором мыши

Alectric пишет:

А зачем нужен таймер?

Тут не один таймер, а по таймеру на каждый контрол. Когда курсор оказывается над контролом, такой таймер включается для этого контрола, чтобы отследить момент, когда курсор покинет его, и нужно будет менять цвет обратно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

14

Re: AHK: Изменить цвет текста в Gui под курсором мыши

teadrinker пишет:

А зачем добавлять несколько меток перехода?

Просто эксперементировал. Хотел сделать запуск разных MsgBox из каждого текста.


   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy1, I'm blue
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy2, I'm blue
   Gui, Add, Text, cBlue xp y+5 wp center vChangeColor%A_Index% gDummy3, I'm blue

Dummy1:
	MsgBox  1
Return

Dummy2:
	MsgBox 2
Return

Dummy3:
	MsgBox 3
Return

Почему-то вываливается ошибка

Alectric уже подсказал, что не так делал.

Надо было A_Index убрать.

Разобрался. Спасибо! Все работает.