Что нового

GUIFFLabel - Предотвращение эффекта мерцания

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
AutoIt: 3.3.8.1
Версия: 1.1

Категория: Элементы GUI

Описание: Создание Label'ов с предотвращением “эффекта мерцания” при частом обновлений элемента. Используется GDI+.

Код/Пример:
Код:
#include <GUIConstantsEx.au3>
#include "GUIFFLabel.au3"

_Example()

Func _Example2()
	Local $hGUI, $Label1, $Label2, $Label3, $nDel_Button
	
	$hGUI = GUICreate("Flicker Free Labels - Example 2", 400, 220)
	
	$Label1 = _GUICtrlFFLabel_Create($hGUI, "Label One", 80, 40, 200, 17)
	$Label2 = _GUICtrlFFLabel_Create($hGUI, "Label Two", 80, 80, 200, 17, 9, 'Times', 1, 0, 0xFF0000)
	$Label3 = _GUICtrlFFLabel_Create($hGUI, "Label Three", 80, 120, 200, 17)
	
	$nDel_Button = GUICtrlCreateButton("Delete (2)", 150, 180, 110, 20)
	
	GUISetState(@SW_SHOW)
	
	;_GUICtrlFFLabel_GUISetBkColor(0xC0C0C0, $hGUI)
	;_GUICtrlFFLabel_SetAutoRefreshMode(False) ;Disable auto-refresh of all labels
	
	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUIDelete($hGUI)
				Return
			Case $nDel_Button
				_GUICtrlFFLabel_Delete($Label2)
			Case Else
				_GUICtrlFFLabel_SetData($Label1, "Label One     = " & Random(1, 100000), 0xD4D4D4)
				_GUICtrlFFLabel_SetData($Label2, "Label Two     = " & Random(1, 100000))
				_GUICtrlFFLabel_SetData($Label3, "Label Three  = " & Random(1, 100000))
		EndSwitch
	WEnd
EndFunc

Файл: GUIFFLabel

Снимок:


История версий:
1.1
* Глобальные изменения в библиотеке.
* Изменён порядок параметров в функции _GUICtrlFFLabel_GUISetBkColor ($nBkColor, $hWnd = -1).
* Изменены примере.
* Обновление документации (комментарии в заголовке библиотеки).

1.0
Первая версия

Источник: autoitscript.com/forum
Автор(ы): Brian J Christy, G.Sandler
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Небольшое обновление. В основном поправки в методе получения фонового цвета GUI.
Версия осталась прежней.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Может я чего и не понимаю, но не проще ли сделать отдельно Label для статического текста и отдельно для динамического (тот, который нужно обновлять), а после этого использовать GUICtrlSetData()?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Yashied [?]
не проще ли сделать отдельно Label для статического текста и отдельно для динамического (тот, который нужно обновлять), а после этого использовать GUICtrlSetData()?
Всмысле?
Пример можешь показать?


Добавлено:
Сообщение автоматически объединено:

Ты про это:

Код:
#include <GUIConstantsEx.au3>

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

$nStatic_Label = GUICtrlCreateLabel("Data:", 20, 40, -1, 20)
$nDynamic_Label = GUICtrlCreateLabel("", 60, 40, 260, 20)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case Else
			GUICtrlSetData($nDynamic_Label, Random(1, 100, 2))
	EndSwitch
WEnd


?


Добавлено:
Сообщение автоматически объединено:

Если да, то это не совсем выход, иногда нужно читать данные с файла (например), или с друго источника.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Ну да, про это. Тогда лучше было бы показать соответствующий пример, а не просто меняющиеся числа...

:whistle:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Yashied [?]
лучше было бы показать соответствующий пример, а не просто меняющиеся числа
До сих пор было трудно вспомнить для чего оно нужно :laugh:

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

Я очень хотел бы узнать как при такой ситуаций выкручиваться без особых телодвижений (и без этой библиотеки).
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Zaramot [?]
В том что тут используется GDI+ для рисования Label'ов, а там просто стиль $WS_EX_COMPOSITED, который не работает в Win7 (надо бы заметку добавить туда).
 

