51 (изменено: teadrinker, 2018-01-09 19:05:33)

Re: AHK: Экранная лупа

Оказалось, можно только прямоугольник закрашивать. В принципе, это практически то же самое, что установить фон, так как под CompatibleDC всё равно нужна CompatibleBitmap определённого размера.

Gui, -DPIScale
Gui, Color, White
Gui, Margin, 40, 20
Gui, Add, Pic, w40 h40 hwndhPic1
Gui, Add, Pic, x+7 yp wp hp hwndhPic2

options := { hStatic:     hPic1
           , cellsNumber: 8
           , rowsNumber:  8
           , darkColor:   0xFF0D00    ; будет фоном
           , lightColor:  0xC618 }
           
board1 := new ChessBoard(options)

options.hStatic := hPic2
options.darkColor := 0x028E9B
options.lightColor := 0xFF7800

board2 := new ChessBoard(options)

Gui, Show
Return

GuiClose:
   ExitApp

class ChessBoard
{
   __New(options)  {
      this.options := options
      hPic := options.hStatic
      this.hParent := DllCall("GetAncestor", Ptr, hPic, UInt, GA_ROOT := 2, Ptr)
      
      WinGetPos,,, W, H, ahk_id %hPic%
      this.BoardWidth := W, this.BoardHeight := H
      this.CellWidth := W/options.cellsNumber
      this.CellHeight := H/options.rowsNumber
      
      this.hDC := DllCall("GetDC", Ptr, hPic, Ptr)
      this.oMDC := new this.CompatibleDC(this.hDC, W, H)
      this.hMDC := this.oMDC.hCDC
      
      OnMessage( 0xF, this.redraw := ObjBindMethod(this, "WM_PAINT") )
      this.DrawBoard()
   }
   
   __Delete()  {
      this.oMDC := ""
      DllCall("DeleteDC", Ptr, this.hDC)
      OnMessage(0xF, this.redraw, 0)
   }
   
   DrawBoard()  {
      brush := new this.Brush(this.hMDC, this.options.darkColor)
      this.FillRect(this.hMDC, brush.hBrush, 0, 0, this.BoardWidth, this.BoardHeight)
      
      brush := new this.Brush(this.hMDC, this.options.lightColor)
      Loop % this.options.rowsNumber  {
         row := A_Index
         Loop % this.options.cellsNumber  {
            cell := A_Index
            if mod(row + cell, 2)
               continue
            X := this.CellWidth*(cell - 1)
            Y := this.CellHeight*(row - 1)
            this.FillRect(this.hMDC, brush.hBrush, X, Y, X + this.CellWidth, Y + this.CellHeight)
         }
      }
      this.BitBlt(this.hDC, this.hMDC)
   }
   
   FillRect(hDC, hBrush, left, top, right, bottom)  {
      VarSetCapacity(RECT, 16, 0)
      NumPut(left,   RECT, 0)
      NumPut(top,    RECT, 4)
      NumPut(right,  RECT, 8)
      NumPut(bottom, RECT, 12, "UInt")
      DllCall("FillRect", Ptr, hDC, Ptr, &RECT, Ptr, hBrush)
   }
   
   BitBlt(ddc, sdc)  {
      DllCall("BitBlt", Ptr, ddc, Int, 0, Int, 0, Int, this.BoardWidth, Int, this.BoardHeight
                      , Ptr, sdc, Int, 0, Int, 0, UInt, SRCCOPY := 0xCC0020)
   }
   
   WM_PAINT(wp, lp, msg, hwnd)  {
      if (this.hParent = hwnd)   {
         timer := ObjBindMethod(this, "BitBlt", this.hDC, this.hMDC)
         SetTimer, % timer, -10
      }
   }
   
   class Brush
   {
      __New(hDC, color)  {
         this.hBrush := DllCall("CreateSolidBrush", UInt, DllCall("Ws2_32\ntohl", UInt, color << 8, UInt), Ptr)
         this.oBR := DllCall("SelectObject", Ptr, hDC, Ptr, this.hBrush, Ptr)
      }
      
      __Delete()  {
         DllCall("SelectObject", Ptr, hDC, Ptr, this.oBR, Ptr)
         DllCall("DeleteObject", Ptr, this.hBrush)
      }
   }
   
   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

52

Re: AHK: Экранная лупа

То есть получается просто рисование, заполнение SolidBrush всех указанных явно прямоугольников. Я так вроде делал, но на больших количествах прямоугольников начинает мелькать при движении окна. Например w1400 h400 80х80 уже мелькает с аеро, при перемещении даже окно тормозит, и кажется не так то быстро оно рисуется.

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

53

Re: AHK: Экранная лупа

80х80 — это что?

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

54

Re: AHK: Экранная лупа

Вот так?

SetBatchLines, -1
Gui, -DPIScale
Gui, Color, White
Gui, Margin, 20, 20
Gui, Add, Pic, w640 h640 hwndhPic1
Gui, Add, Pic, x+7 yp wp hp hwndhPic2

options := { hStatic:     hPic1
           , cellsNumber: 8
           , rowsNumber:  8
           , darkColor:   0xFF0D00    ; будет фоном
           , lightColor:  0xC618 }
           
board1 := new ChessBoard(options)

options.hStatic := hPic2
options.darkColor := 0x028E9B
options.lightColor := 0xFF7800

board2 := new ChessBoard(options)

Gui, Show
Return

GuiClose:
   ExitApp

class ChessBoard
{
   __New(options)  {
      this.options := options
      hPic := options.hStatic
      this.hParent := DllCall("GetAncestor", Ptr, hPic, UInt, GA_ROOT := 2, Ptr)
      
      WinGetPos,,, W, H, ahk_id %hPic%
      this.BoardWidth := W, this.BoardHeight := H
      this.CellWidth := W/options.cellsNumber
      this.CellHeight := H/options.rowsNumber
      
      this.hDC := DllCall("GetDC", Ptr, hPic, Ptr)
      this.oMDC := new this.CompatibleDC(this.hDC, W, H)
      this.hMDC := this.oMDC.hCDC
      
      OnMessage( 0xF, this.redraw := ObjBindMethod(this, "WM_PAINT") )
      this.DrawBoard()
   }
   
   __Delete()  {
      this.oMDC := ""
      DllCall("DeleteDC", Ptr, this.hDC)
      OnMessage(0xF, this.redraw, 0)
   }
   
   DrawBoard()  {
      brush := new this.Brush(this.hMDC, this.options.darkColor)
      this.FillRect(this.hMDC, brush.hBrush, 0, 0, this.BoardWidth, this.BoardHeight)
      
      brush := new this.Brush(this.hMDC, this.options.lightColor)
      Loop % this.options.rowsNumber  {
         row := A_Index
         Loop % this.options.cellsNumber  {
            cell := A_Index
            if mod(row + cell, 2)
               continue
            X := this.CellWidth*(cell - 1)
            Y := this.CellHeight*(row - 1)
            this.FillRect(this.hMDC, brush.hBrush, X, Y, X + this.CellWidth, Y + this.CellHeight)
         }
      }
      this.BitBlt(this.hDC, this.hMDC)
   }
   
   FillRect(hDC, hBrush, left, top, right, bottom)  {
      VarSetCapacity(RECT, 16, 0)
      NumPut(left,   RECT, 0)
      NumPut(top,    RECT, 4)
      NumPut(right,  RECT, 8)
      NumPut(bottom, RECT, 12, "UInt")
      DllCall("FillRect", Ptr, hDC, Ptr, &RECT, Ptr, hBrush)
   }
   
   BitBlt(ddc, sdc)  {
      DllCall("BitBlt", Ptr, ddc, Int, 0, Int, 0, Int, this.BoardWidth, Int, this.BoardHeight
                      , Ptr, sdc, Int, 0, Int, 0, UInt, SRCCOPY := 0xCC0020)
   }
   
   WM_PAINT(wp, lp, msg, hwnd)  {
      if (this.hParent = hwnd)   {
         timer := ObjBindMethod(this, "BitBlt", this.hDC, this.hMDC)
         SetTimer, % timer, -10
      }
   }
   
   class Brush
   {
      __New(hDC, color)  {
         this.hBrush := DllCall("CreateSolidBrush", UInt, DllCall("Ws2_32\ntohl", UInt, color << 8, UInt), Ptr)
         this.oBR := DllCall("SelectObject", Ptr, hDC, Ptr, this.hBrush, Ptr)
      }
      
      __Delete()  {
         DllCall("SelectObject", Ptr, hDC, Ptr, this.oBR, Ptr)
         DllCall("DeleteObject", Ptr, this.hBrush)
      }
   }
   
   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

55

Re: AHK: Экранная лупа

С SetBatchLines конечно по лучше, но например с cellsNumber: 320, rowsNumber:  320 уже заметна задержка при старте, и мелькает, слева больше.

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

56

Re: AHK: Экранная лупа

У меня задержка тоже есть, а мелькание слева — это отчасти зрительный эффект, по-моему. Задержек при перемещении окна у меня нет.

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

57

Re: AHK: Экранная лупа

Думаю, основная проблема в скорости выполнения AHK-скриптов, если нужно прорисовывать какие-то сложные графические вещи — AHK не лучший выбор.

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

58

Re: AHK: Экранная лупа

Да уж, цикл без FillRect тоже заметен по времени.
Кстати, class как метод class`а всегда можно было использовать?

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

59

Re: AHK: Экранная лупа

serzh82saratov пишет:

Да уж, цикл без FillRect тоже заметен по времени.

При желании его можно оптимизировать, сейчас он проскакивает вхолостую те поля, где фон уже нарисован.

serzh82saratov пишет:

Кстати, class как метод class`а всегда можно было использовать?

Это не метод класса, это вложенный класс (class NestedClass). Его можно и вовне вынести.

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

60

Re: AHK: Экранная лупа

А что там значит extends BaseClassName?

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

61

Re: AHK: Экранная лупа

MsgBox, % MyClass.var

class MainClass  {
   static var := "test"
}

class MyClass extends MainClass  {
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

62

Re: AHK: Экранная лупа

Копия получается... Что это даёт?

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

63

Re: AHK: Экранная лупа

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

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

64

Re: AHK: Экранная лупа

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


MainClass.Method1()
MyClass.Method1()

class MainClass  {
	Method1() {
		MsgBox % A_ThisFunc
	} 
}

class MyClass extends MainClass  {
	Method1() {
		MsgBox % A_ThisFunc
	} 
}

Если в MyClass убрать Method1, то он наследуется из MainClass.


MainClass.Method1()
MyClass.Method1()

class MainClass  {
	Method1() {
		MsgBox % A_ThisFunc
	} 
}

class MyClass extends MainClass  { 
}

Если в MainClass убрать Method1, то он наследуется из MyClass, но в MyClass пропадает.


MainClass.Method1()
MyClass.Method1()

class MainClass  { 
}

class MyClass extends MainClass  {
	Method1() {
		MsgBox % A_ThisFunc
	} 
}

Зачем это всё?

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

65

Re: AHK: Экранная лупа

serzh82saratov пишет:

Если в MainClass убрать Method1, то он наследуется из MyClass, но в MyClass пропадает.

Ты перепутал, ничего не пропадает.


MainClass.Method1()
;MyClass.Method1()

class MainClass  { 
}

class MyClass extends MainClass  {
   Method1() {
      MsgBox % A_ThisFunc
   } 
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

66 (изменено: serzh82saratov, 2018-01-10 04:20:11)

Re: AHK: Экранная лупа

Так почему MyClass.Method1() не показывает? Он же есть в первом примере.
А во втором показывает MainClass.Method1().

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

67

Re: AHK: Экранная лупа

Почему не показывает?

;MainClass.Method1()
MyClass.Method1()

class MainClass  { 
}

class MyClass extends MainClass  {
   Method1() {
      MsgBox % A_ThisFunc
   } 
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

68

Re: AHK: Экранная лупа

А сразу обе строки почему не показывают?

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

69

Re: AHK: Экранная лупа


MainClass.Method1()
MyClass.Method1()

class MainClass  {
   Method1() {
      MsgBox % A_ThisFunc
   } 
}

class MyClass extends MainClass  { 
}

В этом примере class MyClass наследует методы MainClass, получается метод Method1 есть в обоих.

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

70

Re: AHK: Экранная лупа

serzh82saratov пишет:

А сразу обе строки почему не показывают?

Не понял вопроса.

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

71

Re: AHK: Экранная лупа

Не знаешь как не включать определённое окно (хотя бы своё) в снимок экрана? Встроенная лупа показывает экран, причём своё окно не включает в обзор.

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

72

Re: AHK: Экранная лупа

Думаю, никак. У встроенной в этом режиме просто прозрачно всё, кроме рамки.

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

73

Re: AHK: Экранная лупа

Посмотри в режиме "закреплено" наведя на заголовок.

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

74

Re: AHK: Экранная лупа

teadrinker пишет:

Думаю, основная проблема в скорости выполнения AHK-скриптов

Наверняка какая то байда в GDI есть. Вот без цикла заполняет область, 800 2х цветных полос с градиентом, довольно быстро, может не только для полос, но и для квадратов есть, и без градиента.



#SingleInstance force
#NoEnv

Gui, Add, Pic, x+5 y5 w1600 h1000 hwndHPIC 0xE
Colorlist:=[0xff000000,0xffffffff]
Gui, Show 

t := 1111
Loop
{
	LinearGradient(HPIC, Colorlist, 0,2,0) 
	Sleep t
	LinearGradient(HPIC, Colorlist, 2,2,2) 
	Sleep t
	LinearGradient(HPIC, Colorlist, 1,2,2) 
	Sleep t
	LinearGradient(HPIC, Colorlist, 3,2,2) 
	Sleep t
}
return


LinearGradient(HWND, oColors, D = 0, BW = 0, BH = 0) {  
	IC := oColors.MaxIndex()
	
	oPositions := [0.0]
	P := 1.0 / (IC - 1)
	Loop, % (IC - 2)
		oPositions.Insert(P * A_Index)
	oPositions.Insert(1.0)
	
	If !DllCall("GetModuleHandle", "Str", "Gdiplus")
		hGDIP := DllCall("LoadLibrary", "Str", "Gdiplus")
	VarSetCapacity(SI, 16, 0)
	Numput(1, SI, "UInt")
	DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
	If (!pToken) {
		ErrorLevel := "GDIPlus could not be started!`nCheck the availability of GDIPlus on your system, please!"
		Return False
	}
	VarSetCapacity(RECT, 16, 0)
	DllCall("User32.dll\GetClientRect", "Ptr", HWND, "Ptr", &RECT)
	W := NumGet(RECT, 8, "Int")
	H := NumGet(RECT, 12, "Int")
	If D Not In 0,1,2,3
		D := 0
	If BW Not Between 1 And W
		BW := W 
	If BH Not Between 1 And H
		BH := H
	DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", W, "Int", H, "Int", 0
         , "Int", 0x26200A, "Ptr", 0, "PtrP", pBitmap)
	DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBitmap, "PtrP", pGraphics)
	VarSetCapacity(RECTF, 16, 0)
	NumPut(BW, RECTF,  8, "Float")
	NumPut(BH, RECTF, 12, "Float")
	DllCall("Gdiplus.dll\GdipCreateLineBrushFromRect", "Ptr", &RECTF
         , "Int", 0, "Int", 0, "Int", D, "Int", 0, "PtrP", pBrush)
	VarSetCapacity(COLORS, IC * 4, 0)
	O := -4
	For I, V In oColors 
		NumPut(V | 0x00000000, COLORS, O += 4, "UInt")
	VarSetCapacity(POSITIONS, IC * 4, 0)
	O := -4
	For I, V In oPositions
		NumPut(V, POSITIONS, O += 4, "Float")
	DllCall("Gdiplus.dll\GdipSetLinePresetBlend", "Ptr", pBrush, "Ptr", &COLORS, "Ptr", &POSITIONS, "Int", IC)
	
	DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pGraphics, "Ptr", pBrush
		, "Float", 0, "Float", 0, "Float", W, "Float", H)
		
	DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "Int", 0X00FFFFFF)
	
	DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
	DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBrush)
	DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pGraphics)
	
	DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
	If (hGDIP)
		DllCall("FreeLibrary", "Ptr", hGDIP)
		
	SendMessage, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0x0, hBitmap, , ahk_id %HWND%
	
	DllCall("Gdi32.dll\DeleteObject", "Ptr", hBitmap)
	Return True
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

75 (изменено: serzh82saratov, 2018-01-10 09:43:58)

Re: AHK: Экранная лупа

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

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