Что нового

"Color Chooser" - Диалог для выбора цвета

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoIt: 3.3.6.1
Версия: 1.1

Категория: Окна и диалоги

Описание: Выводит диалог для выбора цвета в трех цветовых моделях - RGB (Red, Green, Blue), HSL (Hue, Saturation, Lightness) и HSB (Hue, Saturation, Brightness). Это не программа, это функция, которую Вы можете использовать в ваших скриптах. Данная функция аналогична функции _ChooseColor() из библиотеки Misc.au3, которая входит в состав дистрибутива AutoIt. Также присутствует инструмент (пипетка) для получения цвета с экрана монитора.

Синтаксис и параметры:
Синтаксис вызова:

Код:
_ColorChooserDialog ( [$iColor [, $hParent [, $iRefType [, $iReturnType [, $iFlags [, $sTitle]]]]]] )


Параметры:

$iColor (Опционально)

Цвет, который нужно установить при открытии диалога "Color Chooser". Тип этого параметра зависит от значения $iRefType (см. ниже) и должен быть одним из представленных в этой таблице. По умолчанию, значение цвета равно 0 (0x000000).

RGBЦвет задается целочисленным числом в виде 0xRRGGBB, где RR, GG, BB - компоненты RGB цвета (0-255).
HSLЦвет задается массивом из трех элементов, соответствующих компонентам цвета.

[0] - Hue (0-240)
[1] - Saturation (0-240)
[3] - Lightness (0-240)

HSBЦвет задается массивом из трех элементов, соответствующих компонентам цвета.

[0] - Hue (0-360)°
[1] - Saturation (0-100)%
[3] - Brightness (0-100)%


$hParent (Опционально)

Указатель (хэндл) на родительское окно для диалога "Color Chooser". По умолчанию, значение этого параметра равно 0.

$iRefType (Опционально)

Определяет цветовую модель, в которой задан начальный цвет $iColor. Значение этого параметра может быть одним из следующих:

0 - RGB (По умолчанию)
1 - HSL
2 - HSB

$iReturnType (Опционально)

Определяет цветовую модель, в которой функция должна возвратить выбранный цвет. Значение этого параметра может быть одним из следующих:

0 - RGB (По умолчанию)
1 - HSL
2 - HSB

$iFlags (Опционально)

Определяет внешний вид и функциональность диалога "Color Chooser". Этот параметр может быть одним из следующих значений или их комбинаций:

$CC_FLAG_SOLIDCOLOR
$CC_FLAG_CAPTURECOLOR
$CC_FLAG_USERCOLOR
$CC_FLAG_DEFAULT

Если установлен флаг $CC_FLAG_USERCOLOR, Вы можете сохранять до 20 значений цветов (в RGB). Эти значения сохраняются в следующей ветке реестра и доступны всем программам, использующим данную функцию:

HKEY_CURRENT_USER\SOFTWARE\Y's\Common Data\Color Chooser\x.x\Palette

Здесь x.x - версия UDF.

$sTitle (Опционально)

Название для диалога "Color Chooser", которое будет отображаться в заголовке окна. По умолчанию - "Color".


Возвращаемое значение:

Функция возвращает значение выбранного цвета в цветовой модели, заданной параметром $iReturnType. В случае, если цвет не был выбран - (-1).

Пример 1:
Код:
#Include <ColorChooser.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $Msg, $Label, $Button, $Data, $Color = 0x50CA1B

$hForm = GUICreate('MyGUI', 170, 200)
$Label = GUICtrlCreateLabel('', 15, 15, 140, 140, $SS_SUNKEN)
GUICtrlSetBkColor(-1, $Color)
$Button = GUICtrlCreateButton('Select color...', 35, 166, 100, 23)
GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button
            $Data = _ColorChooserDialog($Color, $hForm)
            If $Data > -1 Then
                GUICtrlSetBkColor($Label, $Data)
                $Color = $Data
            EndIf
    EndSwitch
WEnd

Пример 2: (необходима библиотека ColorPicker.au3)
Код:
#Include <ColorChooser.au3>
#Include <ColorPicker.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $Msg, $Label, $Picker

$hForm = GUICreate('MyGUI', 170, 200)
$Label = GUICtrlCreateLabel('', 15, 15, 140, 140, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0x50CA1B)
$Picker = _GUIColorPicker_Create('', 55, 166, 60, 23, 0x50CA1B, BitOR($CP_FLAG_CHOOSERBUTTON, $CP_FLAG_MAGNIFICATION, $CP_FLAG_ARROWSTYLE), 0, -1, -1, 0, 'Simple Text', 'Custom...', '_ColorChooserDialog')
GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Picker
            GUICtrlSetBkColor($Label, _GUIColorPicker_GetColor($Picker))
    EndSwitch
WEnd

Скриншот:
ColorChooser.png

Источник: ColorChooser UDF (оффициальный форум)
Автор: Yashied


Примечания:

  • ВАЖНО. Данная библиотека использует следующие оконные сообщения (WM_...):

    WM_COMMAND
    WM_NCRBUTTONDOWN
    WM_SETCURSOR
    WM_SYSCOMMAND

    Поэтому, если ваш код предусматривает использование этих сообщений, то в соответствующих функциях обработки необходимо вызвать обработчики из этой библиотеки, в противном случае, функция будет работать неправильно, например:

    Func MY_WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam)
    Local $Result = CC_WM_SETCURSOR($hWnd, $iMsg, $wParam, $lParam)
    If Not $Result Then
    Return 0
    EndIf
    ...
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_SETCURSOR

  • Функция _ColorChooserDialog() полностью совместима с библиотекой ColorPicker.au3 (v1.5) и может быть использована в качестве функции для диалога выбора цвета.
  • Т.к. обе библиотеки используют одинаковые оконные сообщения, то, в случае необходимости, нужно ссылаться (вызывать) только один обработчик для одного сообщения из любой библиотеки (см. п. 1).
  • Данная библиотека содержит только одну функцию, предназначенную для использования в ваших скриптах. Не используйте другие функции, они предназначены только для внутреннего использования.
 
  • Like
Реакции: Norm

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: ColorChooser - Диалог для выбора цвета

Выдает для Пример 1 - 3 error(s), 2 warning(s)

Код:
ColorChooser.au3(1075,54) : WARNING: $__CP_WM0111: possibly used before declaration.
ColorChooser.au3(1218,54) : WARNING: $__CP_WM0020: possibly used before declaration.
ColorChooser.au3(1075,54) : ERROR: $__CP_WM0111: undeclared global variable.
ColorChooser.au3(1077,47) : ERROR: CP_WM_COMMAND(): undefined function.
ColorChooser.au3(1220,49) : ERROR: CP_WM_SETCURSOR(): undefined function.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: \"Color Chooser\" - Диалог для выбора цвета

Не обращай на это внимание, ошибок во время выполнения не будет, это только проверка. Из-за "дубового" принципа работы с сообщениями в AutoIt, я вынужден был придумывать алгоритм для совместного использования сообщений двумя независимыми UDF. Алгоритм получился очень изящный и простой, но AU3Check'у этого не объяснишь. В принципе, на следующий код AU3Check тоже будет ругаться, но он абсолютно правильный.

Код:
If (IsDeclared('A')) And ($A = 1) Then
	MyFunc()
EndIf



Добавлено:
Сообщение автоматически объединено:

Вообще, это очень большой недостаток для AutoIt, что нет никакой возможности построить цепочку обработчиков WM_.. сообщений. Если мы регистрируем сообщение посредством GUIRegisterMsg(), то автоматически теряем информацию о предыдущем обработчике...
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку, много внутроенних исправлений.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку до версии 1.1.

Список изменений:
  • Добавлены следующие флаги для более гибкого изменения внешнего вида и функциональности диалога.

    $CC_FLAG_SOLIDCOLOR
    $CC_FLAG_CAPTURECOLOR
    $CC_FLAG_USERCOLOR
    $CC_FLAG_DEFAULT

  • Добавлена возможность сохранять произвольные цвета (до 20) и использовать их в других программах, использующих эту библиотеку (см. $CC_FLAG_USERCOLOR).
  • Исправлено несколько незначительных ошибок.
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Yashied
Стиль кнопки без каймы возможно?
Почему добавлен Opt('MustDeclareVars', 1), это обязательно для использования этой UDF?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Yashied
Yashied сказал(а):
Это относится к ColorPicker.au3, надо кнопки как справа на скрине...


И функцию конвертации RGB<>BGR можно бы добавить.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
Это относится к ColorPicker.au3, надо кнопки как справа на скрине...

А зачем? Если хочешь, замени везде $SS_SUNKEN на (-1).

AZJIO сказал(а):
И функцию конвертации RGB<>BGR можно бы добавить.

Код:
BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Yashied
А можно как нибудь реализовать диалог, как на картинке?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,485
Yashied
А почему нельзя сделать так:

Код:
If (IsDeclared('__CP_WM0111')) And (Not Eval("__CP_WM0111")) Then


И ещё, ругается на отсутствие функций CP_WM_COMMAND и CP_WM_SETCURSOR, если этих функций нет, то какой в них смысл? Если я и упускаю какой то смысл (хотелось бы знать какой), тогда почему нельзя использовать Call?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
И ещё, ругается на отсутствие функций CP_WM_COMMAND и CP_WM_SETCURSOR, если этих функций нет, то какой в них смысл? Если я и упускаю какой то смысл (хотелось бы знать какой), тогда почему нельзя использовать Call?

Смысл в том, что эта библиотека может работать в составе библиотеки ColorPicker.au3 и наоборот. И так уж получилось, что обе эти библиотеки используют одни и теже WM_* сообщения. Для нормальной совместной работы этих библиотек я придумал механизм автоматического вызова функций обработки из обоих библиотек. CP_WM_COMMAND и CP_WM_SETCURSOR, это как раз обработчики из ColorPicker.au3, а IsDeclared('__CP_WM0111') проверяет подключена ли ColorPicker.au3 или нет. Если да, то вызывается соответствующая CP_WM_* функция. Я об этом писал подробно здесь.

С другой стороны, ты наверное прав, ради избавления ошибок при проверке скрипта, можно использовать Eval() и Call(). Хотя я их не люблю.

Позже обновлю обе библиотеки.

:smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку. Теперь Au3Check не выдает ошибок.

:smile:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Неплохо было бы увидеть вариант, в котором в диалоге сразу присутствует и матрица выбора стандартных цветов, т.е. чтобы было совсем похоже на _ChooseColor().
 
Верх