1

Тема: AHK: Обновление Static контрола

При обновлении текста контрола заметны его мелькания, с Edit такого не возникает. 3 контрол без BackgroundTrans мелькает немножко меньше, вроде как.
С ControlSetText не мелькает, но не обновляется прежний текст (можно его обновить перетащив окно за край экрана).
Как бы так менять текст без мельканий?

Gui, +AlwaysOnTop
Gui, Font, s22
Gui, Color, 0xE8ECF6 
Gui, Add, Text, w400 +0x201 hwndhText1 +BackgroundTrans +Border
Gui, Add, Text, wp +0x201 +BackgroundTrans +Border hwndhText2
Gui, Add, Text, wp +0x201 hwndhText3 +Border  
Gui, Add, Edit, wp +0x201 hwndhText4
Gui, Show

Loop   
	{ 
		Text := A_TickCount 
		ControlSetText, , % Text, ahk_id %hText1%
		; WM_SETTEXT работает также как и ControlSetText
		; SendMessage, 0x000C, 0, &Text, , ahk_id %hText1%		;	WM_SETTEXT
		GuiControl, , % hText2 , % Text 
		GuiControl, , % hText3 , % Text 
		GuiControl, , % hText4 , % Text 
	}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Обновление Static контрола

Не знаю, проблема ли в AHK или в самом виндовом апи, но на забугорном сайте был примерно такой же вопрос.
Человек делал слайд-шоу из картинок, и мерцание было заметно на лицо(каждая 2-3 картинка мерцала, 10 fps в среднем). Было два варианта решения: использовать gdi+, что и сделал автор вопроса, либо использовать двойную буферизацию(не вспомню, как выглядел код).

3

Re: AHK: Обновление Static контрола

С gdi не вариант, в нём при работе с текстом много кода, и надо писать в обычном окне, в контроле с прозрачностью.
Буферизация в таком контексте мне ни о чём не говорит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Обновление Static контрола

Через hDC?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Обновление Static контрола

Это когда WM_CTLCOLORSTATIC отлавливать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Обновление Static контрола

Создаём hMDC с нужным фоном и текстом, копируем в hDC контрола.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Обновление Static контрола

А как создать фон, если в окне фоном является картинка, а для контрола фоном является какая то часть этой картинки.
И если работать с hDC то надо отслеживать перерисовку и обновлять, при таком способе тоже бывают мелькания.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

а для контрола фоном является какая то часть этой картинки.

А в чём проблема взять часть картинки?
При использовании BitBlt мельканий не наблюдал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Обновление Static контрола

teadrinker пишет:

А в чём проблема взять часть картинки?

Надо знать какая картинка на фоне, отслеживать её смену.

teadrinker пишет:

При использовании BitBlt мельканий не наблюдал.

Не при использовании, а после, когда DC требуется перерисовка.
И код большой, особенно что касается создания текста.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Обновление Static контрола

Может как то перед ControlSetText стереть текст, или после обновить как то без мелькания.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

когда DC требуется перерисовка

Так перерисовка тоже с помощью BitBlt делается. Остальное всё решаемо, было бы желание.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Обновление Static контрола

teadrinker пишет:

Так перерисовка тоже с помощью BitBlt делается.

Только запускается она процедурой из скрипта, и иногда опаздывает.

teadrinker пишет:

всё решаемо, было бы желание.

То что ты предлагаешь, я понимаю. Но слишком много кода чтобы убедится что будет мелькать, исходя из всех примеров что я видел, и собственного опыта.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Обновление Static контрола

Только что вот нашёл и запустил свой старый скрипт, где в цикле используется BitBlt для перерисовки окна. Вроде мельканий никаких нет:

If !pToken := Gdip_Startup()
{
   MsgBox, 48, Ошибка GDI+, Убедитесь в наличии gdiplus.dll в вашей системе!
   ExitApp
}

OnExit, Exit
SetBatchLines, -1
SetWinDelay, 0

k1 = 52   ; коэффициент частоты
k2 = 80   ; коэффициент амплитуды
Width = 492
Height = 250       ; размеры картинки
SleepDuration = 6  ; пауза в цикле
Frame = 3          ; рамка

