Войти

Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [23] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Creat0R
12-09-2007, 18:38
Diamond,
Кто нибудь может объяснить подобное поведение?
Полагаю что это из за того, что фокус на себя берёт созданный элемент, и любое нажатиие клавиш посылается именно этому элементу, хотя WM_KEYDOWN как я понял, принимает события только от самого GUI (т.е только если не сфокусирован ни один элемент).

Я попробовал убрать фокус с элемента, но это не помагает (точнее фокус не убирается, баг?)...

$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
GUICtrlSetState(-1, $GUI_NOFOCUS)

Diamond,
Очень странно, но если создать элемент после GuiSetState(), то всё работает:


#include <GUIConstants.au3>
Global Const $WM_KEYDOWN = 0x0101

$HWnd = GUICreate("KEYDOWN_TEST",400,300)
GUIRegisterMsg($WM_KEYDOWN, "Get_KeyDown")

GUISetState()

$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)

While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd

Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
MsgBox(262144,"Код нажатой кнопки:", BitAND($wParam,0xFF))
EndFunc

Diamond
12-09-2007, 19:00
Creat0R,
Действительно, должны обрабатываться только те нажатия, которые посылаються в окно гуи.
А насчёт бага, если это даже и не баг, то использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
Кстати, я сначала тоже предположил что дело в фокусе или табуляции.
Очень странно, но если создать элемент после GuiSetState(), то всё работает
Действительно странно... а если по каким либо причинам придётся повторно использовать GUISetState() - то событие снова перестанет обрабатываться.

Creat0R
12-09-2007, 19:16
Diamond,
использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
См. пример в моём предыдущем посте, я запостил его почти сразу после первого, но они склеились :)

P.S
Может пойти попробовать репортануть о баге(?) с фокусом? :shuffle:

Diamond
12-09-2007, 19:24
Creat0R,
А может быть дело совсем не в фокусе...?

Добавлено:
...имхо, дело не в фокусе, иначе это не работало бы ни до ни после GUISetState().
Репортануть то можно бы... правда у меня знания английского почти нулевые. :blush:

Creat0R
12-09-2007, 21:10
Diamond,
Репортануть то можно бы
Пока оставил пост (http://www.autoitscript.com/forum/index.php?s=&showtopic=53201&view=findpost&p=402437) в разделе по GUI, может у разработчиков (или опытных AutoIt-ГУРУ :)) найдётся более правильное обьяснение, или даже решение.

Diamond,
Видимо не суждено это побороть:

Some controls consume internally specific Windows Message ID, so registrating them will have no effect, e.g; WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control.

:(

Diamond
13-09-2007, 09:57
Creat0R,
Пока оставил пост в разделе по GUI
Спасибо!

Вот ещё пример с колёсиком мыши и слайдером - наверное здесь тоже происходит "поглощение":

При изменении позиции слайдера колесом мыши, GUIGetMsg() не срабатывает, а загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL - для того чтобы получать значение слайдера при повороте колеса мыши (если он в фокусе). Но увы... именно когда он в фокусе, событие $WM_MOUSEWHEEL перестаёт обрабатываться.

#include <GUIConstants.au3>
$HWnd = GUICreate("MOUSEWHEEL_TEST",400,300)
$BUTTON = GUICtrlCreateButton("Get Value",10,10,70,20)
$SLIDER = GUICtrlCreateSlider(10,70,300,20)
$INPUT = GUICtrlCreateInput("0",10,100,30,18,BitOR($ES_READONLY,$ES_CENTER))
Global Const $WM_MOUSEWHEEL = 0x020A
GUIRegisterMsg($WM_MOUSEWHEEL,"Get_MouseWheel")
GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $SLIDER
GUICtrlSetData($INPUT,GUICtrlRead($SLIDER))
Case $BUTTON
MsgBox(0,"Текущее значение слайдера:",GUICtrlRead($SLIDER))
EndSwitch
WEnd

Func Get_MouseWheel($HWnd,$Command,$wParam,$lParam)
Switch $wParam
Case 0x00780000 ; UP
Beep(100,40)
Case 0xFF880000 ; DOWN
Beep(80,40)
EndSwitch
EndFunc

Creat0R
13-09-2007, 10:18
Diamond,
загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL
Очень кстати по поводу Slider, как раз сегодня на оф. форуме кто-то спросил про эту же функциональность (http://www.autoitscript.com/forum/index.php?s=&showtopic=53229&view=findpost&p=402685), я сначала тоже предложил решение с использованием главного цикла, но позже поискал в MSDN и нашёл более практичное решение:


#include <GuiConstants.au3>

Global Const $WM_HSCROLL = 0x0114
Global Const $WM_VSCROLL = 0x0115

$Gui = GuiCreate("Slider Update Demo", 250, 200)

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_VSCROLL, "WM_HVSCROLL")

$Vertical_Label = GUICtrlCreateLabel("Vertical Slider Read: 0", 20, 20, 200)
$Horizontal_Label = GUICtrlCreateLabel("Horizontal Slider Read: 0", 80, 120, 200)

$Vertical_Slider = GUICtrlCreateSlider(20, 50, 30, 120, BitOr($GUI_SS_DEFAULT_SLIDER, $TBS_VERT))
$Horizontal_Slider = GUICtrlCreateSlider(60, 150, 160, 30)

GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
Exit
EndSwitch
WEnd

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Switch $MsgID
Case 277
GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
Case 276
GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
EndSwitch
EndFunc


И колёсико мышки работает, и обновляется в реальном времени ;)...
Аж самому не верится, я до сих пор сам то циклом пользовался :)

