76

Re: AHK: Бегущая строка

Я за тобой не успеваю. Это относится к чему то выше, или ещё один метод.

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

77

Re: AHK: Бегущая строка

Там просто объясняется принцип работы BitBlt.

78

Re: AHK: Бегущая строка

Кстати есть еще вариант через SetDIBitsToDevice:
https://habr.com/ru/post/164705/

А с WriteableBitmap не сталкивался, автор его в пример приводит.

Вот что то есть, у меня не открывает.

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

79

Re: AHK: Бегущая строка

Нет, по-моему это для NET.

80

Re: AHK: Бегущая строка

А там разве просто длл нельзя использовать, или что то надо устанавливать.
https://www.nuget.org/packages/WriteableBitmapEx/1.6.2

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

81

Re: AHK: Бегущая строка

Без понятия.
Про работу с NET можешь почитать тут:
https://www.autohotkey.com/boards/viewtopic.php?t=4633

82 (изменено: serzh82saratov, 2019-03-06 23:19:21)

Re: AHK: Бегущая строка

А, да, как то использовал готовый пример с ней.
Как по твоему, почему теоретически SetDIBits может быть шустрее чем UpdateLayeredWindow, и в чём преимущества перед BitBllt?

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

83

Re: AHK: Бегущая строка

Не совсем понял почему ты сравниваешь SetDIBits с UpdateLayeredWindow и BitBlt?

84

Re: AHK: Бегущая строка

UpdateLayeredWindow на GDI+, но она тормозит. BitBlt и SetDIBits на GDI, ты предлагал их в качестве менее прожорливой альтернативы если я правильно понял.

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

85

Re: AHK: Бегущая строка

Не SetDIBits, а SetDIBitsToDevice.
Это совсем разные функции.
Теоретически сказать не могу, я бы исходил из практики - попробовать все варианты и выбрать наиболее подходящий.
МСДН пишет, что BitBlt быстрее:
https://docs.microsoft.com/en-us/window … nt-bitmaps
Хотя возможно тебя  ни один из вариантов не устроит и тогда придется садиться за изучение Direct2D:
https://autohotkey.com/board/topic/9464 … animation/
https://github.com/neptercn/Direct2D

86

Re: AHK: Бегущая строка

Тогда не понятно почему автор предпочёл SetDIBitsToDevice вместо BitBlt для большего кол-ва fps. Судя по опыту создания экранной лупы, BitBlt при перерисовке больших площадей периодически мелькает, и не даёт существенный прирост производительности в сравнении с UpdateLayeredWindow.

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

87

Re: AHK: Бегущая строка

Кто ж его знает.
Рассуждать можно до бесконечности.
Реальные результаты можно получить только с помощью бенчмарков.

88

Re: AHK: Бегущая строка

Direct2D выглядит хорошо, но судя по тому что на AutoHotkey это чуть ли не единственный пример, путь одолеет не каждый идущий.

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

89

Re: AHK: Бегущая строка

Самое главное то, что написан враппер.
Берешь какую-нибудь книжку по Direct2D, читаешь, изучаешь уроки.
Потом с помощью враппера выполняешь их на ахк.
Если какие-то функции переведены на ахк не будут, ищешь их на мсдн, считаешь сдвиги и добавляешь.

90

Re: AHK: Бегущая строка

Тут его более полные библиотеки:
https://github.com/neptercn/Component_AHK
Пример от которого можно отталкиваться:

#SingleInstance force
#NoTrayIcon
SetBatchLines,-1

;dll structure
;Result := DllCall("DllFile\Function", "Type1", Arg1, "Type2", Arg2,.....,"TypeX",ArgX) ;pretty straight forward

DllCall("LoadLibrary","str","d2d1.dll") ;default path C:\Windows\SysWOW64\d2d1.dll on 64bit
global 	sizeX = 300,sizeY = 300, hGui ; hwnd
		,pFactory ; the Direct2d Factory
		,pWDFactory ;the DWrite Factory
DllCall("d2d1\D2D1CreateFactory","uint",0,"ptr",guid(CLSID,"{06152247-6f50-465a-9245-118bfd3b6007}"),"uint*",0,"ptr*",pFactory) ;Create D2D1 Factory

DllCall("LoadLibrary","str","dwrite.dll")
DllCall("dwrite\DWriteCreateFactory","uint",0,"ptr",GUID(CLSID,"{b859ee5a-d838-4b5b-a2e8-1adc7d93db48}"),"ptr*",pWDFactory) ;Create DWriteFactory


Gui,new,hwndhGui
;CustomColor = EEAA99  ; Can be any RGB color (it will be made transparent below).
Gui +AlwaysOnTop -Caption ;+ToolWindow  ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
;Gui, Color, %CustomColor%
;WinSet, TransColor, %CustomColor% 0

;gui,new,hwndhGui
gui,show,w%sizeX% h%sizeY%

_rectangle()
return
GuiClose:
ExitApp


_rectangle()
{

	static pRenderTarget,pBrush3,pBackgroundBrush,pTxtBrush,textFormat
	
	if A_PtrSize=8
		_struct(tD2D1_HWND_RENDER_TARGET_PROPERTIES,"uint;uint;uint;uint",hGui,hGui>>32,sizeX,sizeY)
	else
		_struct(tD2D1_HWND_RENDER_TARGET_PROPERTIES,"uint;uint;uint",hGui,sizeX,sizeY)
	
	;PixelFormat:
		_struct(tD2D1_PIXEL_FORMAT,"uint;uint",28,0)
	;	Tooltip % &tD2D1_PIXEL_FORMAT
		
		;_struct(tD2D1_RENDER_TARGET_PROPERTIES,"uint;uint;uint;float;float;uint;uint")
		_struct(tD2D1_RENDER_TARGET_PROPERTIES,"uint;uint;uint;float;float;uint;uint",0,0,1,0,0,0,0)
		;Colors
		_struct(tD2D1_COLOR_F4,"float;float;float;float",0,0,0,0) ;BackGround
		_struct(tD2D1_COLOR_F3,"float;float;float;float",1,0,0,1) ;Square
		_struct(tD2D1_COLOR_F5,"float;float;float;float",1,1,0,1) ;Text
		
		_struct(HBITMAP,"uint;uint;uint;uint;uint",500,500,1,32,0)
		

	;ID2D1Factory
	DllCall(vt(pFactory,14),"ptr",pFactory
			,"ptr",&tD2D1_RENDER_TARGET_PROPERTIES
			,"ptr",&tD2D1_HWND_RENDER_TARGET_PROPERTIES
			,"ptr*",pRenderTarget)  ;CreateHwndRenderTarget

	;CreateBitmap
;	DllCall(vt(pRenderTarget,4),"ptr",pRenderTarget,"uint",500,"uint",500,"uint",1,"ptr",32,"float",0,"ptr*",bitmap)
	;im lost here

/*
	DllCall(vt(pFactory,13),"ptr",pFactory
			,"ptr",&HBITMAP ; not sure how or what.
			,"ptr"&tD2D1_RENDER_TARGET_PROPERTIES
			,"ptr*",pRenderTarget) ;CreateWicBitmapRenderTarget
			
	;DllCall(vt(pFactory,16),"ptr",&tD2D1_RENDER_TARGET_PROPERTIES,"ptr*",pRenderTarget)
			
		Tooltip % 	DllCall(vt(pRenderTarget,56),pRenderTarget,tD2D1_RENDER_TARGET_PROPERTIES)
		*/


	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F4
			,"ptr",0,"ptr*",pBackgroundBrush) ;CreateSolidColorBrush
			
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F3			
			,"ptr",0,"ptr*",pBrush3) ;CreateSolidColorBrush					
			
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F5
			,"ptr",0,"ptr*",pTxtBrush) ;CreateSolidColorBrush
			
	_struct(tD2D1_RECT_F,"float;float;float;float",0,0,sizeX,sizeY)
	_struct(tD2D1_ROUNDED_RECT,"float;float;float;float;float;float",0.12*sizeX,0.12*sizeY,0.88*sizeX,0.88*sizeY)	
	_struct(tD2D1_TEXT,"float;float;float;float",5,5,sizeX,sizeY)

	
	
	;DllCall(vt(pWDFactory,15),"str",fontFamilyName,"ptr",fontCollection,"int",fontWeight,"int",fontStyle,"int",fontStretch,"float",fontSize,"str",localeName,"ptr*",textFormat)	
	
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,48),"ptr",pRenderTarget) ;start draw
	DllCall(vt(pRenderTarget,17),"ptr",pRenderTarget,"ptr",&tD2D1_RECT_F,"ptr",pBackgroundBrush) ;background
	DllCall(vt(pRenderTarget,18),"ptr",pRenderTarget,"ptr",&tD2D1_ROUNDED_RECT,"ptr",pBrush3,"float",2,"ptr",pStrokeStyle) ;rectangle
	DllCall(vt(pWDFactory,15),"str","Arial","ptr",0,"int",700,"int",1,"int",0,"float",13.0,"str","en-us","ptr*",textFormat)	
	DllCall(vt(pRenderTarget,27),"ptr",pRenderTarget,"str","Michael","uint",7,"ptr",textFormat,"ptr",&tD2D1_TEXT,"ptr",pTxtBrush,"uint",0,"unit",0) ;drawtext
	DllCall(vt(pRenderTarget,47),"ptr",pRenderTarget,"ptr",&tD2D1_RECT_F)
	DllCall(vt(pRenderTarget,49),"ptr",pRenderTarget,"uint64*",0,"uint64*",0) ;end draw
	

}

GUID(ByRef GUID, sGUID){ 
    VarSetCapacity(GUID,16,0)
    return DllCall("ole32\CLSIDFromString","wstr",sGUID,"ptr",&GUID)>= 0?&GUID:""
}


_struct(ByRef var,type="",param*){
	if type is Integer
    {
		Loop % VarSetCapacity(var,type,0)//4
			if param[A_Index]
				NumPut(param[A_Index],var,(A_Index-1)*4,"uint")
	}else{
		StringSplit,key,type,`;,%A_Space%
		VarSetCapacity(var,key0*4,0)
		loop %key0%
			if param[A_Index]
				NumPut(param[A_Index],var,(A_Index-1)*4,key%A_Index%)
	}	
	return &var
}

vt(p,n){
	return NumGet(NumGet(p+0,"ptr")+n*A_PtrSize,"ptr")
}

91

Re: AHK: Бегущая строка

Хм, это окно у меня после сворачивания/разворачивания стало серым.

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

92

Re: AHK: Бегущая строка

#SingleInstance force
#NoTrayIcon
SetBatchLines,-1

;dll structure
;Result := DllCall("DllFile\Function", "Type1", Arg1, "Type2", Arg2,.....,"TypeX",ArgX) ;pretty straight forward

DllCall("LoadLibrary","str","d2d1.dll") ;default path C:\Windows\SysWOW64\d2d1.dll on 64bit
global 	sizeX = 300,sizeY = 300, hGui ; hwnd
		,pFactory ; the Direct2d Factory
		,pWDFactory ;the DWrite Factory
DllCall("d2d1\D2D1CreateFactory","uint",0,"ptr",guid(CLSID,"{06152247-6f50-465a-9245-118bfd3b6007}"),"uint*",0,"ptr*",pFactory) ;Create D2D1 Factory

DllCall("LoadLibrary","str","dwrite.dll")
DllCall("dwrite\DWriteCreateFactory","uint",0,"ptr",GUID(CLSID,"{b859ee5a-d838-4b5b-a2e8-1adc7d93db48}"),"ptr*",pWDFactory) ;Create DWriteFactory


Gui,new,hwndhGui
;CustomColor = EEAA99  ; Can be any RGB color (it will be made transparent below).
Gui +AlwaysOnTop -Caption ;+ToolWindow  ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
;Gui, Color, %CustomColor%
;WinSet, TransColor, %CustomColor% 0

;gui,new,hwndhGui
gui,show,w%sizeX% h%sizeY%

OnMessage(0xF,"_rectangle")
OnMessage(0x14,"_WM_ERASEBKGND")
_rectangle()
return
GuiClose:
ExitApp


_WM_ERASEBKGND(){
	return 0
}

_rectangle()
{
	static pRenderTarget,pBrush3,pBackgroundBrush,pTxtBrush,textFormat
	
	if A_PtrSize=8
		_struct(tD2D1_HWND_RENDER_TARGET_PROPERTIES,"uint;uint;uint;uint",hGui,hGui>>32,sizeX,sizeY)
	else
		_struct(tD2D1_HWND_RENDER_TARGET_PROPERTIES,"uint;uint;uint",hGui,sizeX,sizeY)
	
	;PixelFormat:
		_struct(tD2D1_PIXEL_FORMAT,"uint;uint",28,0)
	;	Tooltip % &tD2D1_PIXEL_FORMAT
		
		;_struct(tD2D1_RENDER_TARGET_PROPERTIES,"uint;uint;uint;float;float;uint;uint")
		_struct(tD2D1_RENDER_TARGET_PROPERTIES,"uint;uint;uint;float;float;uint;uint",0,0,1,0,0,0,0)
		;Colors
		_struct(tD2D1_COLOR_F4,"float;float;float;float",0,0,0,0) ;BackGround
		_struct(tD2D1_COLOR_F3,"float;float;float;float",1,0,0,1) ;Square
		_struct(tD2D1_COLOR_F5,"float;float;float;float",1,1,0,1) ;Text
		
		_struct(HBITMAP,"uint;uint;uint;uint;uint",500,500,1,32,0)
		

	;ID2D1Factory
	DllCall(vt(pFactory,14),"ptr",pFactory
			,"ptr",&tD2D1_RENDER_TARGET_PROPERTIES
			,"ptr",&tD2D1_HWND_RENDER_TARGET_PROPERTIES
			,"ptr*",pRenderTarget)  ;CreateHwndRenderTarget

	;CreateBitmap
;	DllCall(vt(pRenderTarget,4),"ptr",pRenderTarget,"uint",500,"uint",500,"uint",1,"ptr",32,"float",0,"ptr*",bitmap)
	;im lost here

/*
	DllCall(vt(pFactory,13),"ptr",pFactory
			,"ptr",&HBITMAP ; not sure how or what.
			,"ptr"&tD2D1_RENDER_TARGET_PROPERTIES
			,"ptr*",pRenderTarget) ;CreateWicBitmapRenderTarget
			
	;DllCall(vt(pFactory,16),"ptr",&tD2D1_RENDER_TARGET_PROPERTIES,"ptr*",pRenderTarget)
			
		Tooltip % 	DllCall(vt(pRenderTarget,56),pRenderTarget,tD2D1_RENDER_TARGET_PROPERTIES)
		*/


	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F4
			,"ptr",0,"ptr*",pBackgroundBrush) ;CreateSolidColorBrush
			
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F3			
			,"ptr",0,"ptr*",pBrush3) ;CreateSolidColorBrush					
			
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,8),"ptr",pRenderTarget
			,"ptr",&tD2D1_COLOR_F5
			,"ptr",0,"ptr*",pTxtBrush) ;CreateSolidColorBrush
			
	_struct(tD2D1_RECT_F,"float;float;float;float",0,0,sizeX,sizeY)
	_struct(tD2D1_ROUNDED_RECT,"float;float;float;float;float;float",0.12*sizeX,0.12*sizeY,0.88*sizeX,0.88*sizeY)	
	_struct(tD2D1_TEXT,"float;float;float;float",5,5,sizeX,sizeY)

	
	
	;DllCall(vt(pWDFactory,15),"str",fontFamilyName,"ptr",fontCollection,"int",fontWeight,"int",fontStyle,"int",fontStretch,"float",fontSize,"str",localeName,"ptr*",textFormat)	
	
	;ID2D1RenderTarget
	DllCall(vt(pRenderTarget,48),"ptr",pRenderTarget) ;start draw
	DllCall(vt(pRenderTarget,17),"ptr",pRenderTarget,"ptr",&tD2D1_RECT_F,"ptr",pBackgroundBrush) ;background
	DllCall(vt(pRenderTarget,18),"ptr",pRenderTarget,"ptr",&tD2D1_ROUNDED_RECT,"ptr",pBrush3,"float",2,"ptr",pStrokeStyle) ;rectangle
	DllCall(vt(pWDFactory,15),"str","Arial","ptr",0,"int",700,"int",1,"int",0,"float",13.0,"str","en-us","ptr*",textFormat)	
	DllCall(vt(pRenderTarget,27),"ptr",pRenderTarget,"str","Michael","uint",7,"ptr",textFormat,"ptr",&tD2D1_TEXT,"ptr",pTxtBrush,"uint",0,"unit",0) ;drawtext
	DllCall(vt(pRenderTarget,47),"ptr",pRenderTarget,"ptr",&tD2D1_RECT_F)
	DllCall(vt(pRenderTarget,49),"ptr",pRenderTarget,"uint64*",0,"uint64*",0) ;end draw
	

}

GUID(ByRef GUID, sGUID){ 
    VarSetCapacity(GUID,16,0)
    return DllCall("ole32\CLSIDFromString","wstr",sGUID,"ptr",&GUID)>= 0?&GUID:""
}


_struct(ByRef var,type="",param*){
	if type is Integer
    {
		Loop % VarSetCapacity(var,type,0)//4
			if param[A_Index]
				NumPut(param[A_Index],var,(A_Index-1)*4,"uint")
	}else{
		StringSplit,key,type,`;,%A_Space%
		VarSetCapacity(var,key0*4,0)
		loop %key0%
			if param[A_Index]
				NumPut(param[A_Index],var,(A_Index-1)*4,key%A_Index%)
	}	
	return &var
}

vt(p,n){
	return NumGet(NumGet(p+0,"ptr")+n*A_PtrSize,"ptr")
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.01 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

93 (изменено: serzh82saratov, 2019-03-07 16:12:31)

Re: AHK: Бегущая строка

В _rectangle повторно надо наверное не всё выполнять, это есть в примере nepter.

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

94

Re: AHK: Бегущая строка

Если знаешь autoit, то тогда проще будет:
https://autoit.de/index.php?thread/45155-direct2d-udf/

95

Re: AHK: Бегущая строка

Спасибо, примеры интересные.

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

96

Re: AHK: Бегущая строка

_D2D_RenderTarget_DrawGlyphRun.au3 красиво смотрится. Даже не верится что это в реальном времени, при 2% процессора.

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