ohos

Новичок
Сообщения
47
Репутация
0
в таком случае для корректной работы скриптика на Win 7 и Win XP придется писать переключалку в коде, которая будет с лейблом работать в зависимости от операционки?
 

ohos

Новичок
Сообщения
47
Репутация
0
Возникла проблема исчезновения текста GUIF лейбла при сворачивании и разворачивании окна.

При сворачивании установлен статичный текст, после разворачивания его нет. Как только будет установлен новый текст, он появится. Как решить эту проблему?
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 146
ohos
Например с помощью WM_ACTIVATE

Код:
Global $k=0
$Gui = GUICreate("Сверни окно или активируй другое", 390, 140)
GUISetState()
GUIRegisterMsg(0x0006 , "WM_ACTIVATE")

Do
Until GUIGetMsg() = -3

Func WM_ACTIVATE()
	$k+=1
	WinSetTitle($Gui, '', 'Изменено состояние ' &$k& ' раз')
EndFunc
 

ohos

Новичок
Сообщения
47
Репутация
0
благодарю, использовал

Код:
GUIRegisterMsg(0x0006 , "WM_ACTIVATE")


в функцию вставил

Код:
Func WM_ACTIVATE()
        sleep(100)
	_GUICtrlFFLabel_Refresh(хэндл тут)
EndFunc


без задержки не перерисовывается...

p.s. иногда сталкивался с проблемой, что цвет фона лейбла на GUIFF оказывался другим (либо темно серым на XP, либо темно синим на 7 - что соответствует цвету фону, который обычно остается от окна при подвисании), решил проблему просто, в файле GUIFFLabel.au3 подправил строку, вместо

Код:
Global $nDef_GUI_Bk_Color = __GUICtrlFFLabel_GetWindowBkColor()


использовал явный цвет

Код:
Global $nDef_GUI_Bk_Color = 0xF0F0F0 ;стандартный серый


:IL_AutoIt_1:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
Проще сделать так:

Код:
While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				...
			Case $GUI_EVENT_RESTORE
				__GUICtrlFFLabel_RefreshAll()
			...
		EndSwitch
	WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
как сделать фон прозрачным, используя функции данной библиотеки. по типу $GUI_BKCOLOR_TRANSPARENT
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
joiner [?]
как сделать фон прозрачным, используя функции данной библиотеки. по типу $GUI_BKCOLOR_TRANSPARENT
ИМХО, если Вы не используете функцию GUISetBkColor(), то и в функции _GUICtrlFFLabel_SetData() третий параметр ($iBackGround) нужно оставить по умолчанию, если используете, то, можно примерно так:
Код:
#include <GUIConstantsEx.au3>
#include "GUIFFLabel.au3"

_Example()

Func _Example()
	Local $hGUI, $Label1, $Label2, $Label3, $iCount, $bBKColor = 0x00FFFF

	$hGUI = GUICreate("Flicker Free Labels", 400, 220)
	GUISetBkColor($bBKColor)

	$Label1 = _GUICtrlFFLabel_Create($hGUI, "Label One", 80, 40, 200, 17)
	$Label2 = _GUICtrlFFLabel_Create($hGUI, "Label Two", 80, 80, 200, 17, 9, 'Times', 1, 0, 0xFF0000)
	$Label3 = _GUICtrlFFLabel_Create($hGUI, "Label Three", 80, 120, 200, 17)

	$nDel_Button = GUICtrlCreateButton("Delete (2)", 150, 180, 110, 20)
	GUISetState()
	_GUICtrlFFLabel_GUISetBkColor($hGUI, $bBKColor)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUIDelete($hGUI)
				Return
			Case $nDel_Button
				_GUICtrlFFLabel_Delete($Label2)
			Case Else
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label1, "Label One     = " & $iCount, $bBKColor)
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label2, "Label Two     = " & $iCount, $bBKColor)
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label3, "Label Three  = " & $iCount, $bBKColor)
		EndSwitch
	WEnd