Diamond
13-09-2007, 17:01
Creat0R,
Да ты просто фокусник! :) Вот так вот запросто взял и нашёл отличное решение. Спасибо!
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров. ;)

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Switch $LParam
Case GUICtrlGetHandle($Vertical_Slider)
GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
Case GUICtrlGetHandle($Horizontal_Slider)
GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
EndSwitch
EndFunc

Creat0R
13-09-2007, 19:46
Diamond,
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров
Класс! Спасибо.

Creat0R
13-09-2007, 22:17
Написал тут утилитку для сохранения и восстановления позиции иконок рабочего стола...

http://creator-lab.ucoz.ru/Images/Desktop_Icons_Restorator_Main_Window.png

Прлучилось вроде неплохо :)

Скачать архив можно тут (http://creator-lab.ucoz.ru/load/3-1-0-22).

Diamond
17-09-2007, 09:32
Creat0R,
Написал тут утилитку для сохранения и восстановления позиции иконок рабочего стола... Очень нужная вещь, спасибо. :)

Oldschool
17-09-2007, 12:15
Надо создать 3D array который открывает 5 окон internet explorer и делает на каждом окне timestamp после того как иссекает контрольное время, например 1 мин, надо закрыть конкретное окно и заменить его новым окном. Размер каждого окна должен быть 800х560.

я не совсем понимаю как это сделать...
вот что у меня есть пока:

HotKeySet("{ESC}", "Terminate")
; Set Coordinate mode to relative to window
AutoItSetOption ( "PixelCoordMode", 0 )
Run("C:\Program Files\Internet Explorer\IEXPLORE.EXE")
Sleep(2000)
;MsgBox(0, "Active window stats (x,y,width,height):", $WindowPosition[0] & " " & $WindowPosition[1] & " " & $WindowPosition[2] & " " & $WindowPosition[3], 1)
WinMove($WindowName, "", $array[1],[1])
Call("TimeStamp")

$array[1][1] = _ArrayCreate(0, 0)
$array[2][1] = _ArrayCreate(0, 0)
$array[2][2] = _ArrayCreate(0, 800)
$array[2][3] = _ArrayCreate(560, 0)
$array[2][3] = _ArrayCreate(560, 800)


Func TimeStamp()
$TimeStampFileName = $TimeStampFilePath & TimerInit() &".tsp"
;MsgBox(0, $TimeStampFileName, $TimeStampFileName, 2)
FileDelete($TimeStampFilePath & "*.tsp")
_FileCreate ($TimeStampFileName)
EndFunc ;==>TimeStamp

Func Terminate()
;MsgBox(0, "Entering Terminate Function...","",3)
Exit 0
EndFunc ;==>Terminate