H2 := Height//2
X := (A_ScreenWidth-Width)//2
Y := (A_ScreenHeight-Height)//2

DllCall("Winmm\timeBeginPeriod", UInt, 3)

hbm := CreateDIBSection(Width, Height)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)

pFrameBrush := Gdip_BrushCreateSolid(0xffC4C0B8)  ; кисть для рамки
pFillBrush := Gdip_BrushCreateSolid(0xffffffff)   ; кисть для заливки
pGrayPen := Gdip_CreatePen(0xff808080, 1)         ; карандаш для оси
pBluePen := Gdip_CreatePen(0xff0000ff, 1)         ; карандаш для графика

Gdip_FillRectangle(G, pFrameBrush, -1, -1, Width+2, Height+2)   ; с запасом
Gdip_FillRectangle(G, pFillBrush, Frame, Frame, Width-Frame*2-1, Height-Frame*2-1)
Gdip_DeleteBrush(pFrameBrush)
Gdip_DrawLine(G, pGrayPen, Frame, H2, Width-Frame-1, H2)

Gui, Color, 0xECE9D8
Gui, Add, Pic, x20 y20 w%Width% h%Height% hwndhPic
Gui, Add, Button, % "x" (Width - 40)//2 " y" 35 + Height " w80 h23 gPause vButton", Start
Gui, Show, % "w" Width+40 " h" Height + 75

hPicDC := GetDC(hPic)  ; получаем контекст контрола, чтобы переносить в него изображение
BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)  ; переносим рисунок в контекст контрола
OnMessage(0xF, "WM_PAINT")  ; поддержка изображения при перерисовке окна

Loop
{
   i := !i
   x1 := Frame+1
   y1 := Round((-Sin((x1 - Frame - 1)*k1/1000))*k2 + H2)
   While x1 < Width-Frame-2
   {
      DllCall("Sleep", UInt, SleepDuration)
      if !p
         Continue
      x2 := x1 + 1
      y2 := Round((-Sin((x2 - Frame - 1)*k1/1000))*k2 + H2)
      if i
         Gdip_DrawLine(G, pBluePen, x1, y1, x2, y2)
      Else
      {
         end := x2 = Width-Frame-2
         Gdip_FillRectangle(G, pFillBrush, x1-1, Frame+1, end ? 3 : 2, Height-Frame*2-2)
         Gdip_DrawLine(G, pGrayPen, x1-1, H2, end ? x2+1 : x2, H2)
      }
      x1 := x2, y1 := y2
      BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   }
}

Pause:
   GuiControl,, Button, % (p := !p) ? "Stop" : "Start"
   Return

GuiClose:
GuiEscape:
   ExitApp

Exit:
   Gdip_DeletePen(pGrayPen), Gdip_DeletePen(pBluePen), Gdip_DeleteBrush(pFillBrush)
   ReleaseDC(hPicDC, hPic)
   SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc), Gdip_DeleteGraphics(G)
   Gdip_Shutdown(pToken)
   DllCall("Winmm\timeEndPeriod", UInt, 3)
   ExitApp

