Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
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,671
Репутация
2,481
Небольшое обновление. В основном поправки в методе получения фонового цвета GUI.
Версия осталась прежней.
 

Yashied

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
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,724
Ну да, про это. Тогда лучше было бы показать соответствующий пример, а не просто меняющиеся числа...

:whistle:
 
Автор
CreatoR

CreatoR

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

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

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

CreatoR

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

ohos

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

ohos

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

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
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,671
Репутация
2,481
Проще сделать так:

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

joiner

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
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,556
Репутация
628
дело в том, что у меня в окне отображается изображение..нужно чтобы было видно это изображение через label созданный функцией данной библиотеки . или можно в данный label вставить то же изображение?
проблема с мерцание во время частого обновления..частота обновления не должна меняться. вот ищу решение
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
экспериментировал и нашел, вроде как, баг
в первом окне жмем кнопку. появляется второе окно с 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,671
Репутация
2,481
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,556
Репутация
628
библиотеку качал пару дней назад
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 создаются заново.
содержание библиотек разное
 
Верх