Что нового

[Время, дата] Мигание Label-текста на некоторых ПК

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Всем привет и хорошего настроения!

Просьба помочь советом: как убрать мигание текста 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 зависимым от системы, в которой исполняется скрипт. Но как это сделать - пока идей нет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Rioran,
Посмотрите, как реализовано обновление времени в справке, в примере к функции _Timer_SetTimer(). Вместо _Timer_SetTimer() можно использовать AdlibRegister().
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
madmasles, спасибо за быстрый ответ!

Я попробовал решить задачу методом AdlibRegister(). Теперь при обновлении по умолчанию в 250 мс мигание текста я получаю уже на своём ПК. Вручную подкручивать время обновления для каждого пользователя совсем не вариант.

Код:
#include <MsgBoxConstants.au3>
#include <SendMessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <Timers.au3>

global $Label1, $Form1

Global Const $margin = 1
Global Const $SC_DRAGMOVE = 0xF012

Example()

Func Example()

   ;Local $Timer

   #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("Check", 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")

    ; Register the function MyAdLibFunc() to be called every 250ms (default).
    AdlibRegister("MyAdLibFunc")

   While 1
	  Switch GUIGetMsg()
		 Case $GUI_EVENT_SECONDARYDOWN
			Exit
		 Case $GUI_EVENT_PRIMARYDOWN
			_SendMessage($Form1, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
	  EndSwitch
   WEnd

   AdlibUnRegister("MyAdLibFunc")

EndFunc   ;==>Example

Func MyAdLibFunc()
	  $Timer = _nowtime()
	  GUICtrlSetData($label1, $Timer)
 EndFunc   ;==>MyAdLibFunc

 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
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
Func MyAdLibFunc()
	$Timer = _nowtime()
	
	If GUICtrlRead($label1) <> $Timer Then
		GUICtrlSetData($label1, $Timer)
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Я бы примерно так сделал.
Код:
Func MyAdLibFunc()
	Local Static $s__Time
	Local $sTimer = _NowTime()
	If $s__Time <> $sTimer Then
		$s__Time = $sTimer
		GUICtrlSetData($label1, $s__Time)
	EndIf
EndFunc   ;==>MyAdLibFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Я бы примерно так сделал
Да, хорошая идея:

Код:
#include <GUIConstantsEx.au3>
#include <Date.au3>

$hGUI = GUICreate('_GUICtrlSetDataEx Demo', 100, 100)
$iLabel = GUICtrlCreateLabel('', 20, 40, 80, 20)
GUISetState(@SW_SHOW, $hGUI)

AdlibRegister('_Set_Time')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Set_Time()
	_GUICtrlSetDataEx($iLabel, _NowTime())
EndFunc

Func _GUICtrlSetDataEx($iCtrlID, $sData)
	Local Static $sText = GUICtrlRead($iCtrlID)
	
	If $sData <> $sText Then
		$sText = $sData
		GUICtrlSetData($iCtrlID, $sData)
	EndIf
EndFunc
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
CreatoR, madmasles, спасибо за варианты!

Проверка значения времени на изменение - простое и элегантное решение. Уверен, должно решить задачу или хотя бы оставить мигание только при смене значения секунд. Что приемлемо. Опробовать "на кошках" смогу вечером.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Rioran [?]
Проверка значения времени на изменение
Возвращаемое функцией _NowTime() значение изменяется раз в секунду. Другими словами, раз в секунду вы гарантированно получаете новое значение. Зачем его с чем-то сравнивать?
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Предварительно версия для вечернего тестирования выглядит так:

Код:
#include <SendMessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

;Скрипт для отображения текущего времени системы поверх остальных программ.
;Версия 1.05 от 24 марта 2015, автор: Роман Rioran Воронов
;С использованием механизма Koda и при поддержке http://autoit-script.ru/

Global $TimerA	;Для отслеживания значения label.
Global $TimerB	;Для значения текущего времени.
Global $Form	;Создаваемая форма.
Global $Label	;Создаваемый label.

Global Const $margin = 1			;Кол-во пикселей от границы формы (для перетаскивания формы по экрану)
Global Const $SC_DRAGMOVE = 0xF012	;Системная константа для работы с кодовыми сообщениями Windows.

#Region ### START Rioran GUI section ### Form=
   ;Создаваемая форма будет поверх всех окон системы, без шапки Windows, с моим любимым шрифтом.
   $Form = GUICreate("Form1", 100, 30, 10, 10, BitOR($WS_POPUP, $WS_POPUPWINDOW), $WS_EX_TOPMOST)
   GUISetFont(14, 0, 0, "Verdana")
   ;Создаётся лэйбл, одноразмерный с формой, текст внутри центрируется по Х и У осям.
   $Label = GUICtrlCreateLabel("Hello!", 0, 0, 100, 30, BitOR($SS_CENTER,$SS_CENTERIMAGE))
   GUISetState(@SW_SHOW)
#EndRegion ### END Rioran GUI section ###

   ;Привязка сообщений к фукнциям.
   GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
   GUIRegisterMsg($WM_RBUTTONDOWN, "WM_RBUTTONDOWN")
   GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")

;Назначение точки входа, регулярный запуск функии.
AdlibRegister("_Time_Roll", 100)

;Цикл для обработки сообщений.
While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_SECONDARYDOWN
         Exit
      Case $GUI_EVENT_PRIMARYDOWN
         _SendMessage($Form, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
   EndSwitch
WEnd

;Точка входа программы, обновление времени на лэйбле.
Func _Time_Roll()
   $TimerA = GUICtrlRead($Label)
   $TimerB = _nowtime()
   If $TimerA <> $TimerB Then
      GUICtrlSetData($label, $TimerB)
   EndIf
EndFunc

;Вычисление параметров курсора.
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

;Назначение параметров курсора.
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

;Обработка события "удержание ЛКМ".
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


InnI, звучит логично. Этот вариант тоже подготовлю для тестирования.

Раньше использовал Sleep(), так как не знал про AdlibRegister(). Вопрос вскользь: если у меня в главном цикле нет "сна", я не убью процессор нагрузками, отслеживая кодовые сообщения?

Код:
#include <SendMessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

;Скрипт для отображения текущего времени системы поверх остальных программ.
;Версия 1.06 от 24 марта 2015, автор: Роман Rioran Воронов
;С использованием механизма Koda и при поддержке http://autoit-script.ru/

;1.06: в отличие от версии 1.05, обращение к _Time_Roll раз в секунду,
;Значение лэйбла не проверяется, а обновляется принудительно.

Global $TimerA	;Для отслеживания значения label.
Global $TimerB	;Для значения текущего времени.
Global $Form	;Создаваемая форма.
Global $Label	;Создаваемый label.

Global Const $margin = 1			;Кол-во пикселей от границы формы (для перетаскивания формы по экрану)
Global Const $SC_DRAGMOVE = 0xF012	;Системная константа для работы с кодовыми сообщениями Windows.

#Region ### START Rioran GUI section ### Form=
   ;Создаваемая форма будет поверх всех окон системы, без шапки Windows, с моим любимым шрифтом.
   $Form = GUICreate("Form1", 100, 30, 10, 10, BitOR($WS_POPUP, $WS_POPUPWINDOW), $WS_EX_TOPMOST)
   GUISetFont(14, 0, 0, "Verdana")
   ;Создаётся лэйбл, одноразмерный с формой, текст внутри центрируется по Х и У осям.
   $Label = GUICtrlCreateLabel("Hello!", 0, 0, 100, 30, BitOR($SS_CENTER,$SS_CENTERIMAGE))
   GUISetState(@SW_SHOW)
#EndRegion ### END Rioran GUI section ###

   ;Привязка сообщений к фукнциям.
   GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
   GUIRegisterMsg($WM_RBUTTONDOWN, "WM_RBUTTONDOWN")
   GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")

;Назначение точки входа, регулярный запуск функии.
AdlibRegister("_Time_Roll", 1000)

;Цикл для обработки сообщений.
While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_SECONDARYDOWN
         Exit
      Case $GUI_EVENT_PRIMARYDOWN
         _SendMessage($Form, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
   EndSwitch
WEnd

;Точка входа программы, обновление времени на лэйбле.
Func _Time_Roll()
   GUICtrlSetData($label, _nowtime())
EndFunc

;Вычисление параметров курсора.
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

;Назначение параметров курсора.
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

;Обработка события "удержание ЛКМ".
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
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Rioran [?]
если у меня в главном цикле нет "сна"
Из справки к функции GUIGetMsg() [box]Эта функция вставляет задержку эквивалентную Sleep(10), достаточную для быстрого отклика интерфейса и в тоже время снижает нагрузку на процессор, уменьшая количество вызовов в секунду при работе в цикле.[/box]
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
InnI, благодарю. Справка - настоящий кладезь знаний, ставлю себе задачу научиться ей пользоваться с максимальной эффективностью =)

Однако, в справке нет уточнения про длительность вставляемых "слипов". Только общие слова о прогоне процессора "на холостом ходу" при отсутствии задач в очереди. И что не стоит (а я так по началу сделал) вручную вставлять ожидание в цикл, иначе графический интерфейс может зависнуть.

Отрывок из справки:
Usually a tight loop like the one shown would send the CPU to 100% - fortunately the GUIGetMsg function automatically idles the CPU when there are no events waiting. Do not put a manual sleep in the loop for fear of stressing the CPU - this will only cause the GUI to become unresponsive.


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

Оба моих варианта из сообщения № 8 на домашнем ноутбуке продолжают мигать цифрами при смене секунд. Предположу, что в момент обновления значения лэйбла значение сначала стирается - а потом прогружается новое. Время операции достаточно большое для того, чтобы мигание было заметно.

Есть две идеи, которые сейчас попробую. Любые идеи приветствуются.

1). Не очень так себе идея. Создавать 2 лэйбла и, после смены значения на лэйбле дальнего слоя, переносить его на ближний слой относительно лэйбла с устаревшим значением.

2). Изящное решение. Попробовать отключить обновление экрана, но не всех программ а только для формы. Сменить значение и далее включить обновление. В VBA аналогичная операция для конкретного приложения, например, делается строкой:

