Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Checkbox с изменяющимися иконками (http://forum.oszone.net/showthread.php?t=173538)

Centrinar 19-04-2010 14:10 1396169

Checkbox с изменяющимися иконками
 
http://forum.oszone.ru/post-479390.html
тут есть пример создания GUI с Checkbox, помогите добавить к чекбоксам изменяющиеся иконки т.е. создаеться список Checkbox и возле каждого Checkbox создаеться иконка, при нажатии "Выполнить" возле Checkbox-а операция которго сейчас выполняеться меняеться иконка и по окончанию выполнения она меняеться еще раз.СПАСИБО

Creat0R 19-04-2010 18:48 1396345

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

Global $iIcon = -5

$hGUI = GUICreate("Test Script", 300, 200)

$aCheckBox = _GUICtrlCreateCheckboxEx("CheckBox", 20, 40, -1, -1, "shell32.dll", $iIcon)

$nStart = GUICtrlCreateButton("Выполнить", 20, 170)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStart
            $iIcon
= BitNOT($iIcon)
            GUICtrlSetImage($aCheckBox[0], "shell32.dll", $iIcon)
    EndSwitch
WEnd

Func _GUICtrlCreateCheckboxEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $sIconFile="", $nIconIndex=0)
    Local $aRetArr[2]

    $aRetArr[0] = GUICtrlCreateIcon($sIconFile, $nIconIndex, $iLeft + 17, $iTop + $iHeight + 3, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    $aRetArr[1] = GUICtrlCreateCheckbox("      " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, 0x04000000) ;$WS_CLIPSIBLINGS

    Return $aRetArr
EndFunc


Centrinar 19-04-2010 19:33 1396380

А из-за чего он отображает не те иконки, например я ставлю 246 я уверен что в shell32 это одно а в итоге он показывает другое

Creat0R 19-04-2010 22:46 1396521

Цитата:

Цитата Centrinar
из-за чего он отображает не те иконки »

А что в справке к «GUICtrlSetImage» об этом сказано? ;)

Centrinar 19-04-2010 23:12 1396531

Код:

В элементе Button изображение заменяет надпись. Изображение можно установить также в Checkbox, если для него применяется стиль $BS_PUSHLIKE. В обоих случаях для изображения требуются стили $BS_ICON или $BS_BITMAP.  Внимание. Если эта функция вызывается впервые для TreeView/Item или ListView/Item, то и все остальные добавляемые графы этих управляющих элементов будут по умолчанию использовать индикатор/изображение (icon/image). Но если функцию GUICtrlSetImage вызвать для TreeView или ListView, то все графы этих управляющих элементов поменяют свои изображения на указанные индикатор/изображение (icon/image).
новичек врятли нормально поймет

Creat0R 19-04-2010 23:45 1396550

Цитата:

Цитата Centrinar
новичек врятли нормально поймет »

Это потому что справка на русском не обновлена. В английской версии на которую я указал ссылкой, сказано, что положительные числа представляют “строковое имя” иконки в файле, а негативные представляют числовое имя, т.е в последовательности нахождения (позиции) иконки в файле.

Centrinar 20-04-2010 16:20 1396990

Помогите пожалуйста правильно объеденить скрипт этот с
Код:

http://forum.oszone.net/thread-173577.html

Creat0R 20-04-2010 21:02 1397207

Centrinar, зачем вы ссылки помещаете в тег кода?

Цитата:

Цитата Centrinar
Помогите пожалуйста правильно объеденить скрипт этот с »

Не уверен по каким параметрам соеденять скрипты, но вот что получилось, дальше уже сами:

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

; Только эту строку и нужно править для добавления новых, или удаления пунктов ;)
Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

;Это так, чтобы проверить столбцы :)
$sProgs &= $sProgs & '|' & $sProgs & '|' & $sProgs & '|' & $sProgs & '|' & $sProgs

Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1]
Global $aCheckedIcons[$aProgs[0]+1]
Global $aUnCheckedIcons[$aProgs[0]+1]

$Form1 = GUICreate("", 500, 500, -1, -1)

$iTop = 10
$iLeft = 20

For $i = 1 To $aProgs[0]
    $aCheckedIcons[$i] = -5
    $aUnCheckedIcons[$i] = -4

    $anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15, "shell32.dll", $aUnCheckedIcons[$i])
    $iTop += 20

    If $iTop > 450 Then
        $iTop = 10
        $iLeft += 100
    EndIf
Next

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStart
            For $i = 1 To $aProgs[0]
                $aCheckBox = $anCheckBoxes[$i]

                If GUICtrlRead($aCheckBox[1]) = 1 Then
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    MsgBox(64, $sProgName, $sProgExe)
                Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            Next
    EndSwitch
WEnd

Func _GUICtrlCreateCheckboxEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $sIconFile="", $nIconIndex=0)
    Local $aRetArr[2]

    $aRetArr[0] = GUICtrlCreateIcon($sIconFile, $nIconIndex, $iLeft + 17, $iTop, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    $aRetArr[1] = GUICtrlCreateCheckbox("      " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, $WS_CLIPSIBLINGS)

    Return $aRetArr
EndFunc


Centrinar 20-04-2010 23:56 1397322

Я добавил что бы он создавала еще 1 или 2 столюца если чекбоксов становиться много

Код:

if $iTop > 450 & $iLeft = 20 Then $iTop = 20 & $iLeft = 120
        if $iTop > 450 & $iLeft = 120 Then $iTop = 20 & $iLeft = 240

но он почемуто переносит только один чекбокс или вообще не переносит их на след столбец...

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

; Только эту строку и нужно править для добавления новых, или удаления пунктов ;)
Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1]
Global $aCheckedIcons[$aProgs[0]+1]
Global $aUnCheckedIcons[$aProgs[0]+1]

$Form1 = GUICreate("", 500, 500, -1, -1)

$iTop = 10
$iLeft = 20

For $i = 1 To $aProgs[0]
    $aCheckedIcons[$i] = -5
    $aUnCheckedIcons[$i] = -4

    $anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, 100, 15, "shell32.dll", $aUnCheckedIcons[$i])
    $iTop += 20
if $iTop > 450 & $iLeft = 20 Then $iTop = 20 & $iLeft = 120
        if $iTop > 450 & $iLeft = 120 Then $iTop = 20 & $iLeft = 240
Next

$nStart = GUICtrlCreateButton("Выполнить", 10, 110, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStart
            For $i = 1 To $aProgs[0]
                $aCheckBox = $anCheckBoxes[$i]

                If GUICtrlRead($aCheckBox[1]) = 1 Then
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    MsgBox(64, $sProgName, $sProgExe)
                Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            Next
    EndSwitch
WEnd

Func _GUICtrlCreateCheckboxEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $sIconFile="", $nIconIndex=0)
    Local $aRetArr[2]

    $aRetArr[0] = GUICtrlCreateIcon($sIconFile, $nIconIndex, $iLeft + 17, $iTop, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    $aRetArr[1] = GUICtrlCreateCheckbox("      " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, $WS_CLIPSIBLINGS)

    Return $aRetArr
EndFunc


Creat0R 21-04-2010 00:14 1397333

Цитата:

Цитата Centrinar
добавил что бы он создавала еще 1 или 2 столюца если чекбоксов становиться много »

С чего вы взяли что так можно присваивать значения переменным? :) Справку почитайте.
Я поправил свой предыдущий пример.

Centrinar 21-04-2010 20:41 1397971

Из-за чего может не срабатывать команда GUICtrlSetState ($anCheckBoxes[$i],$GUI_CHECKED) вроде делаю все по справке, но он упорно не хочет отметить все.
Код:

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton
                        For $i = 1 to $aProgs[0]
                GUICtrlSetState ($anCheckBoxes[$i],$GUI_CHECKED)
                Next
                Case $nStart
            For $i = 1 To $aProgs[0]
                $aCheckBox = $anCheckBoxes[$i]

                If GUICtrlRead($aCheckBox[1]) = 1 Then
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    MsgBox(64, $sProgName, $sProgExe)
                Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            Next
    EndSwitch
WEnd


gregaz 21-04-2010 22:05 1398032

Цитата:

Цитата Centrinar
Из-за чего может не срабатывать команда GUICtrlSetState ($anCheckBoxes[$i],$GUI_CHECKED) вроде делаю все по справке, но он упорно не хочет отметить все. »

Потому что $anCheckBoxesх[$i] - это не индефикатор CheckBox'a , а сам является массивом . Надо из него выделить ID
Можно так :
PHP код:

Case $nButton
   
For $i 1 to $aProgs[0]
      ; 
GUICtrlSetState ($anCheckBoxes[$i],$GUI_CHECKED)
      
$aArray=$anCheckBoxes[$i]
      
GUICtrlSetState ($aArray[1],$GUI_CHECKED)
   
Next 


Creat0R 22-04-2010 10:32 1398296

Да, это я забыл упомянуть. Массив содержит в каждом элементе дополнительный массив состоящий из двух элементов, первый (начиная с [0]) это ID создаваемой иконки рядом с Checkbox'ом, а второй это собственно ID самого элемента Checkbox.

Centrinar 25-04-2010 22:47 1400605

ПОЧЕМУ КОГДА Я ЗАДАЮ ФОНОВУЮ КАРТИНКУ GUICtrlCreatePic("002.jpg", 0, 0, 680, 500) ОН НЕ ОТОБРАЖАЕТ НАДПИСИ НА ЧЕКБОКСАХ

Creat0R 25-04-2010 23:24 1400618

Centrinar, не нужно писать всё заглавными буквами.

Цитата:

Цитата Centrinar
GUICtrlCreatePic »

Это не имеет отношения к чекбоксам, возможно речь про GUICtrlSetImage. Там просто указывается элементу другая отрисовка графики (ручная), поэтому нужно извращаться и самим рисовать иконки и текст. Кстати вот ещё способ создания чекбоксов:

Код:

