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
Telegram jollycoder

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
Telegram jollycoder

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
Telegram jollycoder

8

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

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

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

Спасибо!

9

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

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

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

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

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
Telegram jollycoder

13

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

Alectric пишет:

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

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

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

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 убрать.

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

15

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

Какой метод лучше использовать, чтобы получить схожий результат для изображения?

Чтобы картинка А при наведения на нее курсора мыши, менялось на картинку Б.

16

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

В моём сообщении в начале темы есть ссылка на код, в котором отслеживается ЭУ под курсором. Работает стабильно.

17 (изменено: gosha.pudin, 2018-02-11 21:34:30)

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

ypppu пишет:

В моём сообщении в начале темы есть ссылка на код, в котором отслеживается ЭУ под курсором. Работает стабильно.

Я ознакомился с данным примером, если не затруднит дать небольшое пояснение как задействовать действие при наведении курсора правильно?

Данный пример отлично работает с подсветкой текста, но нестабилен с графикой.


GUI, Add, Text, vMainText hwndMyText, Main text
GUI, Add, Picture, x20 y20 vMAIN1, C:\OFF.BMP
GUI, Add, Picture, x20 y20 vMAIN2, C:\ON.BMP
GUI, Show
SetTimer, Text_check , 100
SetTimer, Pic_check , 100
Return
Text_check:
MouseGetPos, , , , TABLA, 2
IF TABLA = %MyText%
{
Gui, Font, cRed
GuiControl, Font, MainText
}
Else
{
Gui, Font, cDefault
GuiControl, Font, MainText
}
Pic_check:
MouseGetPos, , , , TABLB, 2
If TABLB = %MAIN1%
{
GuiControl, Hide, MAIN1
GuiControl, Show, MAIN2
}
Else
{
GuiControl, Hide, MAIN2
GuiControl, Show, MAIN1
}

Также не ясно почему в данной конструкции есть зависимость между:


MouseGetPos, , , , TABLA, 2
///
MouseGetPos, , , , TABLB, 2

И почему она меняется при смене 2 на 1 в TABLB?
Возможно, я изначально использую не подходящие методы?
Существует более простой способ изменить картинку при наведении на нее курсора?

Осмелюсь предположить, что есть более простое решение без временной переменной…

18

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

ypppu, у меня в вашем коде надпись 11111111 постоянно мелькает (Win-7 Classic theme).

19 (изменено: ypppu, 2018-02-11 23:37:27)

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

Malcev, на XP работает. Возможно, если немного усложнить условия проверки, то и на 7ке заработает без мельканий.

Пример с картинкой плюс доработка против мельканий:

GUI, Add, Picture, vPicture1 Icon4 hwndMyPicture, %A_WinDir%\system32\shell32.dll
GUI, Show
SetTimer, Picture_check , 100
Return



Picture_check:
MouseGetPos, , , , OutputVarControl, 2

IF OutputVarControl = %MyPicture%
	{
	If flag != 5
		{
		GuiControl,, Picture1, *icon5 %A_WinDir%\system32\shell32.dll
		flag = 5
		}
	}

ELSE
	{
	If flag = 5
		{
		GuiControl,, Picture1, *icon4 %A_WinDir%\system32\shell32.dll
		flag = 4
		}
	}
Return




F5:: Reload

20

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

ypppu
А существует возможность избежать использование: SetTimer?

21

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

Изучайте вариант от teadrinker.

22

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

Malcev

Действительно, Я рассматривал этот вариант, но полноценной (корректной) работы добиться не удалось.
Данный пример хорошо работает с текстом, но к моему сожалению не получается применить его к картинке.

23

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

Значит что-то не то делаете.
Приведите свой код.

24 (изменено: gosha.pudin, 2018-02-12 02:28:43)

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

Malcev
Ранние я приводил пример, наиболее удачной конструкции, но имеющей описанные выше недостатки.

Код который приведен Разработчиком teadrinker применим к тексту но адаптировать его для графики не вижу возможным, так как большая его часть использует Цвет и Шрифт.

