PDA

Показать полную графическую версию : [решено] Помогите правильно создать GUI окно с элементами


Centrinar
07-05-2010, 15:52
Я продолжаю изучение GUI и вот еще пара глупых вопросов. Создаю GUI со вкладками и чекбоксами вроде делаю все правильно но на первой вкладке чекбоксы не работают, а работают только на втрой. Где ошибка? И можно ли как то сократить скрипт т.е. составить более грамотно? СПАСИБО

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#requireadmin
#NoTrayIcon


Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
Global $sProgs2 = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

Global Const $aProgs = StringSplit($sProgs, '|')
Global Const $aProgs2 = StringSplit($sProgs2, '|')
Global $anCheckBoxes[$aProgs[0]+1]
Global $aCheckedIcons[$aProgs[0]+1]
Global $aUnCheckedIcons[$aProgs[0]+1]
Global $aCompleteIcons[$aProgs[0]+1]
Global $aInstalledIcons[$aProgs[0]+1]
Global $anCheckBoxes2[$aProgs2[0]+1]
Global $aCheckedIcons2[$aProgs2[0]+1]
Global $aUnCheckedIcons2[$aProgs2[0]+1]
Global $aCompleteIcons2[$aProgs2[0]+1]
Global $aInstalledIcons2[$aProgs2[0]+1]

GUICreate("My GUI Tab",600,550)
GUISetBkColor(0xFFFFFF)
$nStart = GUICtrlCreateButton("Выполнить", 30, 510, 150, 30)
$tab=GUICtrlCreateTab (10,10, 580,480)
GUISetBkColor(0xFFFFFF)
$tab0=GUICtrlCreateTabitem ("tab0")
GUISetBkColor(0xFFFFFF)
$iTop = 35
$iLeft = 15
For $i = 1 To $aProgs[0]
$aCheckedIcons[$i] = "common\images\01.ico"
$aUnCheckedIcons[$i] = "common\images\01.ico"
$aInstalledIcons[$i] = "common\images\03.ico"
$aCompleteIcons[$i] = "common\images\02.ico"
$anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15, $aUnCheckedIcons[$i])
$iTop += 20
If $iTop > 480 Then
$iTop = 10
$iLeft += 170
EndIf
Next

$tab1=GUICtrlCreateTabitem ("tab1")
GUISetBkColor(0xFFFFFF)
$iTop = 35
$iLeft = 15
For $s = 1 To $aProgs2[0]
$aCheckedIcons2[$s] = "common\images\01.ico"
$aUnCheckedIcons2[$s] = "common\images\01.ico"
$aInstalledIcons2[$s] = "common\images\03.ico"
$aCompleteIcons2[$s] = "common\images\02.ico"
$anCheckBoxes2[$s] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs2[$s], '^.*=', ''), $iLeft, $iTop, -1, 15, $aUnCheckedIcons2[$s])
$iTop += 20
If $iTop > 480 Then
$iTop = 10
$iLeft += 170
EndIf
Next




GUICtrlCreateTabitem ("")

GUISetState ()

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
$iChecked_Counter += 1
GUICtrlSetImage($aCheckBox[0], $aInstalledIcons[$i])
$sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
$sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')
MsgBox(64, $sProgName, "zz", 3)
GUICtrlSetImage($aCheckBox[0], $aCompleteIcons[$i])
Else
GUICtrlSetImage($aCheckBox[0], $aUnCheckedIcons[$i])
EndIf
Next
For $s = 1 To $aProgs2[0]
$aCheckBox2 = $anCheckBoxes2[$s]
If GUICtrlRead($aCheckBox2[1]) = 1 Then
$sChecked_Counter += 1
GUICtrlSetImage($aCheckBox2[0], $aInstalledIcons2[$s])
$sProgName2 = StringRegExpReplace($aProgs2[$s], '^.*=', '')
$sProgExe2 = StringRegExpReplace($aProgs2[$s], '=.*$', '')
MsgBox(64, $sProgName2, "zz", 3)
GUICtrlSetImage($aCheckBox2[0], $aCompleteIcons2[$s])
Else
GUICtrlSetImage($aCheckBox2[0], $aUnCheckedIcons2[$s])
EndIf
Next
$iChecked_Counter = 0
$sChecked_Counter = 0
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)
GUICtrlSetBkColor($aRetArr[1], 0xFFFFFF)

Return $aRetArr
EndFunc

Creat0R
07-05-2010, 17:52
на первой вкладке чекбоксы не работают, а работают только на втрой »
У меня почти все неработают, это из за того что иконка чекбокса не найдена, и элемент GUICtrlCreateIcon не создаётся, а т.к после него вызывается GUICtrlSetState(-1, $GUI_DISABLE), оно срабатывает для предыдущего элемента, это получается последний созданы чексбокс.

Вобщем нужно заменить:

GUICtrlSetState(-1, $GUI_DISABLE)
на
GUICtrlSetState($aRetArr[0], $GUI_DISABLE)

Centrinar
07-05-2010, 17:58
насчет иконок, в этом стиле они вообще не отображаються но если изменить строку $aRetArr[1] на$aRetArr[1] = GUICtrlCreateCheckbox(" " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, $WS_CLIPSIBLINGS) иконки отображаються а надписи и сами чекбоксы нет. С чем то связанно?

Creat0R
07-05-2010, 18:35
С чем то связанно? »
С тем что не нужно использовать этот стиль :)

Centrinar
07-05-2010, 18:44
так без него иконки не отображаюьтся, какой стиль тоогда?