Func _GUICtrlCreateCheckboxEx(ByRef $hImageList, $sText, $iLeft, $iTop, $iWidth=-1, $iHeight=-1, $nStyle=-1, $nExStyle=-1, $sIconFile='', $nIconID=0)
    Local $nID = GUICtrlCreateCheckbox($sText, $iLeft, $iTop, $iWidth, $iHeight, $nStyle, $nExStyle)

    If $sIconFile = '' Then
        Return $nID
    EndIf

    If $hImageList = 0 Then
        $hImageList = _GUIImageList_Create(16, 16, 5, BitOR($ILC_MASK, $ILC_COLOR32), 0, 1)
    EndIf

    _GUIImageList_AddIcon($hImageList, $sIconFile, $nIconID)
    _GUICtrlButton_SetImageList($nID, $hImageList)

    Return $nID
EndFunc

нужен #include <GuiImageList.au3> и #include <GuiButton.au3>.

Хотя тут будет сложнее изменять потом иконку.

Centrinar 26-04-2010 00:57 1400670

Ты меня не правильно понял. Изночально мы создаем GUI размером 500 на 500
Код:

$Form1 = GUICreate("", 500, 500, -1, -1)
. Потом мы создаем в нем кнопки, чекбоксы ну и т.д. Я хочу что бы в этом окне которое мы создали изночально, было фоновое изображение, соответственно я использую следующую команду:
Код:

$Form1 = GUICreate("", 500, 500, -1, -1)
GUICtrlCreatePic("002.jpg", 0, 0, 500, 500)

В итоге все получаеться но чекбоксы пропадают т.е. их просто не видно из-за чего?

Creat0R 26-04-2010 01:15 1400685

Цитата:

Цитата Centrinar
их просто не видно из-за чего? »

Из за того что элемент изображения поверх остальных элементов, его можно "задисейблить":

Код:

GUICtrlCreatePic("002.jpg", 0, 0, 500, 500)
GUICtrlSetState(-1, $GUI_DISABLE)


Centrinar 26-04-2010 01:20 1400689

Пробовал, иконки у чекбоксов видны а само название и чекбокс нет

Creat0R 26-04-2010 01:33 1400698

Цитата:

Цитата Centrinar
иконки у чекбоксов видны а само название и чекбокс нет »

А какого цвета фоновое изображение?

Centrinar 26-04-2010 01:36 1400701

Белое, ток не говори что название чекбоксов тож меняеться на белое)))

Creat0R 26-04-2010 08:29 1400778

Тогда так, но создавать картинку нужно после создания остальных элементов:

Код:

GUICtrlCreatePic(@SystemDir & "\oobe\images\wpakey.jpg", 0, 0, 500, 500, $WS_CLIPSIBLINGS)
Для белого фона текста можно использовать GUICtrlSetBkColor($aRetArr[1], 0xFFFFFF) перед выходом из функции _GUICtrlCreateCheckboxEx.

Centrinar 26-04-2010 13:06 1400956

то же не помогло

Creat0R 26-04-2010 16:16 1401089

Цитата:

Цитата Centrinar
то же не помогло »

«создавать картинку нужно после создания остальных элементов»...

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

; Только эту строку и нужно править для добавления новых, или удаления пунктов ;)
Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

;Это так, чтобы проверить столбцы :)
$sProgs &= $sProgs & '|' & $sProgs & '|' & $sProgs & '|' & $sProgs & '|' & $sProgs

Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1]
Global $aCheckedIcons[$aProgs[0]+1]
Global $aUnCheckedIcons[$aProgs[0]+1]

$Form1 = GUICreate("", 500, 500)
GUISetBkColor(0xFFFFFF)

$iTop = 10
$iLeft = 20

For $i = 1 To $aProgs[0]
    $aCheckedIcons[$i] = -5
    $aUnCheckedIcons[$i] = -4

    $anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15, "shell32.dll", $aUnCheckedIcons[$i])
    $iTop += 20

    If $iTop > 450 Then
        $iTop = 10
        $iLeft += 100
    EndIf
Next

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)

GUICtrlCreatePic(@DesktopDir & "\back.jpg", 0, 0, 500, 500, $WS_CLIPSIBLINGS)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nStart
            For $i = 1 To $aProgs[0]
                $aCheckBox = $anCheckBoxes[$i]

                If GUICtrlRead($aCheckBox[1]) = 1 Then
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    MsgBox(64, $sProgName, $sProgExe)
                Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            Next
    EndSwitch
WEnd

Func _GUICtrlCreateCheckboxEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $sIconFile="", $nIconIndex=0)
    Local $aRetArr[2]

    $aRetArr[0] = GUICtrlCreateIcon($sIconFile, $nIconIndex, $iLeft + 17, $iTop, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)

    $aRetArr[1] = GUICtrlCreateCheckbox("      " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, $WS_CLIPSIBLINGS)
    GUICtrlSetBkColor($aRetArr[1], 0xFFFFFF)

    Return $aRetArr
EndFunc


Centrinar 26-04-2010 16:21 1401095

СПС, ты прав я прост не правильно директорию указал )))


Время: 16:38.

Время: 16:38.
© OSzone.net 2001-