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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

2

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

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

3

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

4

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

Через hDC?

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

5

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

6

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

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

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

7

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

8

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

serzh82saratov пишет:

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

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

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

9

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

teadrinker пишет:

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

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

teadrinker пишет:

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

10

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

11

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

serzh82saratov пишет:

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

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

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

12

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

teadrinker пишет:

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

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

teadrinker пишет:

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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
Skype dmitry_fiveg

14

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

15

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

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

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

16

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

19

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

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

20

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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
Skype dmitry_fiveg

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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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
Skype dmitry_fiveg

25

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

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

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