EndFunc   ;==>_Example
 

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
дело в том, что у меня в окне отображается изображение..нужно чтобы было видно это изображение через label созданный функцией данной библиотеки . или можно в данный label вставить то же изображение?
проблема с мерцание во время частого обновления..частота обновления не должна меняться. вот ищу решение
 

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
экспериментировал и нашел, вроде как, баг
в первом окне жмем кнопку. появляется второе окно с label. гасим это второе окно. жмем опять кнопку в первом окне..появляется второе окно, а элементы label не создаются.
Код:
#include <GUIConstantsEx.au3>
#include "GUIFFLabel.au3"
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 332, 176, 192, 124)
$Button1 = GUICtrlCreateButton("Button1", 112, 56, 75, 25)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_Example()
	EndSwitch
WEnd

Func _Example()
	Local $hGUI, $Label1, $Label2, $Label3, $iCount

	$hGUI = GUICreate("Flicker Free Labels", 400, 220)

	$Label1 = _GUICtrlFFLabel_Create($hGUI, "Label One", 80, 40, 200, 17)
	$Label2 = _GUICtrlFFLabel_Create($hGUI, "Label Two", 80, 80, 200, 17, 9, 'Times', 1, 0)
	$Label3 = _GUICtrlFFLabel_Create($hGUI, "Label Three", 80, 120, 200, 17)

	$nDel_Button = GUICtrlCreateButton("Delete (2)", 150, 180, 110, 20)

	GUISetState(@SW_SHOW)

	_GUICtrlFFLabel_GUISetBkColor($hGUI, 0xAE9C86)
	_GUICtrlFFLabel_SetAutoRefreshMode(False) ;Disable auto-refresh of all labels

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				GUIDelete($hGUI)
				Return
			Case $nDel_Button
				_GUICtrlFFLabel_Delete($Label2)
			Case Else
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label1, "Label One     = " & $iCount)
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label2, "Label Two     = " & $iCount)
				$iCount = Random(1, 100000)
				_GUICtrlFFLabel_SetData($Label3, "Label Three  = " & $iCount)
		EndSwitch
	WEnd
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
joiner
При создании элементов "label" там еще такая странность: функции возвращают индексы +1; +2; +3; в зависимости от их предыдущего значения, т.е. в UDF счетчик который скорее всего требуется обнулять(ну чисто моя мысль только :smile:)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
joiner [?]
в первом окне жмем кнопку. появляется второе окно с label. гасим это второе окно. жмем опять кнопку в первом окне..появляется второе окно, а элементы label не создаются
Какая версия библиотеки и AutoIt?

И ещё, Labl'ы желательно удалять вместе с GUI, т.к это не стандартные элементы (это графика вообще то).

Ну и также в целях профилактики, можно изменить функцию:

Код:
Func _GUICtrlFFLabel_RefreshAll()
	For $i = 1 To $a_GFFL_GDILbls[0][0]
		If IsHWnd($a_GFFL_GDILbls[$i][$h_GFFL_Wnd]) Then
			_GUICtrlFFLabel_Refresh($i)
		EndIf
	Next
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3 046
Репутация
511
библиотеку качал пару дней назад
AutoIT 3.3.8.1
_GUICtrlFFLabel_Delete (всех) указал при закрытии второго окна
Код:
Case $GUI_EVENT_CLOSE
				_GUICtrlFFLabel_Delete($Label1)
				_GUICtrlFFLabel_Delete($Label2)
				_GUICtrlFFLabel_Delete($Label3)
                GUIDelete($hGUI)
                Return



Добавлено:
Сообщение автоматически объединено:

CreatoR
зашел на официальный форум http://www.autoitscript.com/forum/topic/130032-flicker-free-labels/?hl=%20guifflabel
скачал последнюю версию . там, правда, библиотека называется FFLabels
запустил свой пример и при закрытии и повторном запуске второго окна label создаются заново.
содержание библиотек разное
 
Верх