Что нового

[Элементы GUI] Сменить цвет текста в Checkbox

gora

Знающий
Сообщения
315
Репутация
19
Имеется Checkbox с текстом. Текст содержит акселератор (например, "Соранять историю"), который также должен переключать состояние Checkbox.
Требуется менять цвет текста (можно с самим Checkbox, можно без него, только текст) в соответствии с состоянием Checkbox (отмечен\не отмечен). Цвет при отмеченном Checkbox - стандартный для текста, цвет при не отмеченном Checkbox - серый, как у отключенного ($GUI_DISABLE)элемента. При этом как Checkbox, так и ускоритель должны работать в обоих случаях.
Как это реализовать?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
#Include <GUIConstantsEx.au3>

$hForm = GUICreate("Form1", 200, 200)
$iCheck = GUICtrlCreateCheckbox('', 20, 20, 14, 14)
$iText = GUICtrlCreateLabel('Сохранять историю', 40, 20, 120, 20)
GUISetState(@SW_SHOW)

Dim $aAccelKeys[1][2] = [["![", $iText]]
GUISetAccelerators($aAccelKeys)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
		Case $iText
            Switch GUICtrlRead($iCheck)
				Case $GUI_CHECKED
					GUICtrlSetState($iCheck, $GUI_UNCHECKED)
					GUICtrlSetColor($iText, 0x000000)
				Case $GUI_UNCHECKED
					GUICtrlSetState($iCheck, $GUI_CHECKED)
					GUICtrlSetColor($iText, 0xFF0000)
			EndSwitch
		Case $iCheck
			Switch GUICtrlRead($iCheck)
				Case $GUI_CHECKED
					GUICtrlSetColor($iText, 0xFF0000)
				Case $GUI_UNCHECKED
					GUICtrlSetColor($iText, 0x000000)
			EndSwitch
    EndSwitch
WEnd

или

Код:
#Include <GUIConstantsEx.au3>
#Include <ButtonConstants.au3>

$hForm = GUICreate("Form1", 200, 200)
$iCheck = GUICtrlCreateCheckbox('', 20, 20, 14, 14)
$iText = GUICtrlCreateLabel('Со&хранять историю', 40, 20, 120, 20)
GUISetState(@SW_SHOW)

Dim $aAccelKeys[1][2] = [["![", $iText]]
GUISetAccelerators($aAccelKeys)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
		Case $iText
            Switch GUICtrlRead($iCheck)
				Case $GUI_CHECKED
					GUICtrlSendMsg($iCheck, $BM_CLICK, 0, $GUI_UNCHECKED)
				Case $GUI_UNCHECKED
					GUICtrlSendMsg($iCheck, $BM_CLICK, 0, $GUI_CHECKED)
			EndSwitch
		Case $iCheck
			Switch GUICtrlRead($iCheck)
				Case $GUI_CHECKED
					GUICtrlSetColor($iText, 0xFF0000)
				Case $GUI_UNCHECKED
					GUICtrlSetColor($iText, 0x000000)
			EndSwitch
    EndSwitch
WEnd
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Viktor1703
Спасибо, но не то. Акселератор так не будет работать.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Для CheckBox она (GUICtrlSetColor()) не работает, либо пишите WinAPI обработчики и перерисовывайте CheckBox сами, либо откажитесь от этой идеи :whistle:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
gora [?]
Акселератор так не будет работать
А у меня работает.
Добавьте в скрипт Viktor1703 перед циклом
Код:
Dim $aAccelKeys[1][2] = [["![", $iText]]
GUISetAccelerators($aAccelKeys)
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
InnI, добавил, у меня тоже всё работает в обоих примерах.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Viktor1703 [?]
добавил, у меня тоже всё работает в обоих примерах
Странно... Как оно может работать в первом примере, если там даже акселератора нет!?
InnI
Попробовал добавить:
Акселератор работает.
При кликах на надписи с большой частотой переключение происходит через раз, а если кликать по чекбоксу, то все нормально.
У меня таких чекбоксов больше десятка будет, как должна выглядеть строка?
Код:
Dim $aAccelKeys[1][2] = [["![", $iText]]

Спасибо обоим! :smile:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
gora [?]
При кликах на надписи с большой частотой переключение происходит через раз, а если кликать по чекбоксу, то все нормально.
Это, вероятно, из-за того, что Checkbox обрабатывает каждый клик, а Label различает одинарные и двойные клики.

как должна выглядеть строка
В справке по функции
Код:
GUISetAccelerators()
довольно подробно всё описано.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
InnI [?]
довольно подробно всё описано.
Спасибо, разобрался.
К сожалению такой вариант меня не устроит. Создать массив либо не удастся, либо будет крайне сложно. Акселераторы находятся в тексте. Он считывается из ini файла. Таких языковых файлов уже сейчас 33. Ну проштудировать все строки в поисках ускорителей и привязать их к дескрипторам еще как-то можно, хотя дело тоже не очень простое, но надо еще и позаменять национальные символы на коды клавиш на которых они расположены! А знать особенности расположения всех этих умляутов и прочих национальных символов на клавиатуре у иностранцев задача близкая к тупиковой.
Видимо придется отказаться от этого варианта.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
; AdmiralAlkex
; http://www.autoitscript.com/forum/topic/119812-guictrlcreategroup-color-question/#entry832501
GUICreate("Отключаем тему для элемента", 644, 303, 207, 200)
$nCh1 = GUICtrlCreateCheckbox("Чекбокс 1", 10, 10, 120, 20)
$nCh2 = GUICtrlCreateCheckbox("Чекбокс 2", 10, 30, 120, 20)
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($nCh2), "wstr", 0, "wstr", 0)
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetFont(-1, 12, 400, 0, "Arial")
GUISetState()
Do
Until GUIGetMsg() = -3
 
  • Like
Реакции: Norm
Верх