Creat0R
21-09-2007, 08:02
Diamond,
Очень нужная вещь
Я тоже так подумал перед началом написания скрипта (а ведь иидея не моя (http://www.autoitscript.com/forum/index.php?showtopic=52575&st=0&p=397684&#entry397684) ;) )...

Обновил программку... (http://creator-lab.ucoz.ru/load/3-1-0-22)
Список изменении в добавленном Readme.txt, или в топике на оф. форуме (http://www.autoitscript.com/forum/index.php?s=&showtopic=53209&view=findpost&p=405267) ;)

Maza Faka
21-09-2007, 09:33
Привет всем, написал скриптик для закачки файла с отображением прогресса закачки, но мне не нравится, как реализована функция ProgressSet, может есть более красивое решение подсчёта и отображения процента закачки файла.

$url = "http://game.chirkom.uz/download/hard/cpu-z-123.zip"
$NameArr = StringSplit($url, "/")
$name = $NameArr[$NameArr[0]]
$size = InetGetSize($url)

If $size Then
$answer = MsgBox(1, "Warning", "The file size = " & $size & " bytes download now?")
If $answer = 2 Then
MsgBox(64, "Cancel", "Donloading canceled")
Exit 1
ElseIf $answer = 1 Then
$sGet = FileDownload($url)
If $sGet = -1 Then
MsgBox(16, "Error", "DownLoading error")
Exit 1
EndIf
MsgBox(64, "Done", $sGet)
Else
Exit
EndIf
Else
MsgBox(16, "Error", "File not exist")
EndIf

Func FileDownload($url)
Local $fileGet = InetGet($url, @TempDir & "\" & $name, 1, 1)
If Not $fileGet Then Return SetError(1, 0, -1)
ProgressOn("Please wait...", "Downloading file")
$dec = $size / 100
$dSize = $dec
$percent = 0
While @InetGetActive
If @InetGetBytesRead >= $dSize Then
$dSize += $dec
$percent += 1
ProgressSet($percent, $percent & " percent downloading")
EndIf

TrayTip("DownLoading", "Bytes = " & @InetGetBytesRead, 10, 1)
Sleep(10)
WEnd
ProgressSet(100, "Done")
Sleep(1000)
ProgressOff()
Return "Downloading successfull"
EndFunc

Creat0R
21-09-2007, 09:44
Maza Faka,
может есть более красивое решение подсчёта и отображения процента закачки файла
Посмотри страниц где то 10-20 назад (легче в версии для печати), мы с amel27 вроде это обсуждали тут.

Maza Faka
21-09-2007, 10:22
Creat0R
Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Никак не могу достучаться тебе в аську, мой ник DeVil :)

Creat0R
21-09-2007, 10:54
Maza Faka,
Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Нужно отлавливать нажатие мышки, а потом MouseGetPos() + GuiCtrlSetPos() :)


#include <GuiConstants.au3>
Opt("MouseCoordMode", 2)

$Gui = GuiCreate("Test")
$Label = GUICtrlCreateLabel("My Label, Move me ;)", 20, 20)

GUISetState()

While 1
$Msg = GUIGetMsg()

Switch $Msg
Case -3
Exit
Case Else
$CurInfo = GUIGetCursorInfo($Gui)
While $CurInfo[2] = 1 And $CurInfo[4] = $Label
$CurInfo = GUIGetCursorInfo($Gui)
$LabelPos = ControlGetPos($Gui, "", $Label)
If $LabelPos[0] <> MouseGetPos(0) Or $LabelPos[1] <> MouseGetPos(1) Then
GUICtrlSetPos($Label, MouseGetPos(0), MouseGetPos(1))
Else
Sleep(5)
EndIf
WEnd
EndSwitch
WEnd

Diamond
21-09-2007, 18:20
Утилита для подбора цвета:

#NoTrayIcon
#include <GUIConstants.au3>
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N
$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")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
$msg=GUIGetMsg()
Switch $msg
Case $GUI_EVENT_PRIMARYUP
GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
ToolTip("")
Case $GUI_EVENT_PRIMARYDOWN
GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL_2")
Case $GUI_EVENT_CLOSE
Exit
Case $ButtonRnd
randomize()
Case $ButtonDr
dropper()
Case $Button_ChooseColor
ChooseColor()
Case $CTRL_edit[0] To $CTRL_edit[2]
$N = $msg - $CTRL_edit[0]
Input()
Case $CTRL_slider[0] To $CTRL_slider[2]
$N = $msg - $CTRL_slider[0]
slEvent()
Case $GrCover
DropperScale()
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])
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)
While 1
Sleep (1) ; Символический таймаут для уменьшения CPU!!!
$click=GUIGetCursorInfo ($Colorizer)
If TimerDiff($Time)>2300 Then ToolTip("")
If $click[2] 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)
ExitLoop
EndIf
WEnd
EndFunc

