Rioran
Everything is possible and achievable.
- Сообщения
- 26
- Репутация
- 2
Всем привет и хорошего настроения!
Просьба помочь советом: как убрать мигание текста label при обновлении оного для отображения текущего времени?
Написал выложенный ниже скрипт для отображения текущего времени в компьютерной игре, где этого не хватает. Окошко времени передвигается левой кнопкой мыши по экрану, по нажатию правой кнопкой мыши программа завершается. Однако при определённой частоте обновления label цифры начинают мигать. Для своего ПК подобрал sleep(40), имитируя fps = 25. Предложил протестировать друзьям - оказалось, что на разных машинах это значение задержки все-равно дает раздражающий визуальный эффект.
Предположу, что возможно поможет: сделать значение fps зависимым от системы, в которой исполняется скрипт. Но как это сделать - пока идей нет.
Просьба помочь советом: как убрать мигание текста label при обновлении оного для отображения текущего времени?
Написал выложенный ниже скрипт для отображения текущего времени в компьютерной игре, где этого не хватает. Окошко времени передвигается левой кнопкой мыши по экрану, по нажатию правой кнопкой мыши программа завершается. Однако при определённой частоте обновления label цифры начинают мигать. Для своего ПК подобрал sleep(40), имитируя fps = 25. Предложил протестировать друзьям - оказалось, что на разных машинах это значение задержки все-равно дает раздражающий визуальный эффект.
Код:
#include <SendMessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
global $Timer
Global Const $margin = 1
Global Const $SC_DRAGMOVE = 0xF012
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 100, 30, 10, 10, BitOR($WS_POPUP, $WS_POPUPWINDOW), $WS_EX_TOPMOST)
GUISetFont(14, 0, 0, "Verdana")
$Label1 = GUICtrlCreateLabel("_Now()", 0, 0, 100, 30, BitOR($SS_CENTER,$SS_CENTERIMAGE))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
GUIRegisterMsg($WM_RBUTTONDOWN, "WM_RBUTTONDOWN")
GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
While 1
$Timer = _nowtime()
GUICtrlSetData($label1, $Timer)
sleep(40)
Switch GUIGetMsg()
Case $GUI_EVENT_SECONDARYDOWN
Exit
Case $GUI_EVENT_PRIMARYDOWN
_SendMessage($Form1, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndSwitch
WEnd
Func GetMousePosType()
Local $cp = GUIGetCursorInfo()
Local $wp = WinGetPos($Gui)
Local $side = 0
Local $TopBot = 0
Local $curs
If $cp[0] < $margin Then $side = 1
If $cp[0] > $wp[2] - $margin Then $side = 2
If $cp[1] < $margin Then $TopBot = 3
If $cp[1] > $wp[3] - $margin Then $TopBot = 6
Return $side + $TopBot
EndFunc ;==>GetMousePosType
Func SetCursor()
Local $curs
If GUICtrlRead($chk1) <> $GUI_CHECKED Then Return
Switch GetMousePosType()
Case 0
$curs = 2
Case 1, 2
$curs = 13
Case 3, 6
$curs = 11
Case 5, 7
$curs = 10
Case 4, 8
$curs = 12
EndSwitch
GUISetCursor($curs, 1)
EndFunc ;==>SetCursor
Func WM_LBUTTONDOWN($hWnd, $iMsg, $StartWIndowPosaram, $lParam)
If GUICtrlRead($chk1) <> $GUI_CHECKED Then Return $GUI_RUNDEFMSG
Local $drag = GetMousePosType()
If $drag > 0 Then
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF000 + $drag, "int", 0)
EndIf
EndFunc ;==>WM_LBUTTONDOWN
Предположу, что возможно поможет: сделать значение fps зависимым от системы, в которой исполняется скрипт. Но как это сделать - пока идей нет.