Тема: 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 цвет фона и текста будет изменяться рандомно.