Код:
Application.ScreenUpdating = False


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

Применил @SW_LOCK / @SW_UNLOCK, на моей машине вопрос решен. Жду результатов тестирования от пользователей, но предчувствие уже хорошее.


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

Всем спасибо, вопрос решён с помощью идеи о блокировке перерисовки формы на время смены значения. В ходе обсуждения архитектура была значительно улучшена советами благородных форумчан =) Версию скрипта без мигания текста прикладываю для истории:

Код:
#include <SendMessage.au3>
#include <GuiConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>

;Скрипт для отображения текущего времени системы поверх остальных программ.
;Версия 1.07 от 24 марта 2015, автор: Роман Rioran Воронов
;С использованием механизма Koda и при поддержке http://autoit-script.ru/

;1.07: решение версии 1.06 не помогло, но улучшило архитектуру.
;В этой версии вопрос был решен отключением перерисовки формы на время смены значения.
;1.06: в отличие от версии 1.05, обращение к _Time_Roll раз в секунду,
;Значение лэйбла не проверяется, а обновляется принудительно.

Global $TimerA  ;Для отслеживания значения label.
Global $TimerB  ;Для значения текущего времени.
Global $Form    ;Создаваемая форма.
Global $Label   ;Создаваемый label.

Global Const $margin = 1            ;Кол-во пикселей от границы формы (для перетаскивания формы по экрану)
Global Const $SC_DRAGMOVE = 0xF012  ;Системная константа для работы с кодовыми сообщениями Windows.