WM_PAINT()   ; поддержка изображения при перерисовке окна
{
   global
   SetTimer, Timer, -10
   Return

Timer:
   BitBlt(hPicDC, 0, 0, Width, Height, hdc, 0, 0)
   Return
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Обновление Static контрола

Мелькает как и все подобные примеры.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Обновление Static контрола

Хм, тогда я не понимаю, что ты имеешь в виду под "мельканием". Запускал на 7 (включал тему классика) и на 10 — никаких мельканий не было. Как ты их получаешь?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Обновление Static контрола

В классике больше заметно. Например вытягивая окно из за края экрана, или при быстрой смене больших кадров.
Я делал как то для ахксапй экранную лупу также в контексте контрола, наблюдал мелькания, Malcev тогда тоже отписывался о проблемах, тоже самое наблюдаю и в твоём примере.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Обновление Static контрола

serzh82saratov, у меня контролы с +BackgroundTrans из первого поста не мелькают.
А если sleep в цикле поставить, то у тебя продолжают мелькать?
Код из 13 поста также не мелькает.

18

Re: AHK: Обновление Static контрола

Malcev пишет:

А если sleep в цикле поставить, то у тебя продолжают мелькать?

Мелькают, просто реже. А какие были проблемы с лупой, не помнишь?

Если рисовать в DC то надо отслеживать WM_PAINT, если отправлять BITMAP в STM_SETIMAGE то не надо, почему так?
И почему WM_SETTEXT обновляет текст в Edit, а в Static нет?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Обновление Static контрола

Может видеокарта не очень тянет, типа встроенная?

20

Re: AHK: Обновление Static контрола

GTX 1050 + Xeon, думаю должно тянуть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21 (изменено: teadrinker, 2018-09-10 18:34:22)

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

Если рисовать в DC то надо отслеживать WM_PAINT, если отправлять BITMAP в STM_SETIMAGE то не надо, почему так?

Просто STM_SETIMAGE ассоциирует BITMAP с контролом, а BitBlt нет.

serzh82saratov пишет:

почему WM_SETTEXT обновляет текст в Edit, а в Static нет?

Обновляет, да не тот:

Gui, Add, Text, hwndhStatic

WinGetTitle, title, ahk_id %hStatic%
MsgBox, % title

SendMessage, WM_SETTEXT := 0xC,, &(str := "new text"),, ahk_id %hStatic%

WinGetTitle, title, ahk_id %hStatic%
MsgBox, % title
ExitApp

И по тому, и по другому вопросу всё написано в MSDN.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22 (изменено: Malcev, 2018-09-10 18:46:07)

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

А какие были проблемы с лупой, не помнишь?

Как я помню, при перетаскивании окна, лупа не перерисовывалась.

serzh82saratov пишет:

почему WM_SETTEXT обновляет текст в Edit, а в Static нет?

Если убрать +BackgroundTrans, то обновляет.

Gui, +AlwaysOnTop
Gui, Font, s22
Gui, Color, 0xE8ECF6 
Gui, Add, Text, w400 +0x201 hwndhText1 +Border
Gui, Add, Edit, wp +0x201 hwndhText4
Gui, Show


Loop   
{ 
   Text := A_TickCount 
   ControlSetText, , % Text, ahk_id %hText1%
   ControlSetText, , % Text, ahk_id %hText4%
}

23

Re: AHK: Обновление Static контрола

Надо с BackgroundTrans.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24 (изменено: teadrinker, 2018-09-10 19:05:47)

Re: AHK: Обновление Static контрола

Gui, Add, Text, hwndhStatic w100 +BackgroundTrans
Gui, Show
SendMessage, WM_SETTEXT := 0xC,, &(str := "new text"),, ahk_id %hStatic%
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: Обновление Static контрола

teadrinker, так не получится.

Gui, Add, Text, hwndhStatic w100 +BackgroundTrans
Gui, Show
loop
   SendMessage, WM_SETTEXT := 0xC,, A_Index,, ahk_id %hStatic%

26

Re: AHK: Обновление Static контрола

Ну да, WM_SETTEXT для этого не предназначено.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

Надо с BackgroundTrans.

Не получится.

28

Re: AHK: Обновление Static контрола

serzh82saratov, а чем не устраивает GuiControl?
Вот так у меня не мелькает.
Если же я уменьшу sleep до 1-2, то будет мелькать.

setbatchlines -1
Gui, +AlwaysOnTop
Gui, Font, s6
Gui, Color, 0xE8ECF6
Gui, Add, Text, w400 +0x201 hwndhText +BackgroundTrans +Border
loop 40
   Gui, Add, Text, wp +0x201 hwndhText%A_Index% +BackgroundTrans +Border
Gui, Show
DllCall("Winmm\timeBeginPeriod", UInt, 3)
Loop   
{ 
   Text := A_TickCount
   loop 40
   {
      GuiControl, , % hText%A_Index% , % Text 
      DllCall("Sleep", UInt, 3)
   }
}

GuiClose:
GuiEscape:
DllCall("Winmm\timeEndPeriod", UInt, 3)
ExitApp

29

Re: AHK: Обновление Static контрола

Не понятно зачем используется timeBeginPeriod, визуально ничего не меняется, и это глобальная настройка, я бы такое только в крайних случаях трогал.
В этом примере почти не мелькает, но сделай не 40 а например 3 контрола, мелькает?
Придётся увеличить Sleep.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Обновление Static контрола

teadrinker пишет:

Обновляет, да не тот:

Не понял.

SendMessage, WM_SETTEXT := 0xC,, &(str := "new text"),, ahk_id %hStatic% 

Так не проще?

SendMessage, WM_SETTEXT := 0xC,,"new text",, ahk_id %hStatic%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31 (изменено: Malcev, 2018-09-12 21:38:43)

Re: AHK: Обновление Static контрола

serzh82saratov пишет:

Не понятно зачем используется timeBeginPeriod, визуально ничего не меняется

Пишут, что для точности.
https://docs.microsoft.com/en-us/window … hapi-sleep
При 3 контролах у меня даже без sleep не мелькает.
А у тебя с +BackgroundTrans или без мелькает?

32

Re: AHK: Обновление Static контрола

Без BackgroundTrans просто реже мелькает, но всё равно часто.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33 (изменено: Malcev, 2018-09-12 22:10:56)

Re: AHK: Обновление Static контрола

А если через dllcall окно с контролами создавать, то тоже дергается?
http://forum.script-coding.com/viewtopi … 30#p128130
Еще можно создать нового пользователя и запустить gui под ним.

34

Re: AHK: Обновление Static контрола

Да, также.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35 (изменено: Malcev, 2018-09-13 08:02:43)

Re: AHK: Обновление Static контрола

А так?

setbatchlines -1
Gui, +AlwaysOnTop  +E0x02000000 ; WS_EX_COMPOSITED
Gui, Font, s6
Gui, Color, 0xE8ECF6
Gui, Add, Text, w400 +0x201 hwndhText +BackgroundTrans +Border
loop 40
   Gui, Add, Text, wp +0x201 hwndhText%A_Index% +BackgroundTrans +Border
Gui, Show
Loop   
{ 
   Text := A_TickCount
   loop 40
      GuiControl, , % hText%A_Index% , % Text 
}

Еще можно попробовать добавить WS_CLIPSIBLINGS к контролам.

36

Re: AHK: Обновление Static контрола

Так ещё больше мелькает, с WS_CLIPSIBLINGS тоже.
Под другим пользователем ещё не пробовал, но если даже перестанет мелькать, как понять в чём проблема?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37 (изменено: Malcev, 2018-09-14 13:39:56)

Re: AHK: Обновление Static контрола

Если перестанет, значит проблема с реестром у данного пользователя.
Кстати, с WS_EX_COMPOSITED можно обновлять текст через WM_SETTEXT.
Погонял на win10 - не мелькает, до первой минимизации.
Но если добавить WS_EX_LAYERED, то и после минимизации не начинает мелькать.

Gui, +AlwaysOnTop +E0x02000000 +E0x00080000 ; WS_EX_COMPOSITED WS_EX_LAYERED
Gui, Font, s22
Gui, Color, 0xE8ECF6 
Gui, Add, Text, w400 +0x201 hwndhText1 +BackgroundTrans +Border
Gui, Add, Text, wp +0x201 +BackgroundTrans +Border hwndhText2
Gui, Add, Text, wp +0x201 hwndhText3 +Border  
Gui, Add, Edit, wp +0x201 hwndhText4
Gui, Show

Loop   
	{ 
		Text := A_TickCount 
		ControlSetText, , % Text, ahk_id %hText1%
		; WM_SETTEXT работает также как и ControlSetText
		; SendMessage, 0x000C, 0, &Text, , ahk_id %hText1%		;	WM_SETTEXT
		GuiControl, , % hText2 , % Text 
		GuiControl, , % hText3 , % Text 
		GuiControl, , % hText4 , % Text 
	}

Описание и решение проблемы:
https://www.autoitscript.com/forum/topi … on-update/

38

Re: AHK: Обновление Static контрола

Так не мелькает.
Не знал что LAYERED окно будет отображатся без UpdateLayeredWindow.

MandarinKa02 пишет:

либо использовать двойную буферизацию.

Это видимо было про WS_EX_COMPOSITED.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui