1 (изменено: SuBrex, 2020-06-25 22:13:27)

Тема: AHK: Вопросы по созданию GUI интерфейса

Доброго времени суток, хотел бы поинтересоваться, возможно ли  задать определённый цвет фона для КАЖДОГО контролла?

2

Re: AHK: Вопросы по созданию GUI интерфейса

Можно, для всех по-разному.

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

3

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Прекрасно, тогда если имеем:


Gui, Add, Text, x1 y1 w1 h1, 111
Gui, Add, Text, x1 y1 w1 h1, 111

Как сделать так, чтобы первый текст имел синий фон, а второй, допустим, красный?

4 (изменено: teadrinker, 2020-06-26 01:27:03)

Re: AHK: Вопросы по созданию GUI интерфейса

Думаете, один пиксель, да ещё и наложенный на другой, будет виден?
Тогда так:

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)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5 (изменено: SuBrex, 2020-07-03 19:50:04)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Это не мой код, просто привёл в качестве примера. Суть в том, что разные контроллы одного GUI интерфейса должны быть разных цветов.
Как пример:
В GUI интерфейсе есть два текста: "Мама, я тебя люблю!" и "Папа, я тебя обожаю!". У "мамы" задний фон должен быть с цветом *тут какой-то нежный женский цвет*, а у "папы" задний фон должен быть суровым .

6

Re: AHK: Вопросы по созданию 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)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: Вопросы по созданию GUI интерфейса

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)
}

8

Re: AHK: Вопросы по созданию GUI интерфейса

Нет.

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

9 (изменено: SuBrex, 2020-06-26 16:15:37)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Я немного глупый (много), поэтому хочу уточнить. Можно ли обойтись без всех этих строк и обойтись одной командой или нужно использовать их все?

10

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Я разобрался и понял, что это нужно вставить в сам скрипт, благодарю за помощь с первым вопросом...

11

Re: AHK: Вопросы по созданию GUI интерфейса

Можно создать отдельный файл SetStaticColor.ahk, записать туда функцию и поместить в пользовательскую библиотеку, тогда можно будет вызывать эту функцию из других скриптов.

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

12 (изменено: SuBrex, 2020-07-05 13:30:17)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Я так и сделал .

13

Re: AHK: Вопросы по созданию GUI интерфейса

Второй вопрос. Как можно изменить Background кнопок (Нужен другой цвет)?

14

Re: AHK: Вопросы по созданию GUI интерфейса

Background кнопок — это тоненькая граница вокруг кнопки. Или что вы имеете в виду?

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

15 (изменено: SuBrex, 2020-07-05 13:30:42)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Нет, вся область нажатия кнопки (область, на которой находится надпись кнопки).

16

Re: AHK: Вопросы по созданию GUI интерфейса

Для этого нет известного способа.

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

17

Re: AHK: Вопросы по созданию GUI интерфейса

В стандартных кнопках это не сделать - их оформление вшито в операционную систему. Только если делать свои уникальные кнопки на базе ЭУ picture (картинки-кнопки).

18 (изменено: SuBrex, 2020-06-26 22:17:55)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Также столкнулся с ещё одной проблемой, а именно то, что контрол Edit не изменяет свой задний фон. Для этого нужна другая функция, или я что-то делаю не так?

19

Re: AHK: Вопросы по созданию GUI интерфейса

Контрол Edit можно менять через

Gui, Color, Цвет окна, Цвет Edit
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

20

Re: AHK: Вопросы по созданию GUI интерфейса

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 показывал только свои контролы (в данном случае текста)?

21

Re: AHK: Вопросы по созданию GUI интерфейса

Как понять «свои»?

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

22 (изменено: SuBrex, 2020-07-03 19:50:16)

Re: AHK: Вопросы по созданию GUI интерфейса

teadrinker
Уже не берите в голову .
На самом деле нужно было установить цвет самого окна Gui на прозрачный, только и всего.