Func DropperScale()
GUICtrlSetCursor($GrCover,3)
$coord = _GetControlPos ($Colorizer, $GrCover)
While 1
$i_msg = GUIGetMsg()
If $i_msg = $GUI_EVENT_PRIMARYUP Then ExitLoop
_MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
WEnd
Local $Mouse=MouseGetPos()
Local $DrColor=Hex(PixelGetColor ($Mouse[0],$Mouse[1]),6)
_MouseTrap()
GUICtrlSetCursor($msg,2)
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)
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()
GUISetState(@SW_DISABLE)
SetOnTop($Colorizer,1)
Local $HexColor = '0x'
Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)))
GUISetState(@SW_ENABLE)
SetOnTop($Colorizer,-1)
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)
Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
DllStructSetData($p, 1, DllStructGetSize($p))
DllStructSetData($p, 2, 0)
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_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
Switch $LParam
Case GUICtrlGetHandle($CTRL_slider[0])
$N = 0
Case GUICtrlGetHandle($CTRL_slider[1])
$N = 1
Case GUICtrlGetHandle($CTRL_slider[2])
$N = 2
EndSwitch
slEvent()
EndFunc

Func WM_SCROLL_2($hWndGUI, $MsgID, $WParam, $LParam)
Local $title
Switch $LParam
Case GUICtrlGetHandle($CTRL_slider[0])
$N = 0
Case GUICtrlGetHandle($CTRL_slider[1])
$N = 1
Case GUICtrlGetHandle($CTRL_slider[2])
$N = 2
EndSwitch
ToolTip(GUICtrlRead($CTRL_slider[$N]))
EndFunc

; 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

Func SetOnTop($HWND, $TOPMOST)
DllCall("User32.dll","long","SetWindowPos","hwnd",$HWND, _
"int",$TOPMOST, _ ; Always On Top = -1
"int",0, _ ; Left
"int",0, _ ; Top
"int",0, _ ; Width
"int",0, _ ; Height
"int",3) ; Flag: $SWP_NOSIZE=1 and $SWP_NOMOVE=2
EndFunc

Creat0R
22-09-2007, 07:56
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


Что скажешь? :shuffle:

Diamond
22-09-2007, 15:57
Creat0R
Спасибо за отклик! :)
это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами
Изначално я её задумал чтобы облегчить подбор цветов для новых GUI, начал писать давно, потом проект забросил, а решил дописать после того как ТЫ привёл на форум пример со слайдерами.
Кстати из-за давности проекта осталось несколько, неуклюже написанных функций, (ведь тогда у меня было поменьше опыта...) они так и остались :lazy: фактически без изменений...
Теперь диалог для выбора цвета открывается как дочернее окно
Когда переписывал udf-ую _ChooseColor я почему-то убрал эту возможность... а потом и вовсе про неё забыл. Вместо этого стал использовать API-SetOnTop(), а теперь раз окно выбора цвета стало дочерним, SetOnTop() больше не нужна. Спасибо. :)
также переделал немного методы обновления данных
Ты вернул то, что я так старательно убирал, :biggrin: как раз именно из-за постоянных мельканий элементов. В начале у меня тоже обновлялось в реальном времени. Думаю, обновление лучше оставить как было, чтобы при перемещении позиции слайдера мышкой - обновлялось только один раз, а при использовании мышинного колёсика - постоянно.
По поводу курсора - идея хорошая, но с точки зрения пользователя было бы некорректно заменять текущий курсор на новый... Вижу толька два выхода: либо искать способ для определения текущего курсора, либо искать другую API-функцию (хотелось бы верить что она существует)
поправил ввод полей
... с помощью $WM_COMMAND, ...давно искал решение для мгновенного определения ввода, спасибо!

Куда-то пропала моя любимая фича: :search: При нажатии на тоновую шкалу (точнее при отпускании мышки с $GrCover) происходило определение цвета тоновой шкалы, и это не зависило от Пипетки... :(
Вместо этого добавился глюк: При клике по $GrCover запускается последнее действие, т.е. если я до этого нажимал кнопку "Цвет", то при клике по $GrCover вызывается диалог выбора цвета и т.д. :swoon:

Добавлено:
Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом
Не @SW_HIDE а @SW_DISABLE... Наверное повторюсь... Сочетание функции SetOnTop() и @SW_DISABLE я тупо использовал из-за того, что "окно выбора цвета" не было дочерним, теперь всё это не потребуется ;)




© OSzone.net 2001-2012