#Region ### START Rioran GUI section ### Form=
   ;Создаваемая форма будет поверх всех окон системы, без шапки Windows, с моим любимым шрифтом.
   $Form = GUICreate("Form1", 100, 30, 10, 10, BitOR($WS_POPUP, $WS_POPUPWINDOW), $WS_EX_TOPMOST)
   GUISetFont(14, 0, 0, "Verdana")
   ;Создаётся лэйбл, одноразмерный с формой, текст внутри центрируется по Х и У осям.
   $Label = GUICtrlCreateLabel("Hello!", 0, 0, 100, 30, BitOR($SS_CENTER,$SS_CENTERIMAGE))
   GUISetState(@SW_SHOW)
#EndRegion ### END Rioran GUI section ###

   ;Привязка сообщений к фукнциям.
   GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
   GUIRegisterMsg($WM_RBUTTONDOWN, "WM_RBUTTONDOWN")
   GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")

;Назначение точки входа, регулярный запуск функии.
AdlibRegister("_Time_Roll", 1000)

;Цикл для обработки сообщений.
While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_SECONDARYDOWN
         Exit
      Case $GUI_EVENT_PRIMARYDOWN
         _SendMessage($Form, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
   EndSwitch
WEnd

;Точка входа программы, обновление времени на лэйбле.
Func _Time_Roll()
   GUISetState(@SW_LOCK)
   GUICtrlSetData($label, _nowtime())
   GUISetState(@SW_UNLOCK)
EndFunc

;Вычисление параметров курсора.
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

;Назначение параметров курсора.
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

;Обработка события "удержание ЛКМ".
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
 
Верх