1

Тема: AHK: Изменение свойств отображения элементов GUI

Можно ли менять параметры отображения элементов GUI?
Например сделать фон, для Text, или Edit отличным от фона окна? Для Button можно назначить свой цвет, размер, и форму рамки, выпуклость, утопленность?

2

Re: AHK: Изменение свойств отображения элементов GUI

Для текста пример в статье RegisterCallback(), фон edit можно изменить обычным способом через Gui, Color, кнопки можно только свои нарисовать через GDI+, AHK использует системные.

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

3

Re: AHK: Изменение свойств отображения элементов GUI

Не нашёл как можно сделать фон Edit отличным от фона окна.

4

Re: AHK: Изменение свойств отображения элементов GUI

Gui, Color [, WindowColor, ControlColor]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5

Re: AHK: Изменение свойств отображения элементов GUI

Gui, Color [, WindowColor, ControlColor]

  К сожалению для ReadOnly не работает.

6 (изменено: serzh82saratov, 2016-04-25 12:30:28)

Re: AHK: Изменение свойств отображения элементов GUI

https://autohotkey.com/board/topic/1254 … -controls/
Я его поправил, иначе без фокуса фон ReadOnly не установлен.


#SingleInstance Force     
OnMessage(WM_CTLCOLOREDIT := 0x133, "WM_CTLCOLOR")
OnMessage(WM_CTLCOLORSTATIC := 0x138, "WM_CTLCOLOR")

Gui, Add, Edit, w100 hwndHEDIT_1, ReadWrite
Gui, Add, Edit, w100 hwndHEDIT_2 ReadOnly, ReadOnly
Gui, Show  
Return  

WM_CTLCOLOR(wParam, lParam)   { 
	Local This, BG_COLOR, FG_COLOR, hBrush
	
	if (lParam = HEDIT_1) 
		BG_COLOR := 0x000000, FG_COLOR := 0x00FF00, This := 1
	else if (lParam = HEDIT_2) 
		BG_COLOR := 0x00FF00, FG_COLOR := 0x0000FF, This := 1 
	if !This
		Return 0
	hBrush := DllCall("CreateSolidBrush", UInt, BG_COLOR)
	DllCall("SetTextColor", Ptr, wParam, UInt, FG_COLOR)
	DllCall("SetBkColor", Ptr, wParam, UInt, BG_COLOR)
	DllCall("SetBkMode", Ptr, wParam, UInt, 2)
	Return hBrush 
} 

GuiClose:
	ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Изменение свойств отображения элементов GUI

Спасибо, попробую применить.

8

Re: AHK: Изменение свойств отображения элементов GUI

Для текста пример в статье RegisterCallback()

; Пример: ниже представлен работающий скрипт, демонстрирующий сабклассинг окна GUI,
; перенаправив его WindowProc к новой WindowProc в скрипте. В этом случае цвет фона текстового элемента
; управления изменяется на указанный цвет.
TextBackgroundColor := 0xFFBBBB ; Указываем цвет в формате BGR (голубой-зеленый-красный).
TextBackgroundBrush := DllCall("CreateSolidBrush", UInt, TextBackgroundColor)

