26

Re: AHK: AnimateWindow и StretchBlt

Не совсем понял, откуда мелькания. Я вчера набросал вариант со static со StretchBlt, никаких мельканий не заметил. Правда, с aero на другую тему переключаться не пробовал.

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

27

Re: AHK: AnimateWindow и StretchBlt

Ну тогда приведи свой код.

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

28

Re: AHK: AnimateWindow и StretchBlt

Ок, вечером.

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

29

Re: AHK: AnimateWindow и StretchBlt

#NoEnv
SetBatchLines, -1

Gui, +hwndhGui +AlwaysOnTop -DPIScale
Gui, Margin, 20, 20
Gui, Add, Pic, w351 h351 hwndhPic border
Gui, Show,, Zoom: 5
oZoom := new Zoom(hPic)
Return

GuiClose:
   oZoom := ""
   ExitApp
   
#If WinActive("ahk_id" . hGui)
WheelUp:: 
WheelDown:: Gui, Show,, % "Zoom: " . oZoom.ChangeZoom(A_ThisHotkey = "WheelUp")
#If

class Zoom  {
   __New(hPic)  {
      CoordMode, Mouse
      this.hParent := DllCall("GetParent", Ptr, hPic)
      WinGetPos,,, W, H, ahk_id %hPic%
      this.PicWidth := W, this.PicHeight := H
      this.CurrentZoom := 5
      this.hDC := DllCall("GetDC", Ptr, hPic, Ptr)
      this.hSDC := DllCall("GetDC", Ptr, 0, Ptr)
      this.oMDC := new this.CompatibleDC(this.hDC, W, H)
      this.hMDC := this.oMDC.hCDC
      
      this.timer := timer := ObjBindMethod(this, "Draw")
      SetTimer, % timer, 10
      OnMessage( 0xF, ObjBindMethod(this, "WM_PAINT") )
   }
   
   __Delete()  {
      timer := this.timer
      SetTimer, % timer, Delete
      this.oMDC := ""
      DllCall("DeleteDC", Ptr, this.hDC)
      DllCall("DeleteDC", Ptr, this.hSDC)
   }
      
   Draw()  {
      MouseGetPos, mouse_x, mouse_y
      w := this.PicWidth/this.CurrentZoom
      h := this.PicHeight/this.CurrentZoom
      DllCall("StretchBlt", Ptr, this.hDC, Int, 0, Int, 0, Int, this.PicWidth - 2, int, this.PicHeight - 2
                          , Ptr, this.hSDC, Int, mouse_x - w/2, Int, mouse_y - h/2, Int, w, Int, h, UInt, SRCCOPY := 0xCC0020)
      this.BitBlt(this.hMDC, this.hDC)
   }
   
   BitBlt(ddc, sdc)  {
      DllCall("BitBlt", Ptr, ddc, Int, 0, Int, 0, Int, this.PicWidth, Int, this.PicHeight
                      , Ptr, sdc, Int, 0, Int, 0, UInt, SRCCOPY := 0xCC0020)
   }
   
   ChangeZoom(mode)  {
      this.CurrentZoom += (mode ? 1 : -1)
      (this.CurrentZoom < 1 && this.CurrentZoom := 1)
      Return this.CurrentZoom
   }
   
   WM_PAINT(wp, lp, msg, hwnd)  {
      if (this.hParent = hwnd)  {
         timer := ObjBindMethod(this, "BitBlt", this.hDC, this.hMDC)
         SetTimer, % timer, -10
      }
   }
   
   class CompatibleDC
   {
      __New(hDC, w, h)  {
         this.hCDC := DllCall("CreateCompatibleDC", Ptr, hDC, Ptr)
         this.hCBM := DllCall("CreateCompatibleBitmap", Ptr, hDC, Int, w, Int, h, Ptr)
         this.oBM := DllCall("SelectObject", Ptr, this.hCDC, Ptr, this.hCBM, Ptr)
      }
      
      __Delete()  {
         DllCall("SelectObject", Ptr, this.hCDC, Ptr, this.oBM, Ptr)
         DllCall("DeleteDC", Ptr, this.hCDC)
         DllCall("DeleteObject", Ptr, this.hCBM)
      }
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

30 (изменено: serzh82saratov, 2018-01-08 17:09:15)

Re: AHK: AnimateWindow и StretchBlt

Всё равно немного заметен вертикальный рассинхрон и WM_PAINT в классической теме. И в моём случае this.hMDC это DC всего экрана, и WM_PAINT происходит медленне, плюс в цикле Draw уже неполучится каждый раз его сохранять.

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

31

Re: AHK: AnimateWindow и StretchBlt

Ещё не понятно, что у тебя показывается у краёв экрана.

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

32

Re: AHK: AnimateWindow и StretchBlt

serzh82saratov пишет:

Всё равно немного заметен вертикальный рассинхрон и WM_PAINT.

Это не понял.

serzh82saratov пишет:

И в моём случае this.hMDC это DC всего экрана

А зачем это? Для перерисовки картинки нужен только её контент.

serzh82saratov пишет:

Ещё не понятно, что у тебя показывается у краёв экрана.

Ну просто не учтена эта ситуация, думаю, вопрос на пару строк кода.

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

33

Re: AHK: AnimateWindow и StretchBlt

teadrinker пишет:

Это не понял.

Вертикальная синхронизация. Картинка разъежается по горизонтали, это в основном в классической теме, и не сильно заметно, но изредка режет глаз.

teadrinker пишет:

А зачем это? Для перерисовки картинки нужен только её контент.

Ну а если я захочу поставить на паузу, растянуть окно, и уменьшить зум, что я увижу?

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

34

Re: AHK: AnimateWindow и StretchBlt

teadrinker пишет:

Это не понял.

Про WM_PAINT я отвечал.

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

35

Re: AHK: AnimateWindow и StretchBlt

serzh82saratov пишет:

Ну а если я захочу поставить на паузу, растянуть окно, и уменьшить зум, что я увижу?

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

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

36

Re: AHK: AnimateWindow и StretchBlt

Так экран уже поменяется 100 раз.

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

37

Re: AHK: AnimateWindow и StretchBlt

В моём варианте, если ты заметил, данные берутся непосредственно с DC экрана.

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

38

Re: AHK: AnimateWindow и StretchBlt

Так всё же что это даёт?

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

39

Re: AHK: AnimateWindow и StretchBlt

Прежде всего скорость. И всё время свежие данные.

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

40

Re: AHK: AnimateWindow и StretchBlt

Так это от задачи зависит, зачем свежие данные, если спустя время нужно будет просмотреть прежний вид всего экрана.

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

41

Re: AHK: AnimateWindow и StretchBlt

Так лучше иметь свежие, их всегда сохранить можно.

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