Добавлено: Сб ноя 16, 2024 00:18
Возможно, тема фона панелей не такая важная и актуальная для многих, но я подумал, что она может быть использована в качестве хорошего примера применения функций Autorun - старых и новых. Поэтому я добавил к скрипту довольно много комментариев, чтобы они лучше демонстрировали и поясняли функционал (для тех, кто не так сильно в теме, но хочет ее лучше изучить). Надеюсь, кому-нибудь пригодится.
[cut="Backdrop.aucfg"][/cut]
[cut][/cut]
[cut][/cut]
Файл конфигурации и две кнопки. Первая кнопка запускает поток, который ищет окно ColorMania и считывает с него значение в формате цвета ТС (Powerbuilder), которое тут же применяет к фону ТС. Если окно ColorMania не найдено, то значение фона считывается из буфера, если оно там есть.
Поддерживаются только числовые значения цвета (ТС может хранить и HEX-формате).
Вторая кнопка посылает окну ТС цветовые значения. Можно сделать несколько таких кнопок при желании. Удобно, если нужно вернуться к своему родному заранее известному цвету.
[cut="Backdrop.aucfg"]
Код: Выделить всё
# Ctrl+Shift+"+" - Повышение тонов
# Ctrl+Shift+"-" - Понижение тонов
# Ctrl+"+" - Автоповышение тонов
# Ctrl+"-" - Автопонижение тонов
# ESC - Выход из автоперебора
# Alt+"+" - Показ текущих значений
Pragma IncludeOnce
Global Pulsar = 0, BACKDROP_THREAD = 0, BackColor1 = 0, BackColor2 = 0, Previous1 = 0, Previous2 = 0
# повышение/понижение тонов
SetHotkeyAction /K:C /K:S /V:187 /R /DM SetBackGround 1
SetHotkeyAction /K:C /K:S /V:189 /R /DM SetBackGround 2
# авто
SetHotkeyAction /K:C /V:187 SetPulsar 1
SetHotkeyAction /K:C /V:189 SetPulsar 2
# показать текущие значения
SetHotkeyAction /K:A /V:187 ShowBackColor 1000
# регистрация команды для вызова из кнопки (пункта меню)
RegisterCommand 70001 "AutoBackdrop"
# прием сообщения окну установить значения фона
SetMessageAction /P "BackColorsMessage" SetBackColors
# значения фона при старте ТС
if BackColor1 = 0 or BackColor2 = 0 then
IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
endif
Func AutoBackdrop(lParam)
# удержание Ctrl+Shift
# повышение тона на одну единицу после нажатия
# на кнопку, выбора пункта меню или вызова другим способом
If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)
# удержание Ctrl
# понижние тона на одну единицу
If IsPressed (0x11) Then Return SetBackGround(2)
# удержание Alt+Win
# вернуть предыдущий фон
If IsPressed (0x12) And IsPressed (0x5B) Then
if Previous1 > 0 or Previous2 > 0 then WriteBackground(Previous1, Previous2)
Return
endif
# удержание Alt
# вернуть первоначальный фон TC
If IsPressed (0x12) Then Return WriteBackground(BackColor1, BackColor2)
# удержание Shift
# показ текущих значений фона
If IsPressed (0x10) Then Return ShowBackColor()
# поток уже запущен
if BACKDROP_THREAD > 0 then
BACKDROP_THREAD = 0
else
BACKDROP_THREAD = 1
RunThread ThreadBackdrop
# SetHintParam("ShowHint", "Font", 11, "Consolas")
SetHintParam("ShowHint", "Font", 10, "Tahoma")
SetHintParam("ShowHint", "BackColor", 0x000000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
#SetHintParam("ShowHint", "Border", 0xFFFFFF)
ShowHint("Отслеживание значений запущено." & auLF & "Значения в ColorMania / буфере будут применятся к фону панелей.")
Sleep(2000)
WinSetState(23)
SetHintParam("ShowHint", "Reload")
endif
EndFunc
Func SetBackColors(hWnd, uMsg, wParam, lParam)
WriteBackground(wParam, lParam)
EndFunc
# запись значений, обновление панелей
Func WriteBackground(Color1, Color2)
IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
SendCommand 2957
SendCommand 2957
EndFunc
Func ThreadBackdrop()
Local h = 0, max = 1*255 + 256*255 + 65536*255, clip, last = 0, w = 0, source
# предыдущие значения фона
IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
While BACKDROP_THREAD = 1
h = WinFind(0, "TfrmColorPick")
if h > 0 then
# текст из ColorMania
clip = WinGetText(WinFind(h, "TEdit", 1))
source = "ColorMania"
else
# первая строка в буфере
clip = StrPart(ClipGet(), auLF, 1)
source = "Clipboard"
endif
if IsInt(clip) then
# новое число в диапазоне
if clip >= 0 and clip <= max and not (clip = last) then
WinSetText("Applying background value: " & clip)
WriteBackground(clip, clip)
w = w + 1
last = clip
Sleep(400)
endif
endif
Sleep(250)
WinSetText("Backdrop thread is watching for " & source & " values ...")
Wend
BACKDROP_THREAD = 0
WinSetText("")
SetHintParam("ShowHint", "Font", 10, "Tahoma")
SetHintParam("ShowHint", "BackColor", 0x000000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Отслеживание остановлено" & auLF & "Применений фона: " & w)
Sleep(2000)
WinSetState(23)
SetHintParam("ShowHint", "Reload")
EndFunc
Func SetBackGround(nParam)
Local bkg1, bkg2, max = 1*255 + 256*255 + 65536*255
# при автоизменении потолок чуть меньше
# попытка предотвратить переход в серые тона
if Pulsar = 1 then max = 1*245 + 256*245 + 65536*245
IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
If Not IsInt(bkg1) Or Not IsInt(bkg2) Then
MsgBox("Нечисловые значения цвета фона: " _
& auLF & auLF & "BackColor=" & bkg1 & auLF & "BackColor2=" & bkg2 _
& auLF & auLF & "ESC - Отмена операции")
Return
Endif
if bkg1 = -1 then bkg1 = max
if bkg2 = -1 then bkg2 = max
if nParam = 1 then
bkg1 = bkg1 + 1 + 256 + 65536
bkg2 = bkg2 + 1 + 256 + 65536
else
bkg1 = bkg1 - 1 - 256 - 65536
bkg2 = bkg2 - 1 - 256 - 65536
endif
if bkg1 > max then bkg1 = bkg1 - 1 - 256 - 65536
if bkg2 > max then bkg2 = bkg2 - 1 - 256 - 65536
if bkg1 < -1 then bkg1 = max
if bkg2 < -1 then bkg2 = max
WriteBackground(bkg1, bkg2)
EndFunc
Func SetPulsar(nParam)
local a, b, s, l
static t = 0
if Pulsar = 1 then
Pulsar = 0
Return
endif
Pulsar = 1
if nParam = 1 then
a = 1
b = 2
s = 1
else
a = 2
b = 1
s = -1
endif
IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
While Pulsar = 1
For j = a To b step s
For i = 1 To 75
SetBackGround(j)
Sleep(25)
l = l + 1
t = t + 1
if Pulsar = 0 then Break
If IsPressed (0x1B) Then
Pulsar = 0
Break
Endif
Next
if Pulsar = 0 then Break
Next
Wend
# показать статистику, если выход по ESC
If IsPressed (0x1B) Then
ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
Endif
EndFunc
Func ShowBackColor(lDelay = 300)
Local txt, bkg1, bkg2, max = 1*255 + 256*255 + 65536*255
IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
if bkg1 = -1 then bkg1 = max
if bkg2 = -1 then bkg2 = max
# обратный расчет
blue = floor(bkg1/65536)
green = bkg1 - (blue * 65536)
green = floor(green/256)
red = bkg1 - (blue * 65536) - (green * 256)
txt = "Фон 1" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg1
txt = txt & auLF & "" & auLF
blue = floor(bkg2/65536)
green = bkg2 - (blue * 65536)
green = floor(green/256)
red = bkg2 - (blue * 65536) - (green * 256)
txt = txt & "Фон 2" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg2
ShowHint(txt)
EndFunc[cut]
Код: Выделить всё
TOTALCMD#BAR#DATA
70001
%COMMANDER_EXE%
Запустить/Оствновить|Отслеживание цвета фона| |Ctrl - Понижение тонов|Ctrl+Shift - Повышение тонов|Alt - Вернуть первоначальный|Alt+Win - Вернуть предыдущий| |Shift - Показать значения
70001
[cut]
Код: Выделить всё
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
/u- /ef "msg(regmsg(BackColorsMessage), 9211020, 9211020)"
%COMMANDER_EXE%
Установить фон через параметры сообщения
-1
Файл конфигурации и две кнопки. Первая кнопка запускает поток, который ищет окно ColorMania и считывает с него значение в формате цвета ТС (Powerbuilder), которое тут же применяет к фону ТС. Если окно ColorMania не найдено, то значение фона считывается из буфера, если оно там есть.
Поддерживаются только числовые значения цвета (ТС может хранить и HEX-формате).
Вторая кнопка посылает окну ТС цветовые значения. Можно сделать несколько таких кнопок при желании. Удобно, если нужно вернуться к своему родному заранее известному цвету.