1

Тема: AHK: Динамическое изменение цвета фона и текста в static

Код создан на основе примера сабклассинга окна. Задача изменения цвета фона и текста в контроле static (в AHK — Text) оформлена в виде функции и может выполняться динамически, в любой момент.

Gui, Add, Text, hwndhText1 w150 center, Первый текст
Gui, Add, Text, hwndhText2 wp center, Второй текст
SetStaticColor(hText1     ; хэндл контрола static (text), цвет которого нужно изменить
					, 0xFF0000   ; цвет фона, RGB, красный
					, 0x0000FF)  ; цвет текста, RGB, синий
SetStaticColor(hText2, 0x0000FF, 0xFFFFFF)
Gui, Show
Return

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

SetStaticColor(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
}

При нажатии горячей клавиши F11 цвет фона и текста будет изменяться рандомно.

Связанная тема

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