25

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

Чтобы его адаптировать для графики нужно вначале понять как скрипт работает.
Для этого нужно почитать команды которые там используются, попытаться понять для чего они там нужны и если есть какие-то по ним вопросы задать их на форуме.

26

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

Malcev пишет:

Чтобы его адаптировать для графики нужно вначале понять как скрипт работает.
Для этого нужно почитать команды которые там используются, попытаться понять для чего они там нужны и если есть какие-то по ним вопросы задать их на форуме.

Именно в данном контексте вопрос и был задан:

… если не затруднит дать небольшое пояснение как задействовать действие при наведении курсора правильно?
Данный пример отлично работает с подсветкой текста, но нестабилен с графикой.


GUI, Add, Text, vMainText hwndMyText, Main text
GUI, Add, Picture, x20 y20 vMAIN1, C: \OFF.BMP
GUI, Add, Picture, x20 y20 vMAIN2, C:\ON.BMP
GUI, Show
SetTimer, Text_check , 100
SetTimer, Pic_check , 100
Return
Text_check:
MouseGetPos, , , , TABLA, 2
IF TABLA = %MyText%
{
Gui, Font, cRed
GuiControl, Font, MainText
}
Else
{
Gui, Font, cDefault
GuiControl, Font, MainText
}
Pic_check:
MouseGetPos, , , , TABLB, 2
If TABLB = %MAIN1%
{
GuiControl, Hide, MAIN1
GuiControl, Show, MAIN2
}
Else
{
GuiControl, Hide, MAIN2
GuiControl, Show, MAIN1
}

Почему в данной конструкции есть зависимость между


MouseGetPos, , , , TABLA, 2
///
MouseGetPos, , , , TABLB, 2

И почему она пропадает при смене 2 на 1 в TABLB?
Возможно, я изначально использую не подходящие методы?
Cуществует более простой способ изменить картинку при наведении на нее курсора?

27 (изменено: teadrinker, 2018-02-12 20:03:03)

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

Gui, Add, Text, vText gDummy, Main text
Gui, Add, Pic, w32 h-1 vPic1 gDummy Icon28, shell32
Gui, Add, Pic, wp hp xp yp Hidden vPic2 gDummy Icon110, shell32
Gui, Show, w200 h100
OnMessage(0x200, "WM_MOUSEMOVE")
Dummy:
Return

GuiClose:
   ExitApp

WM_MOUSEMOVE(wp, lp, msg, hwnd)  {
   static hover := {}
   if (wp = "timer")  {
      MouseGetPos,,,, hControl, 2
      if (hControl != hwnd)  {
         SetTimer,, Delete
         hover[hwnd] := false
         
         if (msg = "text")  {
            Gui, %lp%:Font, cDefault
            GuiControl, %lp%:Font, % hwnd
         }
         else  {
            GuiControl, %lp%:Hide, Pic2
            GuiControl, %lp%:Show, Pic1
         }
      }
   }
   else  {
      if ( A_GuiControl = "Text" && !hover[hwnd] )  {
         hover[hwnd] := true
         Gui, Font, cRed
         GuiControl, Font, Text
         timer := Func(A_ThisFunc).Bind("timer", A_Gui, "text", hwnd)
         SetTimer, % timer, 100
      }
      else if (A_GuiControl = "Pic1")  {
         GuiControl, Hide, Pic1
         GuiControl, Show, Pic2
      }
      else if ( A_GuiControl = "Pic2" && !hover[hwnd] )  {
         hover[hwnd] := true
         timer := Func(A_ThisFunc).Bind("timer", A_Gui, "pic", hwnd)
         SetTimer, % timer, 100
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

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

gosha.pudin, вашем коде первый таймер проверяет, тоже самое, что и второй, так как перед Pic_check: не стоит return.
MouseGetPos, , , , TABLB, 2 сохраняет в переменную TABLB хендл контрола, а вы эту переменную сравниваете не с хендлом, а с содержимым контрола с картинкой (пустым значением).