Must AutoIt
Сообщения: 3054
Благодарности: 1009
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Diamond,
Класная утилитка (это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами  )...
Немного(?) изменил - Теперь диалог для выбора цвета открывается как дочернее окно, также переделал немного методы обновления данных (чтобы всё обновлялось в реальном времени, правда "дёргание" элементов не удалось предотвратить), при выборе пипетки добавил функцию для установки курсора на момент выбора цвета (глобально, правда я пока не знаю как получить предварительно текущий курсор, поэтому будет сбиваться всегда на 3dwarro.cur - а курсор пипетки можно видимо подобрать и подходящий в системе, но я не нашёл), ну и поправил ввод полей - если ставить пустое значение, то сразу сбрасывается на 0 (у тебя сбрасывалось только после ввода в другое поле), если ставить выше 255, то также сразу ставиться на 255
Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом
Вобщем вот скрипт:
Код: 
#NoTrayIcon
#include <GUIConstants.au3>
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global Const $WM_COMMAND = 0x0111
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N, $LastDrColor = 0, $LastRetColor = 0
$Colorizer=GUICreate("Сolorizer (RGB)","320","200",-1,-1,-1,$WS_EX_TOPMOST)
GUISetBkColor (0x000000)
Dim $CTRL_edit[3]
$CTRL_edit[0] = GUICtrlCreateEdit ("0", 5, 5, 34, 18,$ES_NUMBER)
GUICtrlSetTip (-1,"Red")
GUICtrlSetLimit (-1, 3)
$CTRL_edit[1] = GUICtrlCreateEdit ("0", 5, 30, 34, 18,$ES_NUMBER)
GUICtrlSetTip (-1,"Green")
GUICtrlSetLimit (-1, 3)
$CTRL_edit[2] = GUICtrlCreateEdit ("0", 5, 55, 34, 18,$ES_NUMBER)
GUICtrlSetTip (-1,"Blue")
GUICtrlSetLimit (-1, 3)
Dim $CTRL_slider[3] = [GUICtrlCreateSlider(54,5,255,20), GUICtrlCreateSlider(54,30,255,20), GUICtrlCreateSlider(54,55,255,20)]
For $i=0 To 2
GUICtrlSetLimit($CTRL_slider[$i],255,0)
GUICtrlSetBkColor($CTRL_slider[$i],0x000000)
Next
$CTRL_edit_hex = GUICtrlCreateEdit ("0x000000", 5, 145, 80, 18,$ES_READONLY)
GUICtrlSetTip (-1,"Шестнадцатиричное представление")
$Button_ChooseColor = GUICtrlCreateButton("Цвет",240,95,60,20)
$ButtonDr = GUICtrlCreateButton("Пипетка",240,120,60,20)
$ButtonRnd = GUICtrlCreateButton("Случайно",240,145,60,20)
For $i = $Button_ChooseColor To $ButtonRnd
_ButtonClassicStyle($i)
GUICtrlSetCursor ($i,0)
Next
$Gr=GUICtrlCreateGraphic(4,174,0,0)
$GrCover=GUICtrlCreatePic("",2,174,316,20,-1,$WS_EX_CLIENTEDGE)
Draw_ToneScale()
GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
$msg=GUIGetMsg()
Switch $msg
Case $GUI_EVENT_PRIMARYUP
ToolTip("")
Case $GUI_EVENT_PRIMARYDOWN
$CurInfo = GUIGetCursorInfo($Colorizer)
If $CurInfo[4] = $GrCover Then
GUICtrlSetCursor($GrCover, 3)
$coord = _GetControlPos ($Colorizer, $GrCover)
_MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
While $CurInfo[4] = $GrCover And $CurInfo[2] = 1
$CurInfo = GUIGetCursorInfo($Colorizer)
If Not DropperScale() Then
Sleep(100)
Else
Sleep(50)
EndIf
WEnd
_MouseTrap()
GUICtrlSetCursor($GrCover, 2)
EndIf
Case $GUI_EVENT_CLOSE
Exit
Case $CTRL_edit[0] To $CTRL_edit[2]
$N = $msg - $CTRL_edit[0]
EndSwitch
WEnd
;~ Тоновая шкала:
Func Draw_ToneScale()
For $i=0 To 255 Step $st
$green=$i
SetColor()
Next
For $i=0 To 255 Step $st
$red=255-$i
SetColor()
Next
For $i=0 To 255 Step $st
$blue=$i
SetColor()
Next
For $i=0 To 255 Step $st
$green=255-$i
SetColor()
Next
For $i=0 To 255 Step $st
$red=$i
SetColor()
Next
For $i=0 To 255 Step $st
$blue=255-$i
SetColor()
Next
EndFunc
Func SetColor()
Local $color='0x' & Hex($red,2) & Hex($green,2) & Hex($blue,2)
GUICtrlSetGraphic($Gr,$GUI_GR_COLOR, $color)
GUICtrlSetGraphic($Gr,$GUI_GR_RECT,$x,0,1,20)
$x+=1
EndFunc
Func Input()
Local $color[3] = [GUICtrlRead($CTRL_edit[0]),GUICtrlRead($CTRL_edit[1]),GUICtrlRead($CTRL_edit[2])]
Local $str, $i, $ret="0x"
For $i = 0 To 2
If $color[$i] = "" Then
$color[$i] = 0
ElseIf $color[$i] > 255 Then
$color[$i] = 255
EndIf
$ret &= Hex($color[$i],2)
Next
GUICtrlSetData($CTRL_edit_hex,$ret)
GUICtrlSetData($CTRL_edit[$N],$color[$N])
GUICtrlSetData($CTRL_slider[$N],$color[$N])
If $LastRetColor = $ret Then Return
$LastRetColor = $ret
GUISetBkColor($ret, $Colorizer)
;~ Меняем фоновый цвет слайдеров:
For $j=0 To 2
GUICtrlSetBkColor($CTRL_slider[$j],$ret)
Next
EndFunc
Func slEvent()
Local $slColor=GUICtrlRead($CTRL_slider[$N])
GUICtrlSetData ($CTRL_edit[$N],$slColor)
GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
Input()
;~ Возвращаем утраченный фокус элементу:
GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
EndFunc
Func randomize()
Local $i, $HexColor ='0x'
For $i=0 to 2
$rnd = int(Random(0,255))
$HexColor &= Hex($rnd,2)
GUICtrlSetData($CTRL_edit[$i],$rnd)
GUICtrlSetData($CTRL_slider[$i],$rnd)
Next
For $i=0 to 2
GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
Next
GUICtrlSetData($CTRL_edit_hex,$HexColor)
GUISetBkColor($HexColor,$Colorizer)
EndFunc
Func dropper()
Local $Time=TimerInit()
GUICtrlSetState($ButtonDr,$GUI_DISABLE)
ToolTip("Кликните мышью в любом месте экрана",Default,Default,"",0,3)
_SetCursor(@WindowsDir & "\cursors\cross_m.cur", 32512)
While 1
Sleep (1) ; Символический таймаут для уменьшения CPU!!!
$click=GUIGetCursorInfo ($Colorizer)
If TimerDiff($Time) > 2300 Then ToolTip("")
If $click[2] = 1 And $click[4] <> $ButtonDr Then
$Mouse=MouseGetPos()
$x=$Mouse[0]
$y=$Mouse[1]
$DrColor=Hex(PixelGetColor ($x,$y ),6)
$j=1
For $i=0 to 2
$Dr=Dec(StringMid($DrColor,$j,2))
GUICtrlSetData($CTRL_edit[$i],$Dr)
GUICtrlSetData($CTRL_slider[$i],$Dr)
$j += 2
Next
For $i=0 to 2
GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
Next
GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
GUISetBkColor('0x' & $DrColor,$Colorizer)
GUICtrlSetState($ButtonDr,$GUI_ENABLE)
ToolTip("")
ExitLoop
EndIf
WEnd
_SetCursor(@WindowsDir & "\cursors\3dwarro.cur", 32512)
EndFunc
Func DropperScale()
Local $Mouse=MouseGetPos()
Local $DrColor=Hex(PixelGetColor($Mouse[0],$Mouse[1]),6)
If $LastDrColor = $DrColor Then Return 0
$LastDrColor = $DrColor
Local $j=1
For $i=0 to 2
$Dr=Dec(StringMid($DrColor,$j,2))
GUICtrlSetData($CTRL_edit[$i],$Dr)
GUICtrlSetData($CTRL_slider[$i],$Dr)
$j += 2
Next
For $i=0 to 2
GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
Next
GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
GUISetBkColor('0x' & $DrColor,$Colorizer)
Return 1
EndFunc
;~ Author: Diamond
Func _GetControlPos($HWND, $ControlId)
Local $Win = WinGetPos($HWND)
Local $Client = WinGetClientSize($HWND)
Local $Control = ControlGetPos($HWND,"",$ControlId)
Local $BorderSize = ($Win[2]-$Client[0]) / 2
Local $PanelSize = $Win[3] - $Client[1] - $BorderSize
Local $array[4]
$array[0] = $Win[0] + $BorderSize + $Control[0] ; left
$array[1] = $Win[1] + $PanelSize + $Control[1] ; $top
$array[2] = $array[0] + $Control[2] ; right
$array[3] = $array[1] + $Control[3] ; bottom
Return $array
EndFunc
Func ChooseColor()
Local $HexColor = '0x'
Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)), $Colorizer)
If $BGR = -1 Then Return
For $i=0 to 2
$HexColor &= Hex($BGR[$i+1],2)
GUICtrlSetData($CTRL_edit[$i],$BGR[$i+1])
GUICtrlSetData($CTRL_slider[$i],$BGR[$i+1])
Next
For $i=0 to 2
GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
Next
GUICtrlSetData($CTRL_edit_hex,$HexColor)
GUISetBkColor($HexColor,$Colorizer)
EndFunc
Func ColorPicker($Default=0, $hWnd=0)
Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
DllStructSetData($p, 1, DllStructGetSize($p))
DllStructSetData($p, 2, $hWnd)
DllStructSetData($p, 4, $Default)
DllStructSetData($p, 5, DllStructGetPtr(DllStructCreate("int[16]")))
DllStructSetData($p, 6, BitOR(0x100, 0x2, 0x1))
$ret = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr",DllStructGetPtr($p))
If $ret[0] = False Then Return -1
Local $color_picked = DllStructGetData($p, 4)
$color_picked = Hex(String($color_picked), 6)
Local $array[4]
$array[0]="0x" & StringRight($color_picked,2) & StringMid($color_picked,3,2) & StringLeft($color_picked,2)
$array[1]=Number("0x" & StringRight($color_picked,2)) ; RED
$array[2]=Number("0x" & StringMid($color_picked,3,2)) ; GREEN
$array[3]=Number("0x" & StringLeft($color_picked,2)) ; BLUE
Return $array
EndFunc
Func WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
Local $Continue = False, $i
Switch $FocusedHandel
Case GUICtrlGetHandle($ButtonRnd)
randomize()
Return
Case GUICtrlGetHandle($ButtonDr)
dropper()
Return
Case GUICtrlGetHandle($Button_ChooseColor)
ChooseColor()
Return
Case Else
For $i = 0 To 2
If $FocusedHandel = GUICtrlGetHandle($CTRL_edit[$i]) Then
$Continue = True
ExitLoop
EndIf
Next
If Not $Continue Then Return
EndSwitch
$N = $CTRL_edit[$i] - $CTRL_edit[0]
Local $CtrlRead = GUICtrlRead($CTRL_edit[$N])
If StringLeft($CtrlRead, 1) = 0 And StringLen($CtrlRead) > 1 Then GUICtrlSetData($CTRL_edit[$N], StringTrimLeft($CtrlRead, 1))
Input()
EndFunc
Func WM_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
For $i = 0 To 2
If GUICtrlGetHandle($CTRL_slider[$i]) = $FocusedHandel Then
$N = $i
ExitLoop
EndIf
Next
Local $CurInfo = GUIGetCursorInfo($hWndGUI)
If $CurInfo[2] = 1 Then
ToolTip(GUICtrlRead($CTRL_slider[$N]))
Else
ToolTip("")
EndIf
slEvent()
EndFunc
; Author - I think gafrost ;)
;==================================================================
; $s_file - file to load cursor from
; $i_cursor - system cursor to change
;==================================================================
Func _SetCursor($s_file, $i_cursor)
Local $newhcurs, $lResult
$newhcurs = DllCall("user32.dll", "int", "LoadCursorFromFile", "str", $s_file)
If Not @error Then
$lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor)
If Not @error Then
$lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $newhcurs[0])
Else
;MsgBox(0, "Error", "Failed SetSystemCursor")
EndIf
Else
;MsgBox(0, "Error", "Failed LoadCursorFromFile")
EndIf
Return $lResult[0]
EndFunc ;==>_SetCursor
; Author - RazerM
Func SwitchColor ($iColor)
Local $iMask
$iMask = BitXOR(BitAND($iColor, 0xFF) , ($iColor / 0x10000))
Return BitXOR($iColor, ($iMask * 0x10001))
EndFunc ;==>SwitchColor
;~ Author: Diamond
Func _ButtonClassicStyle($controlID, $style=0)
GUICtrlSetStyle($controlID, 0x0040) ; $BS_ICON
GUICtrlSetImage($controlID, "shell32.dll",0,0)
GUICtrlSetStyle($controlID, $style)
EndFunc
Что скажешь? 
|