Creat0R
07-05-2010, 19:17
без него иконки не отображаюьтся »
Мы это уже кажется проходили (http://forum.oszone.net/thread-173538.html).

PHP код »
Нужно заключать либо в теги code, либо разукрашивать с Au3ToPost (http://creator-lab.ucoz.ru/load/3-1-0-18).

Centrinar
07-05-2010, 19:28
Я помню, так в этом случ. я никаких картинок не создаю и все элементы создаю в конце

Centrinar
07-05-2010, 19:44
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#requireadmin
#NoTrayIcon

Global $sProgs = 'Setup1.exe=Opera|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
Global $sProgs2 = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

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

Global $anCheckBoxes2[$aProgs2[0]+1]
Global $aCheckedIcons2[$aProgs2[0]+1]
Global $aUnCheckedIcons2[$aProgs2[0]+1]
Global $aCompleteIcons2[$aProgs2[0]+1]
Global $aInstalledIcons2[$aProgs2[0]+1]

GUICreate("My GUI Tab",600,550)
GUISetBkColor(0xFFFFFF)
$nStart = GUICtrlCreateButton("Выполнить", 30, 510, 150, 30)
$tab=GUICtrlCreateTab (10,10, 580,480)
GUISetBkColor(0xFFFFFF)
$tab0=GUICtrlCreateTabitem ("tab0")
GUISetBkColor(0xFFFFFF)
$iTop = 40
$iLeft = 15
For $i = 1 To $aProgs[0]
$aCheckedIcons[$i] = "common\images\01.ico"
$aUnCheckedIcons[$i] = "common\images\01.ico"
$aInstalledIcons[$i] = "common\images\03.ico"
$aCompleteIcons[$i] = "common\images\02.ico"
$sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
$anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15, $aUnCheckedIcons[$i])
$iTop += 80
If $iTop > 480 Then
$iTop = 10
$iLeft += 170
EndIf
Next

$tab1=GUICtrlCreateTabitem ("tab1")
GUISetBkColor(0xFFFFFF)
$iTop = 40
$iLeft = 15
For $s = 1 To $aProgs2[0]
$aCheckedIcons2[$s] = "common\images\01.ico"
$aUnCheckedIcons2[$s] = "common\images\01.ico"
$aInstalledIcons2[$s] = "common\images\03.ico"
$aCompleteIcons2[$s] = "common\images\02.ico"
$anCheckBoxes2[$s] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs2[$s], '^.*=', ''), $iLeft, $iTop, -1, 15, $aUnCheckedIcons2[$s])
$iTop += 40
If $iTop > 480 Then
$iTop = 10
$iLeft += 170
EndIf
Next

GUICtrlCreateTabitem ("")

GUISetState ()

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], $aInstalledIcons[$i])
$sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
$sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')
MsgBox(64, $sProgName, "zz", 3)
GUICtrlSetImage($aCheckBox[0], $aCompleteIcons[$i])
Else
GUICtrlSetImage($aCheckBox[0], $aUnCheckedIcons[$i])
EndIf
Next
For $s = 1 To $aProgs2[0]
$aCheckBox2 = $anCheckBoxes2[$s]
If GUICtrlRead($aCheckBox2[1]) = 1 Then
GUICtrlSetImage($aCheckBox2[0], $aInstalledIcons2[$s])
$sProgName2 = StringRegExpReplace($aProgs2[$s], '^.*=', '')
$sProgExe2 = StringRegExpReplace($aProgs2[$s], '=.*$', '')
MsgBox(64, $sProgName2, "zz", 3)
GUICtrlSetImage($aCheckBox2[0], $aCompleteIcons2[$s])
Else
GUICtrlSetImage($aCheckBox2[0], $aUnCheckedIcons2[$s])
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($aRetArr[0], $GUI_DISABLE)

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

Return $aRetArr
EndFunc

Creat0R
07-05-2010, 19:49
Centrinar, я если честно не улавливаю суть проблемы. Что конкретно ождается от данного примера? и мне нужны изображения чтобы его проверить как следует.

в этом случ. я никаких картинок не создаю и все элементы создаю в конце »
Тогда без стиля всё должно отображаться.

Centrinar
07-05-2010, 19:54
Вот пример, думаю увидешь проблемму

Creat0R
07-05-2010, 20:39
Вот пример, думаю увидешь проблемму »
Да, вижу. С табами проблем хватает :) На данный момент всё что могу предложить так это создание иконки слева от чекбокса (плюс добавил цвет табу, чтобы было соостветствие, а также оптимизировал код).

Centrinar
07-05-2010, 20:42
так ещё лучше

Centrinar
07-05-2010, 22:19
Creat0R может сразу подскажешь как добавляеться Scrollbar(про который я спрашивал пару тем назад), что бы при переполнении чекбоксов можно было в низ листать.

Creat0R
07-05-2010, 23:27
как добавляеться Scrollbar »
[решено] Создать окно с полосой прокрутки (http://forum.oszone.net/thread-145329.html)

и более простой способ: Scrollbars Made Easy (http://www.autoitscript.com/forum/index.php?showtopic=113723)

Centrinar
08-05-2010, 00:47
Получилось: _GUIScrollbars_Generate($hGUI, "", 1000), но если делать в нутри вкладки то не работает _GUIScrollbars_Generate($hTab1, "", 1000).
Его можно какнить во внутрь вкладки засунуть

Creat0R
08-05-2010, 02:08
если делать в нутри вкладки то не работает »
Мда..., придётся извращаться, прикрепил первую форму извращения :drug:

Centrinar
11-05-2010, 17:13
спс




© OSzone.net 2001-2012