Что нового

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
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 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).
  • Данная библиотека содержит только одну функцию, предназначенную для использования в ваших скриптах. Не используйте другие функции, они предназначены только для внутреннего использования.
 

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 703
Re: \"Color Chooser\" - Диалог для выбора цвета

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

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



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

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

Yashied

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

Yashied

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

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

    $CC_FLAG_SOLIDCOLOR
    $CC_FLAG_CAPTURECOLOR
    $CC_FLAG_USERCOLOR
    $CC_FLAG_DEFAULT

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

AZJIO

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

Yashied

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

AZJIO

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


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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
AZJIO сказал(а):
Это относится к ColorPicker.au3, надо кнопки как справа на скрине...
А зачем? Если хочешь, замени везде $SS_SUNKEN на (-1).

AZJIO сказал(а):
И функцию конвертации RGB<>BGR можно бы добавить.
Код:
BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
 

SECTOR

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

Yashied

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

CreatoR

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

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


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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
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 703
Обновил библиотеку. Теперь Au3Check не выдает ошибок.

:smile:
 

WSWR

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