Что нового

Мерцание элемента GUI (Label) при записи в него строки

Greyzer

Новичок
Сообщения
28
Репутация
0
Здравствуйте! Проблема собственно в теме. Выглядит это как-то так:


При нажатии на кнопку захожу в цикл, отслеживаю появление сообщения WM_COMMAND и записываю строковое значение из другой программы в свою, в элемент Label.
Код обработки нажатия на кнопку:
Код:
Func MeasureProc()
	Local $Waiting
	WinWait($DistoTitle, "BT DISTO D8 23730427")
	$Waiting = True
	$CurrentTab = SwitchDistoTabs("Functions")
	$IsChecked = ControlCommand($2_hwnd, "Execute automatically measurement in the following interval :", "[CLASS:Button; INSTANCE:2; ID:1073]", "IsChecked", "")
	If $IsChecked = 0 Then
		ControlCommand($2_hwnd, "Execute automatically measurement in the following interval :", "[CLASS:Button; INSTANCE:2; ID:1073]", "Check", "")
	EndIf

	While $Waiting 
		GUIRegisterMsg(0x0111, 'WM_COMMAND')
		$GUI_get_msg = GUIGetMsg()
		If $Flag_WM_CMD = 1 Then
			$Waiting = False
		EndIf

		$TextFromEdit = ControlGetText($DistoTitle, "", "[CLASS:Edit; INSTANCE:1; ID:1103]") ; Edit ID = 1103

		If $TextFromEdit <> "0" Then
			GUICtrlSetData($Lbl_For_Msrmnts, $TextFromEdit)
		EndIf

		If $Flag_WM_CMD = 1 Then
			$Waiting = False
		EndIf

	WEnd
EndFunc
Подскажите, пожалуйста, с чем это может быть связано и можно ли это устранить как-нибудь?
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Возможно так поможет:
Код:
$GUI_get_msg = GUIGetMsg()
; заменить на
Sleep(10)
; и вытащить из цикла (поставить выше while)
GUIRegisterMsg(0x0111, 'WM_COMMAND')
 
Автор
G

Greyzer

Новичок
Сообщения
28
Репутация
0
Z_Lenar, спасибо, но не сработало. Вообще попробовал убрать обработку сообщений, оставив только запись строки. Мерцать стало еще сильнее...
Код:
Func MeasureProc()
	Local $Waiting
	WinWait($DistoTitle, "BT DISTO D8 23730427")
	$Waiting = True
	$CurrentTab = SwitchDistoTabs("Functions")
	$IsChecked = ControlCommand($2_hwnd, "Execute automatically measurement in the following interval :", "[CLASS:Button; INSTANCE:2; ID:1073]", "IsChecked", "")
	If $IsChecked = 0 Then
		ControlCommand($2_hwnd, "Execute automatically measurement in the following interval :", "[CLASS:Button; INSTANCE:2; ID:1073]", "Check", "")
	EndIf
	While $Waiting
		$TextFromEdit = ControlGetText($DistoTitle, "", "[CLASS:Edit; INSTANCE:1; ID:1103]") ; Edit ID = 1103
		If $TextFromEdit <> "0" Then
			GUICtrlSetData($Lbl_For_Msrmnts, $TextFromEdit)
		EndIf
	WEnd
EndFunc
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Код:
Do
    Sleep(1)
Until GUIGetMsg() = 0
; или
#include <WindowsConstants.au3>
#include <SendMessage.au3>

_SendMessage($WM_PAINT, Null)
Возможно так поможет. У AutoIt обработчик сообщений по своему сделан.
 
Автор
G

Greyzer

Новичок
Сообщения
28
Репутация
0
Т.е. сдается мне, что
Код:
GUICtrlSetData($Lbl_For_Msrmnts, $TextFromEdit)

в цикле дает такой эффект, заставляя отрисовывать элемент Label каждый раз по-новой?
Т.е. возможно есть стиль элемента, который позволяет с этим бороться?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Greyzer
Иногда такое помогает:
Код:
$tmp = 0
While $Waiting 
; ......................
If $TextFromEdit <> $tmp Then ; Не досим если значение не изменилось
	$tmp = $TextFromEdit
	GUICtrlSetData($Lbl_For_Msrmnts, $TextFromEdit)
EndIf
 
Верх