Gui, Add, Text, HwndMyTextHwnd, Вот некоторый текст, которому задают`nпроизвольный цвет фона.
Gui +LastFound
GuiHwnd := WinExist()

WindowProcNew := RegisterCallback("WindowProc", "" ; "", чтобы избежать режима fast-mode для сабклассинга
    , 4, MyTextHwnd) ; если присутствует параметр EventInfo, необходимо задать точно ParamCount
WindowProcOld := DllCall("SetWindowLong", UInt, GuiHwnd, Int, -4 ; -4 это GWL_WNDPROC
    , Int, WindowProcNew, UInt) ; Возвращаемое значение должно быть установлено как UInt или Int.

Gui Show
return

WindowProc(hwnd, uMsg, wParam, lParam)
{
    Critical
    global TextBackgroundColor, TextBackgroundBrush, WindowProcOld
    if (uMsg = 0x138 && lParam = A_EventInfo) ; 0x138 это WM_CTLCOLORSTATIC.
    {
        DllCall("SetBkColor", UInt, wParam, UInt, TextBackgroundColor)
        return TextBackgroundBrush ; Возвращаем HBRUSH, чтобы уведомить операционную систему об изменении HDC.
    }
    ; Иначе (поскольку значение, о котором говорится выше, возвращено не было),
    ; передаем все необработанные события начальному WindowProc.
    return DllCall("CallWindowProcA", UInt, WindowProcOld, UInt, hwnd, UInt, uMsg, UInt, wParam, UInt, lParam)
}

GuiClose:
ExitApp

  Почему он может не работать?

9

Re: AHK: Изменение свойств отображения элементов GUI

Может, из современной справки стоит скопировать?

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

10

Re: AHK: Изменение свойств отображения элементов GUI

Можете показать как это будет выглядеть для двух окон с двумя контролами текста в каждом?

11 (изменено: teadrinker, 2016-03-08 16:02:24)

Re: AHK: Изменение свойств отображения элементов GUI

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show, % "x" A_ScreenWidth//2 - 100

Gui, 2:Default
Gui, Add, Text, hwndhText3 w150 center, Первый текст
Gui, Add, Text, hwndhText4 wp center, Второй текст
SetColorToStatic(hText3, 0xFFFF00, 0x0000FF)
SetColorToStatic(hText4, 0x00FF00, 0xFF0000)
Gui, Show, % "x" A_ScreenWidth//2 + 100
Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	OnMessage(WM_CTLCOLORSTATIC := 0x138, Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color)))
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | (color >> 16)
}

Если потом нужно менять цвет, то немного сложнее:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

12

Re: AHK: Изменение свойств отображения элементов GUI

Почему-то выводится с дефолтным цветом. Хотя после F11 во втором варианте цвет меняется.

13

Re: AHK: Изменение свойств отображения элементов GUI

Код не меняли?

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

14

Re: AHK: Изменение свойств отображения элементов GUI

Нет. Вставил, сохранил, запустил.

15

Re: AHK: Изменение свойств отображения элементов GUI

А так:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		hBrush := DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		DllCall("SetBkMode", Ptr, wp, UInt, 2)
		Return hBrush
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

16

Re: AHK: Изменение свойств отображения элементов GUI

После запуска цвета дефолтные. После F11 меняются на жёлтый и зелёный.

17

Re: AHK: Изменение свойств отображения элементов GUI

Какая система, версия AHK? А этот пример работает?

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

18

Re: AHK: Изменение свойств отображения элементов GUI

Ещё так:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	DHW := A_DetectHiddenWindows
	DetectHiddenWindows, On
	WinSet, Redraw,, ahk_id %hwnd%
	DetectHiddenWindows, % DHW
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}

Или так:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
Gui, Show
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

19

Re: AHK: Изменение свойств отображения элементов GUI

serzh82saratov, у тебя какой-нибудь срабатывает?

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

20

Re: AHK: Изменение свойств отображения элементов GUI

Все коды работают, в смысле запустил цветные, нажал ф11 цвета поменялись.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21

Re: AHK: Изменение свойств отображения элементов GUI

Вот странно, а я уже хотел в коллекцию добавить, пример-то интересный.

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

22

Re: AHK: Изменение свойств отображения элементов GUI

1.1.22.03
Последний работает. Пока не понял в чём разница.

23 (изменено: teadrinker, 2016-03-08 23:42:36)

Re: AHK: Изменение свойств отображения элементов GUI

А такой:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138, RDW_INVALIDATE := 1
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	DllCall("RedrawWindow", Ptr, hwnd, Ptr, 0, Ptr, 0, UInt, RDW_INVALIDATE)
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}

И ОС у вас какая?

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

24 (изменено: Foma, 2016-03-08 23:50:17)

Re: AHK: Изменение свойств отображения элементов GUI

Нет, опять дефолтный в начале.
Win7 Max SP1 x64

25

Re: AHK: Изменение свойств отображения элементов GUI

Gui,1:Add, Text, hwndhText1 w150 center, Первый текст
Gui,1:Add, Text, hwndhText2 wp center, Второй текст
Gui,1:Show,x500 y400,1
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)

sleep,1

Gui,2:Add, Text, hwndhText3 w150 center, Третий текст
Gui,2:Add, Text, hwndhText4 wp center, Четвёртый текст
Gui,2:Show,x800 y420,2
SetColorToStatic(hText3, 0xFF6666, 0x6666FF)
SetColorToStatic(hText4, 0x6666FF, 0x888888)





Return

F11::
Random,fon1,555555,16777215
Random,fon2,555555,16777215
Random,fon3,555555,16777215
Random,fon4,555555,16777215
	SetColorToStatic(hText1, fon1, 16777215)
	SetColorToStatic(hText2, fon2, 0xFF0000)
	SetColorToStatic(hText3, fon3, 16777215)
	SetColorToStatic(hText4, fon4, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}

Без паузы первый не красится при старте.

26

Re: AHK: Изменение свойств отображения элементов GUI

А так:

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetColorToStatic(hText1, 0xFF0000, 0x0000FF)
SetColorToStatic(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

F11::
	SetColorToStatic(hText1, 0xFFFF00, 0)
	SetColorToStatic(hText2, 0x00FF00, 0xFF0000)
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	Sleep, 10
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	if (lp = hStatic)  {
		hBrush := DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		DllCall("SetBkMode", Ptr, wp, UInt, 2)
		Return hBrush
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

27

Re: AHK: Изменение свойств отображения элементов GUI

В общем, понятно, что после команды Gui, Show сообщение WM_CTLCOLORSTATIC почему-то то ли не всегда мониторится, то ли не всегда посылается. В качестве костыля можно попробовать использовать WinSet, Redraw:

Loop 2  {
	Gui, %A_Index%: Default
	Gui, +LastFound
	Gui, Add, Text, % "hwndhText" (n1 := A_Index*2 - 1) " w150 center", Первый текст
	Gui, Add, Text, % "hwndhText" (n2 := A_Index*2) " wp center", Второй текст
	SetColorToStatic(hText%n1%, 0xFF0000, 0x0000FF)
	SetColorToStatic(hText%n2%, 0x0000FF, 0xFFFFFF)
	Gui, Show, % "x" A_ScreenWidth//2 + (A_Index = 1 ? -100 : 100)
	WinSet, Redraw
}
Return

F11::
	Loop 4  {
		Random, Rand, 0, 0xFFFFFF
		SetColorToStatic(hText%A_Index%, Rand, Rand^0xFFFFFF)
	}
	Return

SetColorToStatic(hwnd, bg_color, fg_color = 0)
{
	static arr := [], WM_CTLCOLORSTATIC := 0x138
	(arr.HasKey(hwnd) && OnMessage(WM_CTLCOLORSTATIC, arr[hwnd], 0))
	arr[hwnd] := Func("WM_CTLCOLOR").Bind(hwnd, Rgb2Bgr(bg_color), Rgb2Bgr(fg_color))	
	OnMessage(WM_CTLCOLORSTATIC, arr[hwnd])
	WinSet, Redraw,, ahk_id %hwnd%
}

WM_CTLCOLOR(hStatic, bg_color, fg_color, wp, lp)
{
	Critical
	if (lp = hStatic)  {
		DllCall("SetBkColor", Ptr, wp, UInt, bg_color)
		DllCall("SetTextColor", Ptr, wp, UInt, fg_color)
		Return DllCall("CreateSolidBrush", UInt, bg_color, Ptr)
	}
}

Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

28

Re: AHK: Изменение свойств отображения элементов GUI

Всё равно в первом окне дефолтные цвета. Если не вставить "sleep, 1" перед "Gui, Show".

29 (изменено: teadrinker, 2016-03-12 22:14:53)

Re: AHK: Изменение свойств отображения элементов GUI

Foma, ещё так попробуйте:

Loop 2  {
	Gui, %A_Index%: Default
	Gui, Add, Text, % "hwndhText" (n1 := A_Index*2 - 1) " w150 center", Первый текст
	Gui, Add, Text, % "hwndhText" (n2 := A_Index*2) " wp center", Второй текст
	SetColorToStatic(hText%n1%, 0xFF0000, 0x0000FF)
	SetColorToStatic(hText%n2%, 0x0000FF, 0xFFFFFF)
	Gui, Show, % "x" A_ScreenWidth//2 + (A_Index = 1 ? -170 : 30)
}
Return

F11::
	Loop 4  {
		Random, Rand, 0, 0xFFFFFF
		SetColorToStatic(hText%A_Index%, Rand, Rand^0xFFFFFF)
	}
	Return

SetColorToStatic(hStatic, b_color, f_color)
{
	static arr := [], GWL_WNDPROC := -4
	hGui := DllCall("GetParent", Ptr, hStatic, Ptr)
	if !arr.HasKey(hGui)  {
		arr[hGui] := {}, arr[hGui].Statics := []
		arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), Ptr, hGui, Int, GWL_WNDPROC
												, Ptr, RegisterCallback("WindowProc", "", 4, Object(arr[hGui])), Ptr)
	}
	else if arr[hGui].Statics.HasKey(hStatic)
		DllCall("DeleteObject", Ptr, arr[hGui].Statics[hStatic].hBrush)
	arr[hGui].Statics[hStatic] := { b_color: Rgb2Bgr(b_color), f_color: Rgb2Bgr(f_color)
											, hBrush: DllCall("CreateSolidBrush", UInt, Rgb2Bgr(b_color), Ptr) }
	WinSet, Redraw,, ahk_id %hGui%
}

WindowProc(hwnd, uMsg, wParam, lParam)
{
	Critical
	static WM_CTLCOLORSTATIC := 0x138
	obj := Object(A_EventInfo)
	if (uMsg = WM_CTLCOLORSTATIC && k := obj.Statics[lParam])  {
		DllCall("SetBkColor", Ptr, wParam, UInt, k.b_color)
		DllCall("SetTextColor", Ptr, wParam, UInt, k.f_color)
		Return k.hBrush
	}
	Return DllCall("CallWindowProc", Ptr, obj.ProcOld, Ptr, hwnd, UInt, uMsg, Ptr, wParam, Ptr, lParam)
}
	
Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

30

Re: AHK: Изменение свойств отображения элементов GUI

Отлично работает, спасибо!
И даже код в Scite стал корректно отображаться.

31 (изменено: serzh82saratov, 2016-04-25 16:36:15)

Re: AHK: Изменение свойств отображения элементов GUI

teadrinker
А с чем были связаны заморочки, вроде так работает, и не мелькает при загрузке ЦП:


#SingleInstance Force     
OnMessage(WM_CTLCOLOREDIT := 0x133, "WM_CTLCOLOR")
OnMessage(WM_CTLCOLORSTATIC := 0x138, "WM_CTLCOLOR")

Gui, Add, Edit, w100 hwndHEDIT_1, ReadWrite
Gui, Add, Edit, wp hwndHEDIT_2 ReadOnly, ReadOnly
Gui, Add, Text, wp hwndhText1 Center, Первый текст
Gui, Add, Text, wp hwndhText2 Center, Второй текст
GuiControl, Focus, %hText3%
Gui, Show  
Return  

WM_CTLCOLOR(wParam, lParam)   { 
	Local BG_COLOR, FG_COLOR, hBrush
	
	if (lParam = HEDIT_1) 
		BG_COLOR := 0x000000, FG_COLOR := 0x00FF00
	else if (lParam = HEDIT_2) 
		BG_COLOR := 0x00FF00, FG_COLOR := 0x0000FF
	else if (lParam = hText1) 
		BG_COLOR := 0x000000, FG_COLOR := 0x00FF00
	else if (lParam = hText2) 
		BG_COLOR := 0x00FF00, FG_COLOR := 0x0000FF
	else
		Return 0
	hBrush := DllCall("CreateSolidBrush", UInt, BG_COLOR)
	DllCall("SetTextColor", Ptr, wParam, UInt, FG_COLOR)
	DllCall("SetBkColor", Ptr, wParam, UInt, BG_COLOR)
	DllCall("SetBkMode", Ptr, wParam, UInt, 2)
	Return hBrush 
} 
+ Или так.

#SingleInstance Force     
OnMessage(WM_CTLCOLOREDIT := 0x133, "WM_CTLCOLOR")
OnMessage(WM_CTLCOLORSTATIC := 0x138, "WM_CTLCOLOR")
Ctrl := []
Gui, Add, Edit, w200 hwndhCtrl1, ReadWrite
Gui, Add, Edit, wp hwndhCtrl2 ReadOnly, ReadOnly
Gui, Add, Text, wp hwndhCtrl3 Center, Первый текст
Gui, Add, Text, wp hwndhCtrl4 Center, Второй текст

Ctrl[hCtrl1] := {BG:0x000000,FG:0x00FF00}
Ctrl[hCtrl2] := {BG:0x00FF00,FG:0x0000FF}
Ctrl[hCtrl3] := {BG:0x000000,FG:0x00FF00}
Ctrl[hCtrl4] := {BG:0x00FF00,FG:0x0000FF}

GuiControl, Focus, %hCtrl1%
Gui, Show  
Return  

F11::
	Loop 4  {
		Random, Rand, 0, 0xFFFFFF 
		Ctrl[hCtrl%A_Index%] := {BG:Rand,FG:Rand^0xFFFFFF}
		WM_CTLCOLOR(DllCall("GetDC", "Ptr", hCtrl%A_Index%), hCtrl%A_Index%)
		DllCall("RedrawWindow", "Ptr", hCtrl%A_Index%, "Uint", 0, "Uint", 0, "Uint", 0x1|0x4)
	}
	Return
	
WM_CTLCOLOR(wParam, lParam)   { 
	Local hBrush
	If !Ctrl.HasKey(lParam) 
		Return 0
	hBrush := DllCall("CreateSolidBrush", UInt, Ctrl[lParam].BG)
	DllCall("SetTextColor", Ptr, wParam, UInt, Ctrl[lParam].FG)
	DllCall("SetBkColor", Ptr, wParam, UInt, Ctrl[lParam].BG)
	DllCall("SetBkMode", Ptr, wParam, UInt, 2)
	Return hBrush 
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

32

Re: AHK: Изменение свойств отображения элементов GUI

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

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

33

Re: AHK: Изменение свойств отображения элементов GUI

teadrinker пишет:

Не пойму, а чем эти варианты принципиально отличаются

Запись попроще, нет? И иногда мелькает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

34

Re: AHK: Изменение свойств отображения элементов GUI

Так там не в мелькании дело, а в том, что иногда вовсе не срабатывает.

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

35

Re: AHK: Изменение свойств отображения элементов GUI

А, да, у кого то не работало. Просто не понятна разница в подходе к Edit и Text.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

36

Re: AHK: Изменение свойств отображения элементов GUI

Так говорю же, у меня тоже получилось повторить ситуацию, когда не срабатывает. А в подходе к edit readonly и text разницы вроде нет.

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

37

Re: AHK: Изменение свойств отображения элементов GUI

teadrinker пишет:

у меня тоже получилось повторить ситуацию

А ты уверен что тогда сразу не начал пробовать вариант из справки с WindowProc?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

38

Re: AHK: Изменение свойств отображения элементов GUI

Нет, вариант из справки как раз работает нормально.

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

39

Re: AHK: Изменение свойств отображения элементов GUI

А есть возможность изменять только фон не трогая цвет? Я убрал нужный аргумент из функции, цвет не меняется, но его всё равно стандартными методами

Gui, Font, cRed
GuiControl,Font, //переменная контрола//

теперь не сменишь.

40

Re: AHK: Изменение свойств отображения элементов GUI

Нет, теперь только функцией.

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

41

Re: AHK: Изменение свойств отображения элементов GUI

Саму функцию можно изменить так, чтобы она меняла только фон и не трогала цвет, оставляя его доступным к изменению стандартными методами?

42

Re: AHK: Изменение свойств отображения элементов GUI

Нет, нельзя, по-моему.

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

43

Re: AHK: Изменение свойств отображения элементов GUI

Жаль. В таком виде невозможно сменить параметры уже показанных контролов без мигания всех остальных.

Gui, 1: Font, s10 cBlack
Gui, 1: Add, Text, hwndhText1 w80 h40 vT1 center, Первый текст	
Gui, 1: Show, x1 y1 w100 h60, 1
Sleep, 1000
SetColorToStatic(hText1, 0xCCCCCC, 0x666666)

Gui, 2: Font, s6 cBlack
loop, 50
	{
	w := A_index
	x := 35 * A_index
	loop, 30
		{
		h := A_index
		y := 20 * A_index
		Gui, 2: Add, Text,hwndhText%w%_%h% x%x% y%y% w25 h10 border, %w%_%h%
		}
	}
loop, 50
	{
	w := A_index
	loop, 30
		{
		h := A_index
		Random, Rand, 0, 0xFFFFFF
		r1 := Rand^0xFFFFFF
		Random, Rand, 0, 0xFFFFFF
		r2 := Rand^0xFFFFFF		
		SetColorToStatic(hText%w%_%h%, r1,r2)
		}
	}
Gui, 2: Show, x100 y100, 2
Return

F11::
Random, Rand, 0, 0xFFFFFF
r1 := Rand^0xFFFFFF
Random, Rand, 0, 0xFFFFFF
r2 := Rand^0xFFFFFF		
SetColorToStatic(hText1_1, r1,r2)
Return

Попробуйте нажать F11. Сменятся цвета толкьо первого контрола, но мигнёт всё большое окно.

44

Re: AHK: Изменение свойств отображения элементов GUI

Так не будет:

SetColorToStatic(hStatic, b_color, f_color)
{
	static arr := [], GWL_WNDPROC := -4
	hGui := DllCall("GetParent", Ptr, hStatic, Ptr)
	if !arr.HasKey(hGui)  {
		arr[hGui] := {}, arr[hGui].Statics := []
		arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), Ptr, hGui, Int, GWL_WNDPROC
												, Ptr, RegisterCallback("WindowProc", "", 4, Object(arr[hGui])), Ptr)
	}
	else if arr[hGui].Statics.HasKey(hStatic)
		DllCall("DeleteObject", Ptr, arr[hGui].Statics[hStatic].hBrush)
	arr[hGui].Statics[hStatic] := { b_color: Rgb2Bgr(b_color), f_color: Rgb2Bgr(f_color)
											, hBrush: DllCall("CreateSolidBrush", UInt, Rgb2Bgr(b_color), Ptr) }
	WinSet, Redraw,, ahk_id %hStatic%
}

WindowProc(hwnd, uMsg, wParam, lParam)
{
	Critical
	static WM_CTLCOLORSTATIC := 0x138
	obj := Object(A_EventInfo)
	if (uMsg = WM_CTLCOLORSTATIC && k := obj.Statics[lParam])  {
		DllCall("SetBkColor", Ptr, wParam, UInt, k.b_color)
		DllCall("SetTextColor", Ptr, wParam, UInt, k.f_color)
		Return k.hBrush
	}
	Return DllCall("CallWindowProc", Ptr, obj.ProcOld, Ptr, hwnd, UInt, uMsg, Ptr, wParam, Ptr, lParam)
}
	
Rgb2Bgr(color)
{
	Return (color & 0xff) << 16 | ((color >> 8) & 0xff) << 8 | color >> 16
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

45

Re: AHK: Изменение свойств отображения элементов GUI

Недавно увидел пример с SetClassLong для изменения курсора над одним классом контролов в окне. Есть также параметр GCL_HBRBACKGROUND, было бы интересно в первую очередь узнать можно ли заменить фон всех кнопок. И возможно ли указать для каждого контрола свои опции курсор, фон и.т.д. Функция как я понял работает со структурой WNDCLASSEX, может возможно как то хитрым путём, может связанным с RegisterClass, сначала изменить имена классов указанных контролов на какие то свои, и потом для них назначить опции как для разных по классу контролов.

Gui, Add, Edit, w300 h100 ReadOnly hwndhEdit
Gui, Add, Edit, wp hp
Gui, Add, Button, wp hp hwndhButton, Button
Gui, Add, Button, wp hp, Button
Gui, Show 
hCursor := DllCall("LoadCursor", uint, 0, int, 32648) 
DllCall("User32.dll\SetClassLong" (A_PtrSize = 8 ? "Ptr": "" ), "Ptr", hEdit, "Int", -12, "Ptr", hCursor)
DllCall("User32.dll\DestroyCursor", "Ptr", hCursor)
hCursor := DllCall("LoadCursor", uint, 0, int, 32649) 
DllCall("User32.dll\SetClassLong" (A_PtrSize = 8 ? "Ptr": "" ), "Ptr", hButton, "Int", -12, "Ptr", hCursor)
DllCall("User32.dll\DestroyCursor", "Ptr", hCursor)
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

46

Re: AHK: Изменение свойств отображения элементов GUI

Отличное решение проблемы, спасибо.

47 (изменено: serzh82saratov, 2016-05-18 16:16:39)

Re: AHK: Изменение свойств отображения элементов GUI

Foma а у вас такой код всегда работает? С teadrinker обсуждали, он говорит что иногда не срабатывает, у меня такого ни разу не наблюдалось.

+ открыть спойлер

#SingleInstance Force     
Global Ctrl := []
OnMessage(WM_CTLCOLOREDIT := 0x133, "WM_CTLCOLOR")
OnMessage(WM_CTLCOLORSTATIC := 0x138, "WM_CTLCOLOR")
Gui, Add, Edit, w200 r12 hwndhCtrl1, ReadWrite
Gui, Add, Edit, wp hwndhCtrl2 ReadOnly, ReadOnly
Gui, Add, Text, wp hwndhCtrl3 Center, Первый текст
Gui, Add, Text, wp hwndhCtrl4 Center, Второй текст
GuiControl, Focus, %hCtrl1%
Gui, Show

RandColor:
	Loop 4  {
		Random, Rand, 0, 0xFFFFFF   
		SetControlColor(hCtrl%A_Index%, Rand, Rand^0xFFFFFF)
	}
	Return
	
F11::GoSub, RandColor
	
SetControlColor(hwnd, BG, FG)   { 
	Ctrl[hwnd] := {BG:BG,FG:FG}
	WM_CTLCOLOR(DllCall("GetDC", "Ptr", hwnd), hwnd)
	DllCall("RedrawWindow", "Ptr", hwnd, "Uint", 0, "Uint", 0, "Uint", 0x1|0x4)
}

WM_CTLCOLOR(wParam, lParam)   {  
	If !Ctrl.HasKey(lParam) 
		Return 0 
	hBrush := DllCall("CreateSolidBrush", UInt, Ctrl[lParam].BG)
	DllCall("SetTextColor", Ptr, wParam, UInt, Ctrl[lParam].FG)
	DllCall("SetBkColor", Ptr, wParam, UInt, Ctrl[lParam].BG)
	DllCall("SetBkMode", Ptr, wParam, UInt, 2)
	Return hBrush 
}  
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

48

Re: AHK: Изменение свойств отображения элементов GUI

Все 8 цветов меняются при нажатии F11.
При наведении и кликах на Edit тоже разово изменение происходит.

49

Re: AHK: Изменение свойств отображения элементов GUI

В этом варианте бывают случаи, когда не все элементы прокрашиваются сразу. А по горячей клавише и предыдущие примеры работали аналогично.

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

50

Re: AHK: Изменение свойств отображения элементов GUI

Foma пишет:

При наведении и кликах на Edit тоже разово изменение происходит.

То есть происходят мелькания? Хуже работает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

51

Re: AHK: Изменение свойств отображения элементов GUI

serzh82saratov пишет:

И возможно ли указать для каждого контрола свои опции курсор, фон и.т.д. ... может возможно как то хитрым путём, может связанным с RegisterClass, сначала изменить имена классов указанных контролов на какие то свои, и потом для них назначить опции как для разных по классу контролов.

А зачем такие сложности? Это всё можно сделать способом выше (сабклассингом).

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

52 (изменено: serzh82saratov, 2016-05-18 19:04:17)

Re: AHK: Изменение свойств отображения элементов GUI

Ты имеешь ввиду сообщения?
Например в 45 посте курсор устанавливается "жестко", в отличие от "распространённого метода" отлова WM_SETCURSOR и применения SetCursor, бывает что мелькает курсор по умолчанию.
Также мелькает дефолтный фон и с WM_CTLCOLORSTATIC.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

53

Re: AHK: Изменение свойств отображения элементов GUI

serzh82saratov пишет:

Ты имеешь ввиду сообщения?

Я имею в виду сабклассинг, как в моём последнем примере. Там разве что-то мелькает?

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

54

Re: AHK: Изменение свойств отображения элементов GUI

В последнем не мелькает.
А вообще реально по твоему с помощью SetClassLong задать разные свойства одному классу контролов?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

55

Re: AHK: Изменение свойств отображения элементов GUI

В смысле, каждому классу свои свойства, но одинаковые для всего класса?

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

56

Re: AHK: Изменение свойств отображения элементов GUI

Нет... Например в 45 посте для 4 контролов установить 4 разных курсора.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

57

Re: AHK: Изменение свойств отображения элементов GUI

Ну наверно. Нужно пробовать работать с сообщением WM_SETCURSOR так же, как там с WM_CTLCOLORSTATIC.

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

58

Re: AHK: Изменение свойств отображения элементов GUI

Это понятно, а без сообщения WM_SETCURSOR, указав в структуре WNDCLASSEX для этих контролов курсоры по умолчанию.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

59

Re: AHK: Изменение свойств отображения элементов GUI

Не знаю, надо попробовать. Думаю, вряд ли так получится.

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

60

Re: AHK: Изменение свойств отображения элементов GUI

serzh82saratov пишет:

То есть происходят мелькания? Хуже работает?

  Нет, мельканий нет. Я про самоокрашивание. Если курсор над вторым Edit, его фон меняется на зелёный, а если кликнуть в нём, фон верхнего становится чёрным.