Что нового

[Элементы GUI] Исчезает прогресс бар после разворачивания окна

Luke

Знающий
Сообщения
64
Репутация
14
Подскажите что надо исправить или добавить в следующем коде чтобы не исчезал прогресс бар после сворачивания-разворачивания окна.
Код:
#include <Inet.au3>
#include <Array.au3>
#include <_XMLDomWrapper.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)
Global $Host[1][1], $ip[1]
Dim $MyPublicIP = _GetIP()

#Region ### START Koda GUI section ### Form=D:\development\nmap_GUI\Nmap_Scan.kxf
Global $Nmap_Scan = GUICreate("Nmap_Scan", 633, 447, -1, -1)
; ...
Global $StatusBar1 = _GUICtrlStatusBar_Create($Nmap_Scan)
Global $StatusBar1_PartsWidth[3] = [160, 520, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "Part 1", 0)
_GUICtrlStatusBar_SetText($StatusBar1, "Part 2", 1)
_GUICtrlStatusBar_SetText($StatusBar1, @TAB & "Part 3", 2)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;дальше рисую гуи без коды
_GUICtrlStatusBar_SetText($StatusBar1, @TAB & $MyPublicIP, 2)
; Встраиваю progress bar в статус бар
Global $progress = GUICtrlCreateProgress(0, 0, -1, -1)
Global $hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 0, $hProgress)

While 1
	Sleep(300)
WEnd
;...


Кстати в Koda не нашел как вставить прогресс бар в статус бар
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Видимо бага, т.к в справке пример для «_GUICtrlStatusBar_EmbedControl» тоже вызывает это поведение.

Лечится перемещением элемента прогресс-бара на своё место:

Код:
; ...

Global $Nmap_Scan = GUICreate("Nmap_Scan", 633, 447, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_Events")
GUISetOnEvent($GUI_EVENT_RESTORE, "_GUI_Events")

; ...

Global $progress = GUICtrlCreateProgress(0, 0, -1, -1)
Global $hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 0, $hProgress)
GUICtrlSetPos($progress, 0, 4, 155, 21)


While 1
    Sleep(100)
WEnd

Func _GUI_Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_RESTORE
			GUICtrlSetPos($progress, 0, 4, 155, 21)
	EndSwitch
EndFunc

; ...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это не бага, а скорее особенность поведения GUI в AutoIt. Гарантированно нормально ведут себя лишь элементы, созданные с помощью GUICtrl... функций. IMHO это расплата за относительно простую работу с GUI в AutoIt.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Это не бага, а скорее особенность поведения GUI в AutoIt
Не вижу ничего особенного в том что элементы исчезают при определённых обстоятельствах :smile:.

Гарантированно нормально ведут себя лишь элементы, созданные с помощью GUICtrl... функций
Ну вообще то это наш случай, правда обращение с этими эленетами делается UDF'ными функциями...


это расплата за относительно простую работу с GUI в AutoIt
Может и так, но не думаю что пример в справке должен вызывать такое поведение, тем более не ожидаемое. Я лично придерживаюсь к такому мнению - раз уж разработчики взялись за поддержку простоты использования всего что связанно с GUI, значит они должны продолжать и полировать эту поддержку, а не "кричать" о том что “в оригинале на самом деле всё сложнее т.ч скажите и на том спасибо”.
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Спасибо разобрался, это баг связанный с тем что при первоначальной отрисовке встроенного контрола используются абсолютные координаты (они же возвращаются функцией ControlGetPos), а для дальнейшей правильной отрисовки встроенного контрола после разворачивания окна или используя GUICtrlSetPos нужны относительные координаты (начало координат - родительский контрол )

Код:
; ...
Global $Nmap_Scan = GUICreate("Nmap_Scan", 633, 447, -1, -1)
GUISetOnEvent($GUI_EVENT_RESTORE, "Nmap_ScanRestore")
; ...
Global $StatusBar1 = _GUICtrlStatusBar_Create($Nmap_Scan)
; ...
Global $progress = GUICtrlCreateProgress(0, 0, -1, -1)
Global $hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 0, $hProgress)
Global $PosProgress=ControlGetPos( "", "", $progress)
Global $PosStatusBar1=ControlGetPos( "", "", $StatusBar1)

While 1
	Sleep(300)
WEnd

Func Nmap_ScanRestore()
GUICtrlSetPos ($progress,$PosProgress[0]-$PosStatusBar1[0],$PosProgress[1] - $PosStatusBar1[1],$PosProgress[2],$PosProgress[3])
EndFunc   ;==>Nmap_ScanRestore
; ...
 
Верх