Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Creat0R

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
Что скажешь?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:56, 22-09-2007 | #459