Тема: AHK: Вопросы по созданию GUI интерфейса
Доброго времени суток, хотел бы поинтересоваться, возможно ли задать определённый цвет фона для КАЖДОГО контролла?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго времени суток, хотел бы поинтересоваться, возможно ли задать определённый цвет фона для КАЖДОГО контролла?
Можно, для всех по-разному.
teadrinker
Прекрасно, тогда если имеем:
Gui, Add, Text, x1 y1 w1 h1, 111
Gui, Add, Text, x1 y1 w1 h1, 111
Как сделать так, чтобы первый текст имел синий фон, а второй, допустим, красный?
Думаете, один пиксель, да ещё и наложенный на другой, будет виден?
Тогда так:
Gui, Add, Text, x1 y1 w1 h1 hwndhText1, 111
SetStaticColor(hText1, 0xFF)
Gui, Add, Text, x1 y1 w1 h1 hwndhText2, 111
SetStaticColor(hText2, 0xFF0000)
Gui, Show, w200 h100
SetStaticColor(hStatic, b_color := "", f_color := 0) {
static arr := [], GWL_WNDPROC := -4
b_color := b_color >> 16 | b_color & 0xFF00 | (b_color & 0xFF) << 16
f_color := f_color >> 16 | f_color & 0xFF00 | (f_color & 0xFF) << 16
hGui := DllCall("GetParent", "Ptr", hStatic, "Ptr")
if !arr.HasKey(hGui) {
arr[hGui] := {}, arr[hGui, "Statics"] := []
pObj := Object(arr[hGui])
arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), "Ptr", hGui, "Int", GWL_WNDPROC
, "Ptr", RegisterCallback("WindowProc", "", 4, pObj), "Ptr")
}
if arr[hGui].Statics.HasKey(hStatic) && b_color = "" {
DllCall("DeleteObject", "Ptr", arr[hGui, "Statics", hStatic, "hBrush"])
arr[hGui, "Statics"].Delete(hStatic)
}
else {
arr[hGui, "Statics", hStatic] := { b_color: b_color, f_color: f_color
, hBrush: DllCall("CreateSolidBrush", "UInt", b_color, "Ptr") }
}
WinSet, Redraw,, ahk_id %hStatic%
}
WindowProc(hwnd, uMsg, wParam, lParam) {
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)
}
teadrinker
Это не мой код, просто привёл в качестве примера. Суть в том, что разные контроллы одного GUI интерфейса должны быть разных цветов.
Как пример:
В GUI интерфейсе есть два текста: "Мама, я тебя люблю!" и "Папа, я тебя обожаю!". У "мамы" задний фон должен быть с цветом *тут какой-то нежный женский цвет*, а у "папы" задний фон должен быть суровым .
Немного подправил. Функция может как задавать кастомный цвет, так и возвращать к дефолтному:
Gui, Margin, 50, 50
Gui, Font, s60 q5
Gui, Add, Text, w200 h100 hwndhText center, color
SetStaticColor(hText, 0xFF, 0xFFFFFF)
Gui, Show
Sleep, 500
SetStaticColor(hText, 0xFF0000, 0xFF)
Sleep, 500
SetStaticColor(hText, 0xAAAA, 0xFF7700)
Sleep, 500
SetStaticColor(hText, 0xFFFF00, 0xAD66D5)
Sleep, 500
SetStaticColor(hText)
GuiClose() {
ExitApp
}
SetStaticColor(hStatic, b_color := "", f_color := 0) {
static arr := [], GWL_WNDPROC := -4
b_color := b_color >> 16 | b_color & 0xFF00 | (b_color & 0xFF) << 16
f_color := f_color >> 16 | f_color & 0xFF00 | (f_color & 0xFF) << 16
hGui := DllCall("GetParent", "Ptr", hStatic, "Ptr")
if !arr.HasKey(hGui) {
arr[hGui] := {}, arr[hGui, "Statics"] := []
pObj := Object(arr[hGui])
arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), "Ptr", hGui, "Int", GWL_WNDPROC
, "Ptr", RegisterCallback("WindowProc", "", 4, pObj), "Ptr")
}
if arr[hGui].Statics.HasKey(hStatic) && b_color = "" {
DllCall("DeleteObject", "Ptr", arr[hGui, "Statics", hStatic, "hBrush"])
arr[hGui, "Statics"].Delete(hStatic)
}
else {
arr[hGui, "Statics", hStatic] := { b_color: b_color, f_color: f_color
, hBrush: DllCall("CreateSolidBrush", "UInt", b_color, "Ptr") }
}
WinSet, Redraw,, ahk_id %hStatic%
}
WindowProc(hwnd, uMsg, wParam, lParam) {
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)
}
teadrinker
Это класс?
SetStaticColor(hStatic, b_color := "", f_color := 0) {
static arr := [], GWL_WNDPROC := -4
b_color := b_color >> 16 | b_color & 0xFF00 | (b_color & 0xFF) << 16
f_color := f_color >> 16 | f_color & 0xFF00 | (f_color & 0xFF) << 16
hGui := DllCall("GetParent", "Ptr", hStatic, "Ptr")
if !arr.HasKey(hGui) {
arr[hGui] := {}, arr[hGui, "Statics"] := []
pObj := Object(arr[hGui])
arr[hGui].ProcOld := DllCall("SetWindowLong" . (A_PtrSize = 8 ? "Ptr" : ""), "Ptr", hGui, "Int", GWL_WNDPROC
, "Ptr", RegisterCallback("WindowProc", "", 4, pObj), "Ptr")
}
if arr[hGui].Statics.HasKey(hStatic) && b_color = "" {
DllCall("DeleteObject", "Ptr", arr[hGui, "Statics", hStatic, "hBrush"])
arr[hGui, "Statics"].Delete(hStatic)
}
else {
arr[hGui, "Statics", hStatic] := { b_color: b_color, f_color: f_color
, hBrush: DllCall("CreateSolidBrush", "UInt", b_color, "Ptr") }
}
WinSet, Redraw,, ahk_id %hStatic%
}
WindowProc(hwnd, uMsg, wParam, lParam) {
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)
}
teadrinker
Я немного глупый (много), поэтому хочу уточнить. Можно ли обойтись без всех этих строк и обойтись одной командой или нужно использовать их все?
teadrinker
Я разобрался и понял, что это нужно вставить в сам скрипт, благодарю за помощь с первым вопросом...
Можно создать отдельный файл SetStaticColor.ahk, записать туда функцию и поместить в пользовательскую библиотеку, тогда можно будет вызывать эту функцию из других скриптов.
teadrinker
Я так и сделал .
Второй вопрос. Как можно изменить Background кнопок (Нужен другой цвет)?
Background кнопок — это тоненькая граница вокруг кнопки. Или что вы имеете в виду?
teadrinker
Нет, вся область нажатия кнопки (область, на которой находится надпись кнопки).
Для этого нет известного способа.
В стандартных кнопках это не сделать - их оформление вшито в операционную систему. Только если делать свои уникальные кнопки на базе ЭУ picture (картинки-кнопки).
teadrinker
Также столкнулся с ещё одной проблемой, а именно то, что контрол Edit не изменяет свой задний фон. Для этого нужна другая функция, или я что-то делаю не так?
Контрол Edit можно менять через
Gui, Color, Цвет окна, Цвет Edit
teadrinker
Благодарю, с покраской интерфейса всё.
Далее, у меня есть код:
Gui, New, +AlwaysOnTop -Caption +ToolWindow +LastFound +E%WS_EX_TRANSPARENT% +HwndCrosshair
WinSet, Transparent, 255
Gui, Add, Text, x%x1% y%y1% w%w1% h%h1%
Gui, Add, Text, x%x2% y%y1% w%w1% h%h1%
Gui, Add, Text, x%x3% y%y2% w%w2% h%h2%
Gui, Add, Text, x%x3% y%y3% w%w2% h%h2%
Gui, Color, 00FB1B
Gui, Show, x962 y534 w10 h10
Как сделать так, чтобы Gui показывал только свои контролы (в данном случае текста)?
Как понять «свои»?
teadrinker
Уже не берите в голову .
На самом деле нужно было установить цвет самого окна Gui на прозрачный, только и всего.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться