Some ideas about new features are considered and eveyone is welcome to comment on new one as well as implement them.. :wink: ...and share results here of course.
-ivan
Some issues already:[*:25simobr] majkinetor said: I get empty box! ...details? ...ideas?Some features nice to have:[*:25simobr]Laszlo would like improved resizing and anchored magnified area! ...todoHere is the current starting point (was Fri, 29 Dec):
[edit][*:25simobr]Last is on-line at Autohotkey.net upload space
[*:25simobr]View source: sm.ahk.txt or sm.ahk.html (with gvim syntax highlighting)
[*:25simobr]Download: sm.ahk
(open will execute a temp file, ...hit Escape to terminate)...updated: 22nd April 2007
[/edit]
; "Screen Magnifier" - IntelliPoint clone? {{{
#SingleInstance ignore ; ignore script if already-running
#MaxHotkeysPerInterval 200 ; need that with the scrollwheel
Process, Priority, , High ; tell that to Windows Task Manager
OnExit GuiClose ; some clean up before leaving
hotkey, Shift, toggle_resize ; Script hotkey: resize by corner
hotkey, Alt, toggle_aliasing ; Script hotkey: antialiasing
hotkey, Space, toggle_follow ; Script hotkey: stick window
hotkey, Ctrl, toggle_pindown ; Script hotkey: stick area
hotkey, Escape, GuiClose ; Script hotkey: terminate script
;=============================================================== }}}
; Initialization: Global Variables {{{
; Execution parameters - - - - - - - - - - - - - - - - - - - - - -
delay := 10 ; display update intervals (ms)
follow := true ; follow mouse pointer - or not
pindown := 0 ; keep current zoom area coordinates
antialize := 0 ; less starcase
; Zoom parameters- - - - - - - - - - - - - - - - - - - - - - - - -
zoom := 2 ; initial zoom factor
ZOOMFX := 1.189207115 ; zoom factor (square square of 2)
ZOOMFXMAX := 8 ; zoom factor max
zooming := false
; Action resources - - - - - - - - - - - - - - - - - - - - - - - -
resizing := false ; zoom window resize in progress
dragFromX := 0 ; resizing corner reference point
dragFromY := 0 ; ...
stickX := 0 ; stuck window reference point
stickY := 0 ; ...
pinX := 0 ; stuck zoome area reference point
; Window coordinates - - - - - - - - - - - - - - - - - - - - - - -
wox := 0 ; zoom window origin x
wwMax := A_ScreenWidth ; max width
ww := 480 ; initial
wwMin := 32 ; min
woy := 0 ; zoom window origin y
whMax := A_ScreenHeight ; max height
wh := 200 ; initial ...
whMin := 16 ; min ...
wwD := 0 ; window Delta (mouse wheel)
whD := 0 ; ...
; Mouse pointer coordinates - - - - - - - - - - - - - - - - - - -
mx := 0 ; mouse x current position
my := 0 ; ...
mxp := mx ; previous
myp := my ; ...
; }}}
; Initialization: Zoom Window handles {{{
MouseGetPos, mx, my
; Zoom window always on top and starts way off screen
Gui, +AlwaysOnTop +Owner -Resize -ToolWindow +E0x00000020
Gui, Show, NoActivate W%ww% H%wh% X-1000 Y-1000, MagWindow
WinSet, Transparent, 254, MagWindow
Gui, -Caption
Gui, +Border
WinGet, src_id, id
src_frame := DllCall("GetDC", UInt, src_id)
WinGet, dst_id, id, MagWindow
dst_frame := DllCall("GetDC", UInt, dst_id)
DllCall( "gdi32.dll\SetStretchBltMode"
, "uint", dst_frame
, "int", 4*antialize)
; First Zoom Window display
SetTimer, repaint , %delay% ; schedule next repaint ;Gosub, repaint
Gosub, repaint
return
;=================================================================== }}}
; Event handlers: Mouse Wheel {{{
WheelUp:: ; zoom in
if zoom < %ZOOMFXMAX%
zoom *= %ZOOMFX%
zooming := true ; triggers update
return
WheelDown:: ; zoom out
if zoom > %ZOOMFX%
zoom /= %ZOOMFX%
zooming := true ; triggers update
return
+WheelDown:: ; larger
wwD = 32
whD = 32
return
+WheelUp:: ; smaller
wwD = -32
whD = -32
return
;=================================================================== }}}
; Hotkey handlers: follow, aliasing, GuiClose {{{
toggle_follow: ; follow or stick
if resizing OR pindown
return
if follow {
if(stickX != 0) OR (stickY != 0)
MouseMove, stickX, stickY
stickX := wox + ww/2
stickY := woy + wh/2
follow := false
}
else {
follow := true
MouseGetPos, stickX, stickY
MouseMove, wox + ww/2, woy + wh/2
}
return
toggle_aliasing: ; aliasing
antialize := 1-antialize
DllCall( "gdi32.dll\SetStretchBltMode"
, "uint", dst_frame
, "int", 4*antialize)
return
toggle_pindown: ; keep current zoomed area coordinates
if resizing
return
pindown := !pindown
return
toggle_resize: ; enter or leave resize by corner
if pindown
return
if !resizing
{
resizing := true
if follow {
; Move pointer to Zoom Window center
MouseMove, wox + ww/2, woy + wh/2
; Remember Zoom Window center
MouseGetPos, dragFromX, dragFromY
; Move to Zoom Window corner
MouseMove, dragFromX + ww/2, dragFromY + wh/2
}
else {
; Remember Zoom Area center
MouseGetPos, dragFromX, dragFromY
; Move pointer to Zoom Area corner
MouseMove, mx + ww/2/zoom, my + wh/2/zoom
}
}
else {
resizing := false
; Restore pointer position
MouseMove, dragFromX, dragFromY
}
return
GuiClose: ; clean up and terminate
DllCall("gdi32.dll\DeleteDC", UInt,dst_frame)
DllCall("gdi32.dll\DeleteDC", UInt,src_frame)
Process, Priority, , Normal
ExitApp
;=================================================================== }}}
; repaint: Zoom, follow, rescale and resize {{{
repaint:
CoordMode, Mouse, Screen
if !pindown {
MouseGetPos, mx, my
WinGetPos, wx, wy, ww, wh, MagWindow
; Resize by corner -----------------------------------------
if resizing
{
ww := 2 * (mx - dragFromX)
wh := 2 * (my - dragFromY)
if !follow { ; resizze area instead of window
ww *= zoom
wh *= zoom
}
; Make it look like pointer is still centered
mx := dragFromX
my := dragFromY
zooming := true ; triggers update
}
; Resize with mouse wheel ----------------------------------
else if (wwD != 0) OR (whD != 0)
{
ww += wwD
wh += whD
wwD := 0
whD := 0
zooming := true ; triggers update
}
clip_on_screen() ; keep zoom area on screen
}
; Update -------------------------------------------------------
if pindown OR zooming OR (mx != mxp) OR (my != myp)
{
clip_size() ; Keep Window min-max
clip_pos() ; Keep Window on screen
WinMove, MagWindow, ,wox, woy, %ww%, %wh%
DllCall( "gdi32.dll\StretchBlt"
, UInt, dst_frame ; destination frame
, Int, 2 ; ...x
, Int, 2 ; ...y
, Int, ww-6 ; ...width
, Int, wh-6 ; ...height
, UInt, src_frame ; source frame
, Int, mx - (ww/2 / zoom) ; ...x
, Int, my - (wh/2 / zoom) ; ...y
, Int, ww / zoom ; ...width
, Int, wh / zoom ; ...height
, UInt, 0xCC0020) ; dwRop (raster operation)
}
; Remember and schedule update ---------------------------------
mxp := mx
myp := my
return
;=================================================================== }}}
clip_on_screen() ; Keep zoom window area on screen {{{
{
global
if(mx < ww/2/zoom)
mx := ww/2/zoom
if(mx > A_ScreenWidth-(ww/2/zoom))
mx := A_ScreenWidth-(ww/2/zoom)
if(my < wh/2/zoom)
my := wh/2/zoom
if(my > A_ScreenHeight-(wh/2/zoom))
my := A_ScreenHeight-(wh/2/zoom)
}
; }}}
clip_size() ; Keep Zoom Window size within min-max limits {{{
{
global
if( ww < 0 )
ww *= -1
if( ww < wwMin )
ww := wwMin
if( ww > wwMax )
ww := wwMax
if( wh < 0 )
wh *= -1
if( wh < whMin )
wh := whMin
if( wh > whMax )
wh := whMax
}
; }}}
clip_pos() ; Keep Zoom Window on screen {{{
{
global
if follow { ; Window near mouse
wox := mx-ww/2
woy := my-wh/2
}
else { ; Window position fixed
wox := stickX-ww/2
woy := stickY-wh/2
}
if(wox < 0) ; window inside screen
wox = 0
if(wox > (A_ScreenWidth-ww))
wox := A_ScreenWidth-ww
if(woy < 0)
woy = 0
if(woy > (A_ScreenHeight-wh))
woy := A_ScreenHeight-wh
}
; }}}
RemoveToolTip: ; hide tooltips {{{
SetTimer, RemoveToolTip, Off
ToolTip
return
;=================================================================== }}}
; vim: syntax=ahk foldmethod=marker




